KDB / Q建立股市指数

时间:2014-01-11 21:12:44

标签: kdb

我正在尝试建立一个股票指数,我正在使用Q来达到目的。你可能会说,我对此非常陌生。虽然我在SQL中构建它,但是处理时间太长,因此我求助于Q。

到目前为止的设置如下:

  1. 表;将数据添加到表中,对其进行排序:

    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
    
  2. 到目前为止的处理(感谢其他友好的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
      
  3. 它的外观:

    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
    
  4. 我想做什么:

    我想计算一个扇区索引,它在组件发生变化时会发生变化;为了做到这一点,我需要计算一个除数列和实际的索引列。我试图实现的逻辑如下:

    • 如果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
  5. 基本上,我最终想要的是类似于下面的内容:

        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
    

    感谢您的帮助,

1 个答案:

答案 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  

这可以解决您的问题 最后一行似乎不匹配。我已将扇区作为主键。您应该能够通过将主键更改为扇区/代码来匹配最后一行。