多组滚动窗口

时间:2018-04-10 12:46:14

标签: kdb

我有以下交易表:

  time ticker side price qty
  --------------------------
  2018.01.01T13:00:20 AAPL BUY  10.0  100
  2018.01.01T13:01:30 AAPL SELL 12.0  300
  2018.01.01T13:01:45 AAPL BUY  11.0  500  
  2018.01.01T13:02:13 AAPL BUY  10.5  100
  2018.01.01T13:05:00 AAPL SELL 13.0  200

我需要一个滚动窗口功能,回顾1分钟,以分离买入/卖出的股票价格

  time ticker BUYs SELLs TOTAL
  --------------------------------
  2018.01.01T13:00:20 AAPL 1 0 1
  2018.01.01T13:01:30 AAPL 0 1 1
  2018.01.01T13:01:45 AAPL 1 1 2
  2018.01.01T13:02:13 AAPL 1 1 2 
  2018.01.01T13:05:00 AAPL 0 1 1

我决定使用“wj”功能,因为滚动功能适合我的目的。但是我无法让它发挥作用:

  w: -00:01 00:00 +:/ select time from table
  wj[w;'ticker'time;table;(table;(count;ticker);(count;ticker))]

所以至少我想先计算每次买/卖,然后再将它们分组。但是我甚至无法在没有出现类型错误的情况下运行初始查询。

有人能指出我正确的方向吗?

其他问题

我知道必须对多个帐户执行滚动总和/计数,这在运行时才会知道。

  time ticker side price qty account
  ----------------------------------
  2018.01.01T13:00:20 AAPL BUY  10.0  100 ACCT123
  2018.01.01T13:01:30 AAPL SELL 12.0  300 ACCT456 
  2018.01.01T13:01:45 AAPL BUY  11.0  500 ACCT789  
  2018.01.01T13:02:13 AAPL BUY  10.5  100 ERRORACCT123
  2018.01.01T13:05:00 AAPL SELL 13.0  200 TESTACCT123

我知道我可以将表格转移到:

  time ticker side price qty ACCT123 ACCT456 ACC789 ERRORACCT123 TESTACCT23
  ---------------------------------

但我可以使用滚动功能在1分钟的回顾期间对大小求和吗?

2 个答案:

答案 0 :(得分:3)

窗口w必须是一对列表:

   w: -00:01 00:00 +\: exec time from t

您还需要使用wj1,因为您只想在进入窗口时或之后考虑行。

http://code.kx.com/q/ref/joins/#wj-wj1-window-join

    q)table,'exec side from wj1[w;`ticker`time;table;(table;({`BUY`SELL!count each (group x)`BUY`SELL};`side))]

monadic lambda:         {`BUY`SELL!count each (group x)`BUY`SELL}

使用group返回BUY和SELL值的索引,并确保所有键中都有BUY和SELL。

exec创建一个表:

     q)exec side from wj1[w;`ticker`time;table;(table;({{`BUY`SELL!count each x`BUY`SELL}group x};`side))]
    BUY SELL
    --------
     1   0
     0   1
     1   1
     2   1
     0   1

然后我们使用join each来获得最终结果:

    q)update TOTAL:BUY+SELL from table,'exec side from wj1[w;`ticker`time;table;(table;({`BUY`SELL!count each (group x)`BUY`SELL};`side))]
    time                          ticker side price qty BUY SELL TOTAL
    ------------------------------------------------------------------
    2018.01.01D13:00:20.000000000 AAPL   BUY  10    100 1   0    1
    2018.01.01D13:01:30.000000000 AAPL   SELL 12    300 0   1    1
    2018.01.01D13:01:45.000000000 AAPL   BUY  11    500 1   1    2
    2018.01.01D13:02:13.000000000 AAPL   BUY  10.5  100 2   1    3
    2018.01.01D13:05:00.000000000 AAPL   SELL 13    200 0   1    1

根据侧面的总和数量,以下内容更容易: 首先使用向量条件更新两个新列,然后使用wj1对它们求和。

http://code.kx.com/q/ref/lists/#vector-conditional

    q)wj1[w;`ticker`time;table;(update BUYQUANTITY:?[`BUY=side;qty;0],SELLQUANTITY:?[`SELL=side;qty;0]from table;(sum;`BUYQUANTITY);(sum;`SELLQUANTITY))]
    time                          ticker side price qty BUYQUANTITY SELLQUANTITY
    ----------------------------------------------------------------------------
    2018.01.01D13:00:20.000000000 AAPL   BUY  10    100 100         0           
    2018.01.01D13:01:30.000000000 AAPL   SELL 12    300 0           300         
    2018.01.01D13:01:45.000000000 AAPL   BUY  11    500 500         300         
    2018.01.01D13:02:13.000000000 AAPL   BUY  10.5  100 600         300         
    2018.01.01D13:05:00.000000000 AAPL   SELL 13    200 0           200         

答案 1 :(得分:1)

w: -00:01 00:00 +\: exec time from table

使用exec将允许您为要加入的时间间隔创建一对时间或时间戳。您还必须使用\:执行每个左操作。

wj[w;`sym`time;table;(table;(count;`sym);(count;`sym))]

w定义时间间隔 - 一对时间或时间戳;

窗口连接中的表名也必须使用`。

作为符号传入