R data.table merge/full EXTER join with na.fill/nomatch基于公式

R data.table merge/full EXTER join with na.fill/nomatch基于公式,r,data.table,zoo,full-outer-join,R,Data.table,Zoo,Full Outer Join,我需要的是以有效的方式使用某种智能na.fill/nomatch执行完全外部连接。我已经使用循环完成了,但是我想使用矩阵代数或data.table操作来加速这个过程 以下数据是库存未结订单信息的样本,在询价未结订单和报价未结订单数据集之间执行完全外部联接。数据集A是请求,B是出价。两个数据集都存储原子顺序及其累计和。该任务是通过累计值将所有询价订单与报价订单进行匹配,反之亦然。 填充示例数据: price = c(11.25,11.26,11.35,12.5,14.2) amount = c(1

我需要的是以有效的方式使用某种智能na.fill/nomatch执行完全外部连接。我已经使用循环完成了,但是我想使用矩阵代数或data.table操作来加速这个过程

以下数据是库存未结订单信息的样本,在询价未结订单和报价未结订单数据集之间执行完全外部联接。数据集A是请求,B是出价。两个数据集都存储原子顺序及其累计和。该任务是通过累计值将所有询价订单与报价订单进行匹配,反之亦然。 填充示例数据:

price = c(11.25,11.26,11.35,12.5,14.2)
amount = c(1.2,0.4,2.75,6.5,15.2)
A <- data.table(ask_price = price, ask_amount = amount, ask_cum_amount = cumsum(amount), cum_value = cumsum(price*amount), ask_avg_price = cumsum(price*amount)/cumsum(amount))
price = c(11.18,11.1,10.55,10.25,9.7)
amount = c(0.15,0.6,10.2,3.5,12)
B <- data.table(bid_price = price, bid_amount = amount, bid_cum_amount = cumsum(amount), cum_value = cumsum(price*amount), bid_avg_price = cumsum(price*amount)/cumsum(amount))
price=c(11.25,11.26,11.35,12.5,14.2)
金额=c(1.2,0.4,2.75,6.5,15.2)

A再次将其与
A
合并,并将
B
roll
合并,以查找最后/下一个非NA价格

例如,关于这两种合并,请参见
bid\u avg\u price
的输出值:

B[merge(A, B, all = T), roll = Inf]
B[merge(A, B, all = T), roll = -Inf]

这将为您提供计算这些数量所需的所有信息。

您的公式使用
avg_price
price
这两者都不存在于任何
数据表中。你能澄清一下吗?@Arun,公式到计算ask_avg_price使用ask_,公式到计算bid_avg_price使用bid_,两个集合中只有cum_值字段是通用的,不应该在公式中以ask/bid作为前缀。谢谢,根据你的建议,我能够:1。用唯一的(c(A_键,B_键))连接A和B,2。对A和B执行自联接以获得上一个非NA和下一个非NA,3。合并已填充A和B的NA并获得预期结果。Cpu时间是杰出的。代码有15行长,看起来可读性不够。我认为它仍然可以改进。休息几周后,阅读起来会很困难。无论如何,谢谢你,获得了一些新技能@MusX例如,如果订单簿被划过(如在拍卖中),并且您找到了使填充量最大化的价格(非划过价格),我会理解此操作。但在这个例子中,这本书并没有交叉:最佳出价<最佳要求,这在连续的会话中是正常的。我错过了什么吗?@MatthewDowle,如示例中所示,订单簿中的请求/出价没有交叉,如果交叉,则不会在订单簿中列出,而是在过去的交易(已填写的订单)中列出。该操作的要点是通过它的cum值匹配ASK到bids和bids到ASK。此操作的结果是平均价格(cum_值)作为公式(ask_avg_price(cum_值)+bid_avg_price(cum_值))/2,此平均价格显示未结订单在其累积值中的分布。我很乐意听到关于我的逻辑的评论,这是一种没有金融知识背景的DIY。@MusX是的,一本交叉的书(bid>ask)是可能的,并且每天都可以观察到。。。在拍卖中(通常在流动性较低的股票上进行日内拍卖,或根据市场情况对所有股票进行收盘拍卖)。我想我明白你想做什么,但我不明白你为什么要这么做。拍卖的收盘价(非交叉价)与您描述的非常相似(但在拍卖书的交叉部分)。你确定你不想那样做吗?@MatthewDowle,1。我的假设是不可能出现交叉记账(我无法在比特币市场上观察到这种情况——类似于外汇兑换)。2.原因:我想使用平均价格(cum_值)作为买入/卖出信号的指标/因子。下面的图表与我的逻辑密切相关:X轴:价格,Y轴:累计值,橙色线:出价平均价格,蓝色线:出价平均价格,绿色线:过去的交易-忽略这一点,在图表上只有出价平均价格和出价平均价格,两者都没有平均价格。
avg_price["current NA"] <- cum_value["last non NA"]/cum_value["current NA"] * avg_price["last non NA"] + (1-cum_value["last non NA"]/cum_value["current NA"]) * price["next non NA"]
cum_amount["current NA"] <- cum_value["current NA"] / avg_price["current NA"]
D <- data.table(
  cum_value = c(1.677,8.337,13.5,18.004,49.2165,115.947,130.4665,151.822,268.222,346.3065),
  ask_price = c(NA,NA,11.25,11.26,11.35,NA,12.5,NA,NA,14.2),
  ask_amount = c(NA,NA,1.2,0.4,2.75,NA,6.5,NA,NA,15.2),
  ask_cum_amount = c(0.149066666666667,0.741066666666667,1.2,1.6,4.35,9.66496172396059,10.85,12.3126600707381,20.4097766460076,26.05),
  ask_avg_price = c(11.25,11.25,11.25,11.2525,11.31414,11.9966331281534,12.02456,12.3305605066459,13.1418390633132,13.29392),
  bid_price = c(11.18,11.1,NA,NA,NA,10.55,NA,10.25,9.7,NA),
  bid_amount = c(0.15,0.6,NA,NA,NA,10.2,NA,3.5,12,NA),
  bid_cum_amount = c(0.15,0.75,1.23858478466587,1.66517233847558,4.6230572556498,10.95,12.3652404387114,14.45,26.45,NA),
  bid_avg_price = c(11.18,11.116,10.8995364444444,10.8120940902022,10.6458772362927,10.58877,10.5510685899445,10.50671,10.14072,NA)
)
print(D)
B[merge(A, B, all = T), roll = Inf]
B[merge(A, B, all = T), roll = -Inf]