如何有效地计算q中面板数据的相关性?
我们假设我有一张 table :
([] date:(...);sym:(...);return:(...))
我可以计算每2个符号之间的回报相关性的一种方法是对每个符号组合进行迭代的强力方式,使用corr函数并将其添加到表中 . 有没有办法在不使用每个符号组合的'each'的情况下执行此操作?
表上必须有其他约束: cor 需要相同长度的参数 .
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
现在使用cor与each-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-SQL和adverb中,通常是最有效的迭代方式 .
1 回答
表上必须有其他约束:
cor
需要相同长度的参数 .这里我们按时间顺序排列表,每个日期/符号对都有一个返回值 . 使用select with a by clause获取带符号作为键的字典 .
生成所有符号对:
现在使用cor与each-left关联每对:
它仍然是一种“强力”解决方案 - 它将每对符号相关联 - 但迭代在Q-SQL和adverb中,通常是最有效的迭代方式 .