程式

QuantLib Python:如何計算不規則現金流的 npv?

  • February 6, 2021

我正在嘗試為 Python 學習 QuantLib,但我必須說我正在努力應對文件(我還購買了 Ballabio 的 python 食譜)——也許是我,但即使找到最基本的概念似乎也很困難。

**我怎麼能做一些像貼現一組不規則現金流這樣平庸的事情?**現金流可以是任何東西——房地產投資、資產支持債券等的回報。

下面的程式碼執行沒有任何錯誤,但結果是……零!

我做了什麼:

我的問題:

  • 我究竟做錯了什麼?
  • 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()會起作用。

引用自:https://quant.stackexchange.com/questions/61001