蒙地卡羅

優化蒙地卡羅模擬中的利率掉期計算

  • September 17, 2022

我正在執行一個模擬,我想在其中計算 100 次掉期超過 1000 條(甚至更多)不同利率曲線的 NPV。

看起來 Quantlib 在執行這些計算方面並不是很快,或者我的程式碼不是最優的。

腳本執行以下操作(對於所有曲線):

  • 創建 Quantlib 曲線對象(基於這些模擬利率曲線)
  • 每次交換創建交換對象
  • 為每個交換對象設置 swappriceEngine
  • 計算每次掉期的 NPV

所有模擬利率曲線的每次互換的程式碼範例:

fixed_schedule = ql.Schedule(settle_date, maturity_date,
                        fixed_leg_tenor, calendar,
                        ql.ModifiedFollowing, ql.ModifiedFollowing,
                        ql.DateGeneration.Forward, False
float_schedule = ql.Schedule (settle_date, maturity_date,
                         float_leg_tenor, calendar,
                         ql.ModifiedFollowing, ql.ModifiedFollowing,
                         ql.DateGeneration.Forward, False
swap = ql.VanillaSwap(ql.VanillaSwap.Payer, notional, fixed_schedule,
                    fixed_rate, fixed_leg_daycount, float_schedule,
                    6M_index, float_spread, float_leg_daycount)
swap.setPricingEngine(DiscountingSwapEngine(YieldTermStructureHandle(discount_curve)))
swap.NPV()

我想知道是否可以只創建 100 個不同的交換對象並只更新計算 NPV 所需的利率曲線,而不是在每個循環中創建交換對象。所以只更新swap對像中的6M_index並更新swap.setPricingEngine中的discountcurve。

那可能嗎?

是的,這是可能的。您可以預先創建 100 個交換及其引擎,並且只更改曲線。如果您對所有掉期使用相同的貼現曲線,您甚至可以只創建一個引擎並在掉期之間共享它。

您可以編寫如下內容:

forecast_handle = ql.RelinkableYieldTermStructureHandle()
discount_handle = ql.RelinkableYieldTermStructureHandle()

index_6M = ql.SomeIndex(..., forecast_handle)
engine = ql.DiscountingSwapEngine(discount_handle)

然後對於每次交換:

fixed_schedule = ...
float_schedule = ...
swap = ...
swap.setPricingEngine(engine)

在此設置階段之後,對於每種情況,您可以使用以下方式為掉期定價:

forecast_handle.linkTo(forecast_curve)
discount_handle.linkTo(discount_curve)
for s in swaps:
   s.NPV()

您仍然會花時間在定價上,並且可能會花一些時間在對象之間的通知上,但至少您應該節省建構對象所花費的時間。讓我知道這是如何工作的。

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