在 Python 中计算 IRR
Calculate IRR in Python
我 运行 遇到了障碍,希望能得到一些帮助。
问题陈述:
我正在尝试计算 Python 30 年现金流的 XIRR。
到目前为止我尝试了什么:
然而,none 已建立的库(如 numpy 和 pandas)似乎支持这一点。在做了一些研究之后,我通过这个来源 (https://vindeep.com/Corporate/XIRRCalculation.aspx) 了解到,通过一些简单的操作,可以从 IRR 计算 XIRR。
所以,我只需要一个实施良好的内部收益率函数。该功能过去存在于 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, 0, -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 年多来未解决的边缘案例错误。
任何人都可以提供更稳定的实现。感觉如此简单且非常常用的功能以及缺乏良好稳定的实现让我感到惊讶。谁能指点什么好资源。
谢谢
乌代
看看 their GitHub 上的实现,对我来说很明显 npf.irr()
函数实现得很好。您的替代方案似乎是使用 NumPy 操作自己实现该功能,但我怀疑 a) 是否容易完成或 b) 是否可以在纯 Python.
中完成
NumPy Financial 似乎正在使用特征值进行实现,这意味着它们正在执行复杂的数学运算。也许,如果您不受 Python 的限制,请考虑 Microsoft's C# IRR 的实施,看看它是否工作得更快。我怀疑他们正在使用回归来计算 IRR。因此,根据你的猜测,它确实可能比 NumPy Financial 更快。
您最后的选择是继续使用您目前拥有的,只是 运行 在更强大的机器上。在我的机器上,这个操作花了大约 71 秒,而且它甚至没有 GPU。我相信更强大的计算机,具有并行化,应该能够比那快得多的计算速度。
尝试使用 pyxirr 包。在 Rust 中实现,它非常快。对于 30 年的时间段,大约需要 .001 秒。
pyxirr 创作者在这里。该库已在金融项目中使用了一年多,但我最近才抽出时间发布它。我们的任务是为各种投资组合快速计算 XIRR,而现有的实施很快成为瓶颈。 pyxirr
还模仿一些 numpy 金融函数并且运行速度更快。
Excel 中的 XIRR 实现并不总是正确的。在边缘情况下,算法不会收敛并显示不正确的结果而不是错误或 NA。可以使用 xnpv
函数检查结果:xnpv(xirr_rate, dates, values)
并且应该接近于零。同样,您可以使用 npv
函数检查 irr
:npv(irr_rate, values)
,但请注意 Excel 和 numpy-financial 之间的 npv
计算中的 .
看看我在这里提供的答案:。
我没有针对 pyxirr 进行基准测试
我 运行 遇到了障碍,希望能得到一些帮助。
问题陈述:
我正在尝试计算 Python 30 年现金流的 XIRR。
到目前为止我尝试了什么:
然而,none 已建立的库(如 numpy 和 pandas)似乎支持这一点。在做了一些研究之后,我通过这个来源 (https://vindeep.com/Corporate/XIRRCalculation.aspx) 了解到,通过一些简单的操作,可以从 IRR 计算 XIRR。
所以,我只需要一个实施良好的内部收益率函数。该功能过去存在于 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, 0, -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 年多来未解决的边缘案例错误。
任何人都可以提供更稳定的实现。感觉如此简单且非常常用的功能以及缺乏良好稳定的实现让我感到惊讶。谁能指点什么好资源。
谢谢
乌代
看看 their GitHub 上的实现,对我来说很明显 npf.irr()
函数实现得很好。您的替代方案似乎是使用 NumPy 操作自己实现该功能,但我怀疑 a) 是否容易完成或 b) 是否可以在纯 Python.
NumPy Financial 似乎正在使用特征值进行实现,这意味着它们正在执行复杂的数学运算。也许,如果您不受 Python 的限制,请考虑 Microsoft's C# IRR 的实施,看看它是否工作得更快。我怀疑他们正在使用回归来计算 IRR。因此,根据你的猜测,它确实可能比 NumPy Financial 更快。
您最后的选择是继续使用您目前拥有的,只是 运行 在更强大的机器上。在我的机器上,这个操作花了大约 71 秒,而且它甚至没有 GPU。我相信更强大的计算机,具有并行化,应该能够比那快得多的计算速度。
尝试使用 pyxirr 包。在 Rust 中实现,它非常快。对于 30 年的时间段,大约需要 .001 秒。
pyxirr 创作者在这里。该库已在金融项目中使用了一年多,但我最近才抽出时间发布它。我们的任务是为各种投资组合快速计算 XIRR,而现有的实施很快成为瓶颈。 pyxirr
还模仿一些 numpy 金融函数并且运行速度更快。
Excel 中的 XIRR 实现并不总是正确的。在边缘情况下,算法不会收敛并显示不正确的结果而不是错误或 NA。可以使用 xnpv
函数检查结果:xnpv(xirr_rate, dates, values)
并且应该接近于零。同样,您可以使用 npv
函数检查 irr
:npv(irr_rate, values)
,但请注意 Excel 和 numpy-financial 之间的 npv
计算中的
看看我在这里提供的答案:。
我没有针对 pyxirr 进行基准测试