我正在尝试建立一个股票指数,我正在使用Q来达到目的。你可能会说,我对此非常陌生。虽然我在SQL中构建它,但是处理时间太长,因此我求助于Q。
到目前为止的设置如下:
表;将数据添加到表中,对其进行排序:
tickers:`ibm`bac`dis`gs`ibm`gs`dis`bac
pxs:100 50 30 250 110 240 45 48
dates:2013.05.01 2013.01.05 2013.02.03 2013.02.11 2013.06.17 2013.06.21 2013.04.24 2013.01.06
sectors:`auto`money`funny`money`auto`money`funny`money
trades:([sectors;tickers;dates];pxs)
`sectors`dates`tickers xasc `trades
到目前为止的处理(感谢其他友好的SO用户):
我已经计算出每个股票价格与之前的价格记录相比有多少变化
trades: update delta:{0,1_deltas x}pxs by tickers from trades
我已经计算了行业指数组成部分的总市值
trades: update idxmv:sums[?[delta<>0;delta;pxs]] by sectors from trades
它的外观:
sectors tickers dates | pxs delta idxmv
--------------------------| ---------------
auto ibm 2013.05.01| 100 0 100
auto ibm 2013.06.17| 110 10 110
funny dis 2013.02.03| 30 0 30
funny dis 2013.04.24| 45 15 45
money bac 2013.01.05| 50 0 50
money bac 2013.01.06| 48 -2 48
money gs 2013.02.11| 250 0 298
money gs 2013.06.21| 240 -10 288
我想做什么:
我想计算一个扇区索引,它在组件发生变化时会发生变化;为了做到这一点,我需要计算一个除数列和实际的索引列。我试图实现的逻辑如下:
delta != 0
,则divisor = the last value of the divisor, in the same sector
delta != 0
,则index = idxmv % the value of the divisor computed above
delta = 0
,则index = the last value of the index, in the same sector
delta = 0
,则divisor = idxmv % the value of the index computed above
,其中索引的初始值为100;所有部门的起始值均为100 基本上,我最终想要的是类似于下面的内容:
sectors tickers dates | pxs delta idxmv divisor index
--------------------------| ------------------------------
auto ibm 2013.05.01| 100 0 100 1 100
auto ibm 2013.06.17| 110 10 110 1 110
funny dis 2013.02.03| 30 0 30 0.30 100
funny dis 2013.04.24| 45 15 45 0.30 150
money bac 2013.01.05| 50 0 50 0.50 100
money bac 2013.01.06| 48 -2 48 0.50 96
money gs 2013.02.11| 250 0 298 3.10 96
money gs 2013.06.21| 240 -10 288 3.10 92.78
感谢您的帮助,
丹
答案 0 :(得分:2)
trades1:update index:{100f,1_count[x]#0n}[delta] by sectors from trades; / starting value of index as 100
trades1:update divisor:?[delta=0;idxmv%index;0n] by sectors from trades1; / divisor=y%z when delta=0
trades1:update divisor:?[delta<>0;fills divisor;divisor] by sectors from trades1; / divisor=last divisor when delta <> 0
trades1:update index:?[delta<>0;idxmv%divisor;index] by sectors from trades1; / index=i%d when delta <>0
trades1:update index:?[delta=0;fills index;index] by sectors from trades1 / index=last index when delta=0
trades1:update divisor:?[delta=0;idxmv%index;divisor] by sectors from trades1; /divisor=y%z when delta=0
这可以解决您的问题 最后一行似乎不匹配。我已将扇区作为主键。您应该能够通过将主键更改为扇区/代码来匹配最后一行。