作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑下表:
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)
最好在您的数据库中分别维护buys
和sells
交易/填写:
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/
我有一个名为 pnl 的面板,其中包含更多面板,称它们为 p。现在用户可以为每个面板 p 选择一种颜色。 然后我想确定面板 pnl 中每个面板 p 的颜色。 我使用了一个 foreach 循环,它看起
我是一名优秀的程序员,十分优秀!