如何计算kdb中的尾随叠梁损失



我已经尝试过使用循环实现的标准方法。如果对tick数据进行处理,这将需要很长时间,因为通过的px列表将是巨大的。有没有一种不使用循环的有效方法。可能以某种方式使用列表?

tlstop: {[ls; entry; loss; pxs]
origentry: entry;
i:0;
curloss: 0f;
exitpx: 0n;
while[(i<count pxs) and (curloss>loss);
        curpx: pxs[i];
        curpnl: $[ls=`l; curpx-entry; entry-curpx];
        exitpx: $[curpnl<=loss; curpx; exitpx];  
        entry: $[curpnl>curloss; curpx; entry];
        curloss: curpnl;
        i: i+1;
];
exitpx: $[exitpx=0n; last pxs; exitpx];
ans: $[ls=`l; exitpx-origentry; origentry-exitpx];
ans
};
/tlstop[`s; 100.0; -2.0; (99 98 97 96 93)]

正如您在下面看到的,在大约三行非常详细的q中习惯地实现您的算法是微不足道的,如果您想惹恼您的同事,可以用一行简洁的q。

q)pxs:100 101 102 101 100 99 98 //Our price ticks.
q)pxs
100 101 102 101 100 99 98
q)entry:({max (x;y)}) pxs //Calculate entry prices for each tick.
q)entry
100 101 102 102 102 102 102
q)(pxs-entry) <= -2 //Determine tick where stop loss condition is triggered.
0000111b
q)first pxs where (pxs-entry) <= -2 //Calculate the price at which we would exit.
100
q)first pxs where (pxs-entry) <= -5 //We get null (0N) if stop loss is not triggered.
0N

我应该指出,只有当你正在进行研究时,这才是好的,如果你想计算实时交易系统的止损,这是而不是的方法。它的运行时间和内存会随着滴答声的数量线性增加,所以到一天结束时,它会很慢,占用内存。

真正做到这一点的方法是为每个未平仓合约维护一个进场价格表,并设置一个函数,每当你的股票行情机工厂将勾号(当然是异步的)推送到你的应用程序时,该函数就会运行。此功能可以更新您的入场价格,也可以向您的交易经理推送退出活动。关键是运行时和内存的复杂性应该是常量相对于您处理的节拍数。

矢量化。。。

/ trailing stop for long
{[stoplossAtStart;prices]
previous:prev prices;
xtreme:maxs previous;
sl:stoplossAtStart + sums (0|0,1_deltas[prices]) * 0b,1_(&). prices>/:(previous;xtreme);
sl
};
/ trailing stop for short   
{[stoplossAtStart;prices]
previous:prev prices;
xtreme:mins previous;
sl:stoplossAtStart + sums (0&0,1_deltas[prices]) * 0b,1_(&). prices</:(previous;xtreme);
sl
};

最新更新