如何使用FIFO方法计算股票交易的实现盈亏?
我在找一个Python插件,可以用FIFO(先进先出)的方法来计算一些股票交易的实际盈亏。
举个例子,假设我们有以下三笔微软(MSFT)的交易:
买入75股MSFT,价格25.10
买入50股MSFT,价格25.12
卖出100股MSFT,价格25.22
卖出100股的价格25.22会先和买入的75股(价格25.10)完全抵消,然后再和买入的50股(价格25.12)部分抵消,也就是说:
实际盈亏 = 75 * (25.22 - 25.10) + 25 * (25.22 - 25.12) = $ 11.50
剩余的持仓情况是:
买入25股MSFT,价格25.12
3 个回答
有一个不太为人所知的Python包叫做 accfifo,它在处理FIFO(先进先出)会计方面表现得相当不错。你可以通过命令 pip install accfifo
来安装它,并用它来计算实际的盈亏和未平仓的头寸。
from accfifo import Entry
# Create FIFO queue entry for each trade
# +75 MSFT @25.10
# +50 MSFT @25.12
# -100 MSFT @25.22
fifo = FIFO([Entry(+75, 25.10), Entry(+50, 25.12), Entry(-100, 25.22)])
对于这个队列,你可以计算出未平仓的数量:
>>> fifo.stock
25
或者如果你想知道剩余股票是以什么价格买入的:
>>> fifo.inventory
deque([25 @25.12])
实际的盈亏可以使用 fifo.trace
中的数据来计算:
>>> fifo.trace
[[75 @25.1, -75 @25.22], [25 @25.12, -25 @25.22]]
>>> sum([entry.price * entry.quantity for step in fifo.trace for entry in step])
-11.5
这与原作者的计算方法是一致的。
没有Python,但有一个叫做R的项目,其中的blotter模块——它是更大项目TradeAnalytics的一部分,这个项目在R-Forge上运行,正好可以满足这个需求。
我最近在工作中需要用C++实现其中的一部分功能,所以我参考了blotter的代码来帮助我进行C++的移植工作。(因为这是在工作上做的,所以没有公开的C++代码,抱歉。)
这在Python里应该很容易自己写出来。“FIFO”是“先进先出队列”的缩写。买入的东西会被放在队列的后面,而卖出则是从队列的前面取走买入的东西(或者是其中的一部分)。
Python里的collection.deque(双端队列)就是你需要用来实现这个功能的工具。