2017-10-11 102 views
0

如何有效計算q中面板數據間的相關性?如何計算kdb/q中的橫截面相關性

假設我有一個表:

我可以計算出每2個符號之間收益率的相關性
([] date:(...);sym:(...);return:(...)) 

一種方法是蠻力的方式只會是重複的符號的每個組合,使用科爾函數並將其添加到表中。有沒有辦法做到這一點,而不使用每個符號組合的'每個'?

回答

1

表中必須有其他約束:cor需要相同長度的參數。

q)s:`aapl`ibm`goog/symbols 
q)show t:asc flip`dat`sym`ret!flip(((`date$.z.z)+til 5)cross s),' 15?1000 
dat  sym ret 
------------------- 
2017.10.11 aapl 709 
2017.10.11 goog 369 
2017.10.11 ibm 988 
2017.10.12 aapl 224 
2017.10.12 goog 586 
2017.10.12 ibm 192 
2017.10.13 aapl 490 
2017.10.13 goog 55 
2017.10.13 ibm 465 
2017.10.14 aapl 51 
2017.10.14 goog 4 
2017.10.14 ibm 150 
2017.10.15 aapl 890 
2017.10.15 goog 99 
2017.10.15 ibm 558 

這裏我們有表按時間順序,對每個日期/符號對回報。使用select with a by clause獲得一個字典,其中的符號是鍵。

q)show d:select ret by sym from t 
sym | ret 
----| ------------------- 
aapl| 709 224 490 51 890 
goog| 369 586 55 4 99 
ibm | 988 192 465 150 558 

生產所有的符號對:

q)show p:raze s{x,/:y except x}\:s 
ibm aapl 
ibm goog 
aapl ibm 
aapl goog 
goog ibm 
goog aapl 

現在使用coreach-left每對關聯:

q)([pr:p]co:p{y[x 0;`ret] cor y[x 1;`ret]}\:d) 
pr  | co  
---------| ----------- 
ibm aapl| 0.7845974 
ibm goog| 0.1039863 
aapl ibm | 0.7845974 
aapl goog| -0.05331357 
goog ibm | 0.1039863 
goog aapl| -0.05331357 

它仍然是一個 '蠻力' 的解決方案 - 它把每一個對的符號 - 但迭代在Q-SQLadverb中,通常是最有效的迭代方式。