我想从交易表中创建一个五个输入的移动总和。IE;每一行应该是先前交易的大小的总和。障碍是从那5行中的ID掉下来,只是掉落了最高和最低的排。
这是可能的吗?
rd
我认为此功能将起作用
q)trade:([]price:100?100f;size:100?100)
q)w:{(til[count z]-m)+x each flip reverse prev[m:y-1;z]}
q)update top:size w[{x?max x};5;price],bot:size w[{x?min x};3;price],ms:5 msum size,rms:(5 msum size)-((size w[{x?max x};5;price])+(size w[{x?min x};5;price])) from trade
price size top bot ms rms
------------------------------
64.14975 70 70 70 70 -70
90.82711 36 36 70 106 0
97.96094 12 12 70 118 36
30.77491 97 12 97 215 106
36.52273 92 12 97 307 198
95.91177 99 12 97 336 227
41.21866 45 12 92 345 236
63.3041 83 99 45 416 220
57.52693 94 99 45 413 222
0.9011743 8 99 8 329 222
14.48057 97 83 8 327 236
77.06132 52 52 8 334 274
36.96114 66 52 97 317 257
11.75355 24 52 24 247 187
92.34386 60 60 24 299 215
40.15936 69 60 24 271 187
56.19037 8 60 69 227 143
72.4948 62 60 69 223 139
81.12026 95 60 8 294 165
20.86614 59 95 59 293 139
功能w
将允许选择和去除与最高和最小价格相对应的尺寸。这是在更新中完成的(msum size) - (top bot)。不幸的是,第一个元素存在问题,如果我找到一个问题,我会用解决方案发表评论。
看起来您应该能够使用带有自定义功能的滑动窗口进行此操作:
q)func:{sum[x] - min[x] + max[x]}
q)swin:{[f;w;s] f each { 1_x,y }[w#0;s]}
q)swin[func; 5; til 1000]
例如。
另一种方法(通过sym):
q)t:([]sym:20?`a`b`c;px:20?1.0;sz:20?1000)
q)update msz:{sum((),x`sz)@-1_1_iasc(),x`px}each{-5 sublist'x,'y}[([]px;sz)] by sym from t
sym px sz msz
-----------------------
c 0.4707883 908 0
a 0.6346716 360 0
b 0.9672398 522 0
a 0.2306385 257 0
a 0.949975 858 360
a 0.439081 585 945
c 0.5759051 90 0
c 0.5919004 683 90
c 0.8481567 90 773
b 0.389056 869 0
b 0.391543 468 468
a 0.08123546 959 1202
b 0.9367503 221 689
c 0.2782122 694 1681
c 0.2392341 934 1467
a 0.1508133 865 1707
a 0.1567317 344 1794
b 0.9785 997 1211
a 0.7043314 314 1794
b 0.9441671 580 1269