2013-08-19 56 views
0

我需要的是以一種有效的方式完成一些智能na.fill/nomatch的完全外連接。我已經使用循環完成了它,但我想使用矩陣代數或data.table操作來加速此過程。R data.table合併/全外連接與基於公式的na.fill/nomatch基於公式

以下數據是庫存未結訂單信息的樣本,在詢問未結訂單和未結訂單的數據集之間執行完全外連接。數據集是問,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)) 

常規的全外連接,它的結果:

setkey(A, cum_value) 
setkey(B, cum_value) 
C <- merge(A,B,all=TRUE) 
print(C) 

na.fill/NOMATCH 公式,每一行(問或投標),其中cum_value不匹配(請記住,除cum_value以外的其他所有字段均與ask or bid相關):

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) 

注意的是,在預期結果最後NA仍然爲NA,這是因爲相反的順序無法匹配,因爲市場深度不夠滿足不惜任何代價的順序。

是否有可能使用矩陣代數或data.table操作或任何其他有效的方法來避免在整個數據集上循環來獲得預期結果?

在此先感謝

+0

你的公式使用'avg_price'和'price'這兩者都不存在於你的'data.table'中。你能澄清嗎? – Arun

+0

@Arun,計算公式ask_avg_price使用ask_ *,公式計算bid_avg_price使用bid_ *,只有cum_value字段對於兩個集合都是通用的,不應以公式中的詢問/出價爲前綴。 – jangorecki

回答

1

AB再次合併其與roll找到最後一個/下非NA價格。

E.g.看到bid_avg_price輸出值這兩個合併:

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

這應該給你你需要計算這些數量中的所有信息。

+0

謝謝,使用你的建議,我能夠:1.以獨特的方式加入A和B(c(A_key,B_key)),2.對A和B執行自連接以獲得prev非NA和下一個非NA ,3.合併已填充NA的A和B並獲得預期結果。 CPU時間非常出色。代碼長15行,看起來不夠可讀。我認爲它還是可以改進的。休息幾周後,閱讀起來很難。無論如何,感謝一些新技能! – jangorecki

+0

@MusX例如,如果交易訂單已被越過(例如在拍賣中),並且您發現最大化填充量(不交叉價格)的價格,那麼我會理解此操作。但是在這個例子中,這本書並沒有跨越:最佳出價<最佳問題,正如連續會議一樣。我錯過了什麼嗎? –

+0

@MatthewDowle,就像在這個例子中,訂單簿中的詢問/出價沒有交叉,如果交叉,他們將不會在訂單簿中列出,而是在過去的交易(填充訂單)中列出。操作要點是要求出價和出價要求出價和出價。此操作產生的結果是avg_price(cum_value),如公式(ask_avg_price(cum_value)+ bid_avg_price(cum_value))/ 2,此avg_price顯示未結訂單在其累計值中的分配。我很樂意聽到關於我的邏輯的評論,這是一種沒有金融知識背景的DIY。 – jangorecki