如何有效地计算q中面板数据的相关性?
我们假设我有一张桌子:
([] date:(...);sym:(...);return:(...))
我可以计算每2个符号之间的回报相关性的一种方法是对每个符号组合进行迭代的强力方式,使用corr函数并将其添加到表中。有没有办法做到这一点,而不使用'每个'对于每个符号组合?
答案 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
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