考虑下表:
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