我必须组合两个具有交易和报价信息的R数据帧。类似于联接,但基于以秒为单位的时间戳。我需要将每笔交易与最新报价相匹配。报价比交易多得多。
我有这个带有股票报价的表格。时间戳以秒为单位:
+--------+-----------+-------+-------+
| Symbol | Timestamp | bid | ask |
+--------+-----------+-------+-------+
| IBM | 10 | 132 | 133 |
| IBM | 20 | 132.5 | 133.3 |
| IBM | 30 | 132.6 | 132.7 |
+--------+-----------+-------+-------+
这些是交易:
+--------+-----------+----------+-------+
| Symbol | Timestamp | quantity | price |
+--------+-----------+----------+-------+
| IBM | 25 | 100 | 132.5 |
| IBM | 31 | 80 | 132.7 |
+--------+-----------+----------+-------+
我认为本机 R 函数或 dplyr 可以做到这一点 - 我已经将两者用于基本目的,但不确定如何在这里进行。有什么想法吗?
所以 25 秒的交易应该与 20 秒的报价匹配,交易 @31 匹配报价 @30,如下所示:
+--------+-----------+----------+-------+-------+-------+
| Symbol | Timestamp | quantity | price | bid | ask |
+--------+-----------+----------+-------+-------+-------+
| IBM | 25 | 100 | 132.5 | 132.5 | 133.3 |
| IBM | 31 | 80 | 132.7 | 132.6 | 132.7 |
+--------+-----------+----------+-------+-------+-------+
考虑以 10 为增量合并计算字段。具体来说,计算两个数据集中 10 的倍数的列,并使用 Symbol 合并该字段。
下面的 transform
和 within
用于分配和取消分配帮助程序字段 mult10。在此用例中,这两个基本函数是可互换的:
final_df <- transform(merge(within(quotes, mult10 = floor(Timestamp / 10) * 10),
within(trades, mult10 = floor(Timestamp / 10) * 10),
by=c("Symbol", "mult10"),
multi10 = NULL)
现在,如果 10 倍数不足以满足您的需求,请调整到您需要的水平,例如 15、5、2 等。
within(quotes, mult10 <- floor(Timestamp / 15) * 15)
within(quotes, mult10 <- floor(Timestamp / 5) * 5)
within(quotes, mult10 <- floor(Timestamp / 2) * 2)
更重要的是,您可能需要分别对两个数据集使用反向、floor
或ceiling
来计算报价时间戳的最高倍数和交易时间戳的最低倍数:
within(quotes, mult10 <- ceiling(Timestamp / 15) * 15)
within(trades, mult10 <- floor(Timestamp / 5) * 5)