我想从Quantlib BachelierSwaptionEngine计算的掉期价格中检索黑色卷。这看起来可以在Quantlib中通过优化器(如牛顿法)或直接通过impliedVolatility方法来完成。我无法在Quantlib Python中使用Quantlib优化器或impliedVolatility方法。
下面的代码显示了我如何在Quantlib中计算交换价格。从那里,我需要检索基于代码中计算的交换价格的黑色vol
import Quantlib as ql
from scipy import optimize
calc_date = ql.Date(29,3,2019)
rate = ql.SimpleQuote(0.01)
rate_handle = ql.QuoteHandle(rate)
dc = ql.Actual365Fixed()
spot_curve = ql.FlatForward(calc_date, rate_handle, dc)
start = 10
length = 10
start_date = ql.TARGET().advance(calc_date, start, ql.Years)
maturity_date = start_date + ql.Period(length, ql.Years)
fixed_schedule = ql.Schedule(start_date, maturity_date,
ql.Period(1, ql.Years), ql.TARGET(), ql.Unadjusted,
ql.Unadjusted,ql.DateGeneration.Forward, False)
floating_schedule = ql.Schedule(start_date, maturity_date,
ql.Period(6, ql.Months), ql.TARGET(),
ql.ModifiedFollowing, ql.ModifiedFollowing,
ql.DateGeneration.Forward, True)
index6m = ql.Euribor6M(ql.YieldTermStructureHandle(spot_curve))
rate = 1.45 / 100
swap = ql.VanillaSwap(ql.VanillaSwap.Receiver, 10000000,
fixed_schedule, rate, ql.Thirty360(ql.Thirty360.BondBasis),
floating_schedule, index6m, 0.0, index6m.dayCounter())
swap.setPricingEngine(ql.DiscountingSwapEngine(
ql.YieldTermStructureHandle(spot_curve)))
swaption_normal_model = ql.Swaption(swap,
ql.EuropeanExercise(swap.startDate()))
normal_vol = ql.SimpleQuote(0.005266)
swaption_normal_model.setPricingEngine
(ql.BachelierSwaptionEngine(ql.YieldTermStructureHandle(spot_curve),
ql.QuoteHandle(normal_vol)))
swaption_normal_model_value = swaption_normal_model.NPV()发布于 2019-06-04 16:46:59
我使用了scipy中的牛顿最小化函数来检索隐含的黑色vol,如下所示:
swaption_black_model = ql.Swaption(swap, ql.EuropeanExercise(swap.startDate()))
initial_vol_guess = 0.60
def find_implied_black(vol):
black_vol = ql.SimpleQuote(vol)
swaption_black_model.setPricingEngine(
ql.BlackSwaptionEngine(ql.YieldTermStructureHandle(spot_curve),
ql.QuoteHandle(black_vol)))
swaption_black_model_value = swaption_black_model.NPV()
diff = swaption_normal_model_value - swaption_black_model_value
return diff
implied_black_vol = optimize.newton(find_implied_black, initial_vol_guess)
implied_black_vol = ql.SimpleQuote(implied_black_vol)
swaption_black_model.setPricingEngine(
ql.BlackSwaptionEngine(ql.YieldTermStructureHandle(spot_curve),
ql.QuoteHandle(implied_black_vol)))
swaption_black_model_value = swaption_black_model.NPV()
print('Normal swaption price is {}'.format(swaption_normal_model_value))
print('Black swaption price is {}'.format(swaption_black_model_value))发布于 2020-01-11 00:01:34
QuantLib有一个确定impliedVolatility的内部函数,您可以求解ShiftedLognormal vol或普通vol。
下面是一个示例:
yts = ql.YieldTermStructureHandle(spot_curve)
blackVol = swaption_normal_model.impliedVolatility(swaption_normal_model_value, yts, 0.5)
blackEngine = ql.BlackSwaptionEngine(yts, ql.QuoteHandle(ql.SimpleQuote(blackVol)))
swaption_normal_model.setPricingEngine(blackEngine)
print(swaption_normal_model.NPV(), swaption_normal_model_value)此外,将交换对象命名为swaption_normal_model也不是一个好主意,因为您可以设置不同的定价引擎
https://stackoverflow.com/questions/56362943
复制相似问题