多组滚动window
Rolling window in multi groups
我有以下交易table:
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 分钟的滚动 window 函数来分离股票价格 buy/sells
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))]
所以至少我想要每个 buy/sell 计数,然后再对它们进行分组。但是我什至无法在不出现类型错误的情况下获得对 运行 的初始查询。
有人能指出我正确的方向吗?
补充问题
我知道必须对多个帐户执行滚动 sum/count,直到 运行 时间才知道。
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
我知道我可以将 table 转向:
time ticker side price qty ACCT123 ACCT456 ACC789 ERRORACCT123 TESTACCT23
---------------------------------
但是我可以使用滚动函数在 1 分钟的回溯期内对大小求和吗?
w: -00:01 00:00 +\: exec time from table
使用 exec 将允许您为要加入的时间间隔创建一对时间或时间戳。您还必须使用 \:
来执行每个左操作。
wj[w;`sym`time;table;(table;(count;`sym);(count;`sym))]
w 定义时间间隔——一对时间或时间戳;
window 联接中的 table 名称也必须使用 `.
作为符号传入
window w 必须是一对列表:
w: -00:01 00:00 +\: exec time from t
您还需要使用 wj1,因为您只想考虑进入 window.
时或之后的行
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))]
单子 lambda:
{`BUY`SELL!count each (group x)`BUY`SELL}
使用 group 来 return BUY 和 SELL 值的索引,并确保 BUY 和 SELL 出现在所有键中。
exec 创建一个 table:
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
我有以下交易table:
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 分钟的滚动 window 函数来分离股票价格 buy/sells
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))]
所以至少我想要每个 buy/sell 计数,然后再对它们进行分组。但是我什至无法在不出现类型错误的情况下获得对 运行 的初始查询。
有人能指出我正确的方向吗?
补充问题
我知道必须对多个帐户执行滚动 sum/count,直到 运行 时间才知道。
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
我知道我可以将 table 转向:
time ticker side price qty ACCT123 ACCT456 ACC789 ERRORACCT123 TESTACCT23
---------------------------------
但是我可以使用滚动函数在 1 分钟的回溯期内对大小求和吗?
w: -00:01 00:00 +\: exec time from table
使用 exec 将允许您为要加入的时间间隔创建一对时间或时间戳。您还必须使用 \:
来执行每个左操作。
wj[w;`sym`time;table;(table;(count;`sym);(count;`sym))]
w 定义时间间隔——一对时间或时间戳;
window 联接中的 table 名称也必须使用 `.
作为符号传入window w 必须是一对列表:
w: -00:01 00:00 +\: exec time from t
您还需要使用 wj1,因为您只想考虑进入 window.
时或之后的行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))]
单子 lambda:
{`BUY`SELL!count each (group x)`BUY`SELL}
使用 group 来 return BUY 和 SELL 值的索引,并确保 BUY 和 SELL 出现在所有键中。
exec 创建一个 table:
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