蒙地卡羅
優化蒙地卡羅模擬中的利率掉期計算
我正在執行一個模擬,我想在其中計算 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()
您仍然會花時間在定價上,並且可能會花一些時間在對象之間的通知上,但至少您應該節省建構對象所花費的時間。讓我知道這是如何工作的。