如何使用FIFO方法计算股票交易的实现盈亏?

9 投票
3 回答
14016 浏览
提问于 2025-04-16 00:24

我在找一个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 个回答

2

有一个不太为人所知的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

这与原作者的计算方法是一致的。

3

没有Python,但有一个叫做R的项目,其中的blotter模块——它是更大项目TradeAnalytics的一部分,这个项目在R-Forge上运行,正好可以满足这个需求。

我最近在工作中需要用C++实现其中的一部分功能,所以我参考了blotter的代码来帮助我进行C++的移植工作。(因为这是在工作上做的,所以没有公开的C++代码,抱歉。)

4

这在Python里应该很容易自己写出来。“FIFO”是“先进先出队列”的缩写。买入的东西会被放在队列的后面,而卖出则是从队列的前面取走买入的东西(或者是其中的一部分)。

Python里的collection.deque(双端队列)就是你需要用来实现这个功能的工具。

撰写回答