2014-01-11 3 views
1

Я пытаюсь создать фондовый индекс, и я использую Q для этой цели. Как вы, наверное, можете сказать, я очень новичок в этом. В то время как я построил его в SQL, это занимает слишком много времени, чтобы обработать, поэтому мое обращение к Q.KDB/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. Обработки до сих пор (благодаря другим дружны пользователям):

    • Я рассчитывается, сколько имеет каждое изменение цены акций от в прошлый раз цена была зафиксирована

      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

Так, по существу, то, что я хочу, чтобы в конечном итоге, что-то похожее на ниже:

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 

Спасибо за вашу помощь ,

Dan

ответ

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 

Это должно решить вашу проблему ,
Последняя строка, похоже, не соответствует. Я взял сектора в качестве первичного ключа. Вы должны иметь возможность сопоставлять последнюю строку, изменяя первичный ключ на сектора/тикеры.

+0

Спасибо за помощь акаш. Это больше, чем я когда-либо получал. Я изучаю, как правильно вычислять последнюю строку, еще раз спасибо за указание некоторых действительно полезных функций. – user1158959

Смежные вопросы