我遇到了一个路障,希望能在这方面提供一些帮助。
问题陈述
我在用Python计算30年现金流的XIRR。
,到目前为止我尝试过什么,
然而,现有的图书馆(如numpy和熊猫)似乎都没有这方面的支持。在做了一些研究之后,我通过这个源代码(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年没有得到解决。
谁能好心地提出一个更稳定的实现。它感觉像这样简单和非常常用的功能和缺乏一个良好的稳定的实现令我惊讶。有人能指出任何好的资源。
谢谢
乌迪
发布于 2021-06-20 17:02:59
尝试使用比克斯尔包。在铁锈中实施,它正在快速燃烧。在30年的时间里,它花了大约.001秒。
发布于 2021-06-23 12:38:14
比克斯尔创建者在这里。这个图书馆在一个金融项目中已经使用了一年多了,但我只是最近才找到了出版它的时间。我们的任务是快速计算各种投资组合的XIRR,而现有的实现很快就成了瓶颈。pyxirr还模仿了一些粗俗的金融功能,而且运行速度快得多。
Excel中的XIRR实现并不总是正确的。在边缘情况下,该算法不收敛并显示不正确的结果,而不是错误或NA。结果可以使用xnpv函数:xnpv(xirr_rate, dates, values)进行检查,并且应该接近于零。类似地,您可以使用irr函数npv:npv(irr_rate, values)检查差异,但请注意npv计算中的差异与numpy-financial之间的关系。
发布于 2021-06-18 03:48:14
查看一下他们的GitHub上的实现,我非常清楚地看到,npf.irr()函数实现得相当好。您的替代方法似乎是使用NumPy操作自己实现函数,但我怀疑( a)很容易完成,或者( b)是否可能在纯Python中完成。
NumPy金融似乎在使用特征值来实现它们,这意味着它们正在执行复杂的数学操作。也许,如果您没有受到Python的限制,请考虑IRR的微软的C#实现,看看它是否工作得更快。我怀疑他们是在使用回归来计算IRR。因此,根据你的猜测,它确实比NumPy金融更快。
你的最后一种选择是继续你现在所拥有的,然后在一台更强大的机器上运行。在我的机器上,这个操作大约花了71秒,甚至连GPU都没有。我相信,更强大的计算机,通过并行化,应该能够更快地计算这一点。
https://stackoverflow.com/questions/68028580
复制相似问题