自定义移动总和

  • 本文关键字:移动 自定义 kdb
  • 更新时间 :
  • 英文 :


我想从交易表中创建一个五个输入的移动总和。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

最新更新