[英]Calculate IRR in Python
我遇到了障礙,希望得到一些幫助。
問題陳述:
我正在嘗試用 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, 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 年未得到解決。
任何人都可以提供更穩定的實現。 感覺如此簡單且非常常用的功能以及缺乏良好的穩定實現讓我感到驚訝。 有人可以指出任何好的資源。
謝謝
烏代
嘗試使用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的金融之間的計算。
看看他們 GitHub 上的實現,我很明顯npf.irr()
函數實現得很好。 您的替代方案似乎是使用 NumPy 操作自己實現該功能,但我懷疑 a) 是否容易完成或 b) 是否可能在純 Python 中完成。
NumPy Financial 似乎正在使用特征值來實現它們,這意味着它們正在執行復雜的數學運算。 也許,如果您不受 Python 限制,請考慮Microsoft 的IRR 的 C#實現,看看它是否工作得更快。 我懷疑他們正在使用回歸來計算 IRR。 因此,根據您的猜測,它可能確實比 NumPy Financial 更快。
您最后的選擇是繼續使用您目前擁有的東西,並在更強大的機器上運行。 在我的機器上,這個操作大約需要 71 秒,而且它甚至沒有 GPU。 我確信具有並行化功能的更強大的計算機應該能夠以比這快得多的速度進行計算。
看看我在這里提供的答案: https : //stackoverflow.com/a/66069439/4045275 。
我沒有對 pyxirr 進行基准測試
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.