gpt4 book ai didi

fifo - KDB:先进先出方式的pnl

转载 作者:行者123 更新时间:2023-12-05 03:14:22 27 4
gpt4 key购买 nike

考虑下表:

Id Verb Qty Price
`1 Buy 6 10.0
`2 Sell 5 11.0
`3 Buy 4 10.0
`4 Sell 3 11.0
`5 Sell 8 9.0
`6 Buy 1 8.0
etc...

我想要的是将 PNL 与每笔交易相关联,并根据 FIFO(先进先出)进行计算。因此,对于 Id=`1,我希望 PNL 为 -6*(10.0) +5*(11.0) + 1*(11.0) = +$6.00,对于 Id=`3,Pnl 为 -4*(10.0)+2*(11.0)+(2*9.0) = $0,等等

通俗地说,对于大小为 6 的第一个买单,我想用前 6 个卖单来抵消,对于大小为 4 的第二个买单,用随后的 4 个卖单来抵消包含在 buy-6 订单的盈亏计算中。

有什么建议吗?

最佳答案

从您的示例中获取数据:

txn:([] t: til 6; side:`Buy`Sell`Buy`Sell`Sell`Buy; qty:6 5 4 3 8 1; px: 10.0 11.0 10.0 11.0 9.0 8.0)

最好在您的数据库中分别维护buyssells 交易/填写:

buys: select from txn where side=`Buy
sells: select from txn where side=`Sell

我们需要的功能 [1]:

/ first-in first-out allocation of bid/buy and ask/sell fills
/ returns connectivity matrix of (b)id fills in rows and (a)sk fills in columns
fifo: {deltas each deltas sums[x] &\: sums[y]};

/ connectivity list from connectivity matrix
lm: {raze(til count x),''where each x};

/ realized profit & loss
rpnl: {[b;s]
t: l,'f ./: l:lm (f:fifo[exec qty from b;exec qty from s])>0;
pnl: (select bt:t, bqty:qty, bpx:px from b@t[;0]),'(select st:t, sqty:qty, spx:px from s@t[;1]),'([] qty: t[;2]);
select tstamp: bt|st, rpnl:qty*spx-bpx from pnl
}

运行:

q)rpnl[buys;sells]
tstamp rpnl
-----------
1 5
3 1
3 2
4 -2
5 1

根据我的时间安排,应该比下一个最佳解决方案快约 2 倍,因为它很好地矢量化了。


脚注:

fifo 函数是来自Q for Mortals的教科书示例.在您的情况下,它看起来像这样:

q)fifo[exec qty from buys;exec qty from sells]
5 1 0
0 2 2
0 0 1

lm 函数告诉哪些买卖对被交叉(非零填充)。更多背景信息:[kdb+/q]: Convert adjacency matrix to adjacency list

q)lm fifo[exec qty from buys;exec qty from sells]>0
0 0
0 1
1 1
1 2
2 2

rpnl 的第一行是上面两个概念的组合:

q)t: l,'f ./: l:lm (f:fifo[exec qty from buys;exec qty from sells])>0;
0 0 5
0 1 1
1 1 2
1 2 2
2 2 1

关于fifo - KDB:先进先出方式的pnl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25490783/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com