如何计算kdb / q的横截面相关性

时间:2017-10-11 15:01:21

标签: kdb

如何有效地计算q中面板数据的相关性?

我们假设我有一张桌子:

([] date:(...);sym:(...);return:(...))

我可以计算每2个符号之间的回报相关性的一种方法是对每个符号组合进行迭代的强力方式,使用corr函数并将其添加到表中。有没有办法做到这一点,而不使用'每个'对于每个符号组合?

1 个答案:

答案 0 :(得分: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,通常是最有效的迭代方式。