问题描述
我遇到了障碍,希望得到一些帮助。
问题陈述:
我正在尝试用 Python 计算 30 年以上现金流的 XIRR。
到目前为止我尝试了什么:
然而,似乎没有一个已建立的库(如 numpy 和 pandas)支持这一点。在做了一些研究之后,我通过这个来源 (https://vindeep.com/Corporate/XIRRCalculation.aspx) 了解到,通过一些简单的操作,可以从 IRR 计算出 XIRR。
所以,我所需要的只是一个执行良好的 IRR 函数。该功能曾经存在于 numpy 中,但已转移到另一个包 (https://github.com/numpy/numpy-financial)。虽然这个包有效,但速度非常慢。这是一个小测试:
import pandas as pd
import numpy as np
import numpy_financial as npf
from time import time
# Generate some example data
t = pd.date_range('2022-01-01','2037-01-01',freq='D')
cash_flows = np.random.randint(10000,size=len(t)-1)
cash_flows = np.insert(cash_flows,-10000)
# Calculate IRR
start_timer = time()
npf.irr(cash_flows,guess)
stop_timer = time()
print(f"""Time taken to calculate IRR over 30 years of daily data: {round((stop_timer-start_timer)/60,2)}""")
另一种选择似乎是 https://github.com/better/irr - 但是,这有一个边缘情况错误,该错误已超过 4 年未得到解决。
任何人都可以提供更稳定的实现。感觉如此简单且非常常用的功能以及缺乏良好的稳定实现让我感到惊讶。有人可以指出任何好的资源。
谢谢
乌代
解决方法
尝试使用 pyxirr 包。在 Rust 中实现,它非常快。在 30 年的时间里,它花了大约 0.001 秒。
,pyxirr 创作者在这里。该库已在金融项目中使用了一年多,但我直到最近才有时间发布它。我们的任务是快速计算各种投资组合的 XIRR,现有实施很快成为瓶颈。 pyxirr
还模仿了一些 numpy-financial 函数并且工作得更快。
Excel 中的 XIRR 实现并不总是正确的。在边缘情况下,算法不会收敛并显示不正确的结果,而不是错误或 NA。结果可以用 xnpv
函数检查:xnpv(xirr_rate,dates,values)
并且应该接近于零。同样,您可以使用 irr
函数检查 npv
:npv(irr_rate,values)
,但请注意 npv
在 Excel 和 numpy-financial 之间的计算中的 difference。
查看 their GitHub 上的实现,对我来说很明显 npf.irr()
函数实现得非常好。您的替代方案似乎是使用 NumPy 操作自己实现该功能,但我怀疑 a) 是否容易完成或 b) 是否可能在纯 Python 中完成。
NumPy Financial 似乎正在使用特征值来实现它们,这意味着它们正在执行复杂的数学运算。也许,如果您不受 Python 限制,请考虑 IRR 的 Microsoft's C# 实现,看看它是否工作得更快。我怀疑他们正在使用回归来计算 IRR。因此,根据您的猜测,它可能确实比 NumPy Financial 更快。
您最后的选择是继续使用您目前拥有的东西,并在更强大的机器上运行。在我的机器上,这个操作大约需要 71 秒,而且它甚至没有 GPU。我相信更强大的计算机,通过并行化,应该能够比这快得多。
,看看我在这里提供的答案:https://stackoverflow.com/a/66069439/4045275。
我没有针对 pyxirr 进行基准测试