在金融领域,计算盈亏总是(大部分情况下)使用 FIFO 规则完成。
即:买入 10 20 美元,卖出 5 美元 @22 美元,买入 5 美元 21 美元,卖出 10 美元 @23,必须记录为
BUY 10 for $20 date1
BUY 5 for $21 date3
并分别
SELL 5 @ $22 date2
SELL 10 @ $23 date4
现在您要做的就是根据 FIFO 规则将它们配对并将中间投资组合写入数据库:
portfolios AFTER date
date1 10 profit/loss $0 avg-open $20
date2 5 profit/loss +$10 avg-open $20
date3 10 protit/loss +$10 avg-open $20.50
date4 0 profit/loss +$35 avg-open $0
操作一一:date1
我们以平均开盘价$20买入后。从date1
到date2
,我们卖出了一半的股票,从中获利,5 * ($22 - $20 <- avg-open) = $10
在该交易之后,还剩下 5 只证券,平均开盘价为 20 美元。
从我们囤积 5date2
只date3
证券开始,盈亏保持不变,但平均开盘价上涨至 20.50 美元(20 美元 5 美元 + 21 美元 5 美元)。
最后,你将它们全部卖掉,利润10 * ($23 - $20.50) = $25
加上之前的 10 美元,即 35 美元。
总而言之,您可以记录单笔交易 ( BUY
/ SELL
),然后即时计算投资组合、平均开盘价和损益。
或者,您可以将投资组合连同迄今为止的损益和增量更新的平均开盘价一起存储。
我不建议两者都做(调试目的除外),因为这可能会给您带来数据级别的不一致,这是令人讨厌的。如果这样做,请选择其中一个表示作为主表示,并(重新)计算另一个以防出现不一致。
只是一个建议。