程式
QuantLib Python:如何計算不規則現金流的 npv?
我正在嘗試為 Python 學習 QuantLib,但我必須說我正在努力應對文件(我還購買了 Ballabio 的 python 食譜)——也許是我,但即使找到最基本的概念似乎也很困難。
**我怎麼能做一些像貼現一組不規則現金流這樣平庸的事情?**現金流可以是任何東西——房地產投資、資產支持債券等的回報。
下面的程式碼執行沒有任何錯誤,但結果是……零!
我做了什麼:
- 我已經用 SimpleCashFlow 定義了現金流——這是正確的類嗎?
- 然後我使用 FlatForward 來定義平坦的收益率曲線。
- 我用於 discount_curve 的內容取自 Python 食譜的第 57 頁。
- 我查找了 CashFlows.npv 如何工作的範例,但我在這裡找不到任何範例https://quantlib-python-docs.readthedocs.io/en/latest/termstructures.html#yield-term-structures>和其他頁面<https://rkapl123.github.io/QLAnnotatedSource/d8/d7d/class_quant_lib_1_1_cash_flows.html不是最清楚的。
我的問題:
- 我究竟做錯了什麼?
- calc_date 應該是……什麼?第一次現金流的日期?我試過了,我幾天前試過了,什麼都沒有。
- FlatForward(calc_date, rate, ql.ActualActual()) 是否定義了從 calc_date 到無窮大的收益率曲線?還是我們需要指定曲線的開始日期和結束日期?
- 有什麼方法可以檢查/調試 SimpleCashFlow 實例(我使用 Spyder)?cfs$$ 0 $$返回
<QuantLib.QuantLib.SimpleCashFlow; proxy of <Swig Object of type 'ext::shared_ptr< SimpleCashFlow > *' at 0x0000021354440B40> >
,但我如何檢查真正存在的日期和值?這是程式碼:
import QuantLib as ql d1 = ql.Date(15,1,2011) cfs = [ql.SimpleCashFlow(10, d1), ql.SimpleCashFlow(10, d1 + 365), ql.SimpleCashFlow(110, d1 + 365*2)] calc_date = ql.Date(15,1,2011) risk_free_rate = 0.05 discount_curve = ql.YieldTermStructureHandle( ql.FlatForward(calc_date, risk_free_rate, ql.ActualActual())) # WHY is this zero?? pv = ql.CashFlows.npv(cfs, discount_curve, True)
預設情況下,QuantLib 會將評估數據設置為目前日期。
如果您檢查目前日期:
ql.Settings.instance().evaluationDate
您將看到您正在嘗試獲取所有過去現金流的 npv,這將是零。
在定義 d1 之後嘗試插入這一行。
ql.Settings.instance().setEvaluationDate(d1)
QuantLib 有一個評估日期的概念(出於我現在忽略的一些原因)。預設情況下,它是今天的日期,這意味著您所有的現金流都在過去,因此一文不值。如果要計算截至計算日期的 NPV,請添加:
ql.Settings.instance().evaluationDate = calc_date
在計算之前。您對曲線的構造是正確的。
(此外,如果您對如何更好地記錄這一點有任何建議,我會全神貫注 - 我原以為您會在範例中遇到這一點,但顯然我錯了……)
要檢查現金流,您可以使用它們的介面:例如,
cf[0].date()
並且cf[0].amount()
會起作用。