1

我遇到了障碍,希望能得到一些帮助。

问题陈述

我正在尝试用 Python 计算 30 多年现金流的 XIRR。

到目前为止我尝试了什么

但是,似乎没有一个已建立的库(如 numpy 和 pandas)对此提供支持。在做了一些研究之后,我通过这个来源(https://vindeep.com/Corporate/XIRRCalculation.aspx)了解到,通过一些简单的操作,XIRR 可以从 IRR 中计算出来。

所以,我所需要的只是一个实现良好的 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, 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 年多的时间里没有得到解决。

任何人都可以提供更稳定的实施。感觉如此简单且非常常用的功能以及缺乏良好稳定的实现让我感到惊讶。有人可以指出任何好的资源。

谢谢

乌代

4

4 回答 4

4

尝试使用pyxirr包。在 Rust 中实现,速度非常快。在 30 年的时间里,它花了大约 0.001 秒。

于 2021-06-20T17:02:59.860 回答
3

pyxirr创建者在这里。该库已经在一个金融项目中使用了一年多,但我最近才找到时间发布它。我们的任务是快速计算各种投资组合的 XIRR,而现有的实施很快成为了瓶颈。pyxirr还模仿了一些 numpy-financial 函数并且工作得更快。

Excel 中的 XIRR 实现并不总是正确的。在边缘情况下,算法不会收敛并显示不正确的结果而不是错误或 NA。结果可以用xnpv函数检查:xnpv(xirr_rate, dates, values)并且应该接近于零。同样,您可以irr使用npv函数:进行检查npv(irr_rate, values),但请注意Excel 和 numpy-financial 之间的计算差异。npv

于 2021-06-23T12:38:14.993 回答
0

看看他们 GitHub 上的实现,我很明显该npf.irr()功能实现得很好。您的替代方法似乎是使用 NumPy 操作自己实现该功能,但我怀疑 a)很容易完成或 b)可能在纯 Python 中完成。

NumPy Financial 似乎正在使用特征值进行实施,这意味着他们正在执行复杂的数学运算。也许,如果您不受 Python 的限制,请考虑Microsoft 的IRR 的 C# 实现,看看它是否工作得更快。我怀疑他们正在使用回归来计算 IRR。因此,根据您的猜测,它可能确实比 NumPy Financial 更快。

你最后的选择是继续你目前拥有的东西,并在更强大的机器上运行。在我的机器上,这个操作花了大约 71 秒,它甚至没有 GPU。我敢肯定,具有并行化功能的更强大的计算机应该能够比这快得多。

于 2021-06-18T03:48:14.147 回答
0

看看我在这里提供的答案:https ://stackoverflow.com/a/66069439/4045275 。

我没有将它与 pyxirr 进行基准测试

于 2021-07-13T20:29:21.033 回答