固定收益

如何在使用 ImpliedTermStructure 類時管理 QuantLib 中的評估日期更改

  • November 30, 2013

我不會附上整個程式碼,因為這只會浪費空間,而且對這個問題的目的沒有用處。

我要在這裡附加的是一個片段程式碼及其輸出,它顯示了我無法理解的內容。

輸出

Today is November 29th, 2013
Settlement date is December 4th, 2013
Evaluation date is November 29th, 2013

Actual and implied curve evaluated at November 29th, 2013
The reference date is December 4th, 2013 for the Actual curve
The reference date is June 3rd, 2014 for the Implied curve

---- Actual ----- Implied

1 - 0.995917 --- 0.995485
2 - 0.990663 --- 0.987753
3 - 0.981329 --- 0.975887
4 - 0.966947 --- 0.959062
5 - 0.947756 --- 0.938374
6 - 0.925654 --- 0.914803
7 - 0.900713 --- 0.889055
8 - 0.874264 --- 0.862391
9 - 0.847481 --- 0.835015
10 - 0.819623 --- 0.806789

We've just amended the evaluation date from November 29th, 2013 to May 29th, 2014

Actual and implied curve evaluated at May 29th, 2014
The reference date is June 3rd, 2014 for the Actual curve
The reference date is June 3rd, 2014 for the Implied curve

---- Actual ----- Implied

1 - 0.995917 --- 0.995917
2 - 0.990673 --- 0.990673
3 - 0.981353 --- 0.981353
4 - 0.966986 --- 0.966986
5 - 0.947756 --- 0.947756
6 - 0.925689 --- 0.925689
7 - 0.900707 --- 0.900707
8 - 0.874121 --- 0.874121
9 - 0.847552 --- 0.847552
10 - 0.819667 --- 0.819667

此輸出顯示,如果您的評估日期等於 2013 年 11 月 29 日,並且您要求參考日期為 2014 年 6 月 3 日的隱含期限結構,您將得到兩條不同的曲線,正如您所期望的那樣。

但是,如果您將評估日期修改為 2014 年 6 月 3 日並要求提供隱含的期限結構,則後者會改變其形狀。

片段程式碼

...
           // +---------------------------------
           // | Dates at which to forecast term structures
           // +---------------------------------

           Period forwardPeriod = 6 * Months;

           Date forwardDate = calendar.advance(todaysDate, forwardPeriod);
           Date forwardSettlementDate = calendar.advance(forwardDate, settlementDays, Days);

           // +---------------------------------
           // | Implied term structure
           // +---------------------------------

           RelinkableHandle<YieldTermStructure> actualDiscountCurve;
           actualDiscountCurve.linkTo(depoSwapTermStructure);
           boost::shared_ptr<YieldTermStructure> impliedDiscountCurve(new ImpliedTermStructure(    actualDiscountCurve,        // Handle<YieldTermStructure>
                                                                                                   forwardSettlementDate       // Date referenceDate
                                                                                               ));

           // +---------------------------------
           // | Printing today's discount factors
           // +---------------------------------

           std::cout << std::endl;
           std::cout << "Actual and implied curve evaluated at " << todaysDate << std::endl;
           std::cout << "The reference date is " << actualDiscountCurve->referenceDate() << " for the Actual curve" << std::endl;
           std::cout << "The reference date is " << impliedDiscountCurve->referenceDate() << " for the Implied curve" << std::endl;
           std::cout << std::endl;
           std::cout << "---- Actual ----- Implied" << std::endl;
           std::cout << std::endl;

           for(Time d = 1; d <= 10.0; d+= 1.0)
           {
               std::cout << d << " - " << depoSwapTermStructure->discount(d) << " --- " << impliedDiscountCurve->discount(d) << std::endl;
           }

           // +---------------------------------
           // | Evaluate the bond with the implied curve at forward date
           // +---------------------------------

           discountingTermStructure.linkTo(impliedDiscountCurve);
           Settings::instance().evaluationDate() = forwardDate;
           std::cout << std::endl;
           std::cout << "We've just amended the evaluation date from " << todaysDate << " to " << forwardDate << std::endl;

           // +---------------------------------
           // | Printing discount factors at forward date
           // +---------------------------------

           std::cout << std::endl;
           std::cout << "Actual and implied curve evaluated at " << forwardDate << std::endl;
           std::cout << "The reference date is " << actualDiscountCurve->referenceDate() << " for the Actual curve" << std::endl;
           std::cout << "The reference date is " << impliedDiscountCurve->referenceDate() << " for the Implied curve" << std::endl;
           std::cout << std::endl;
           std::cout << "---- Actual ----- Implied" << std::endl;
           std::cout << std::endl;

           for(Time d = 1; d <= 10.0; d+= 1.0)
           {
               std::cout << d << " - " << depoSwapTermStructure->discount(d) << " --- " << impliedDiscountCurve->discount(d) << std::endl;

...

我的問題與我的目標有關,我在以下幾點簡要描述:

  1. 評估日期等於今天,我想獲得參考日期等於今天 + 6M 的隱含期限結構;
  2. 評估日期等於今天 + 600 萬,我想為DiscountingBondEngine()使用上述隱含期限結構的債券定價;
  3. 這將允許我根據貼現曲線的預測 (*) 而不是恆定曲線來估計債券的一種“Theta”。

任何人都可以澄清如何在評估日期修改後沒有完全改變隱含期限結構的情況下做這樣的事情?

(*) 實際上,預測來自遠期利率曲線。

沒有看到輸入就很難確定,但我猜隱含曲線會改變形狀,因為原始曲線會改變(您可以從輸出中看到:除了 1 年和 5 年點,實際折扣是不同的)。

原始曲線變化的原因可能是周末或節假日的位置不同(例如,1個月的存款可能跨越30、31或32個日曆日);當您移動評估日期時,實際曲線在略有不同的期限內使用相同的利率,這導致折扣因子出現不同。

隱含的曲線並不那麼聰明,以至於沒有考慮到這一點;正如你可能從它的實現中看到的那樣,它只是重新調整了折扣因子,使新參考日期的折扣因子為 1。因此,當評估日期在今天時,它與原始曲線具有相同的形狀,並且不是原始曲線在今天+6M 時的形狀;當評估日期移動時,隱含曲線採用實際曲線的新形狀(實際上,它等於實際曲線)。

如果你想讓隱含的曲線保持相同的形狀,你必須強制原始曲線做同樣的事情。這樣做的方法取決於您使用的具體期限結構類;但對於他們中的大多數人來說,一個可行的解決方案應該是在您移動評估日期時防止原始曲線的參考日期移動。而不是使用需要許多結算日和日曆的建構子(我猜你現在正在做)嘗試使用具有明確參考日期的建構子。當評估日期發生變化時,您將以這種方式建構的曲線將保持相同的參考日期(以及它的形狀),反過來這應該保持隱含曲線的形狀。

有關期限結構隨評估日期變化的方式的更多資訊,請參見 http://implementingquantlib.blogspot.com/2013/09/chapter-3-part-1-of-n-term-structures.html

哦,謝謝你的問題。你剛剛給了我下一篇博文……

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