先进先出pnl在kdb/q中的实现



考虑下表:

数量
Id 动词价格
1 购买 10.0
2 卖出 5 11.0
购买 4 10.0
4 卖出 3 12.0
5 卖出 8 9.0
购买 7 8.0

这里有一种方法。它比我想要的更复杂,但它涵盖了许多中间步骤,并生成了您建议的一种类型的分配矩阵。可能需要一些边缘案例和调整,但这至少会给你一些想法。

t:([]id:1+til 6;side:`b`s`b`s`s`b;qty:6 5 4 3 8 7;px:10 11 10 12 9 8f);
t:update pos:sums delta from update delta:qty*(1;-1)side=`s from t;
f:{signum[x]*x,{@[(-). z;x;:;abs[y]-sum z 1]}[y;x y]{(x;deltas y&sums x)}[abs where[signum[x]<>signum x y]#x;abs x y]};
t:update fifo:deltas[id!delta;f[id!delta;id]] from t;
q)update pnl:sum each(id!px)*/:fifo from t
id side qty px delta pos fifo                     pnl
-----------------------------------------------------
1  b    6   10 6     6   1 2 3 4 5 6!-6 5 0 1 0 0 7
2  s    5   11 -5    1   1 2 3 4 5 6!0 0 0 0 0 0  0
3  b    4   10 4     5   1 2 3 4 5 6!0 0 -4 2 2 0 2
4  s    3   12 -3    2   1 2 3 4 5 6!0 0 0 0 0 0  0
5  s    8   9  -8    -6  1 2 3 4 5 6!0 0 0 0 6 -6 6
6  b    7   8  7     1   1 2 3 4 5 6!0 0 0 0 0 0  0

最新更新