- Problem Statement
Hi, I am trying to calibrate SABR on a new asset, which is not 'forward swap rate'. While using the vanillaSABR calibration, I find the parameter 'sigma' (one of model parameters, sigma, alpha, rho, beta) hugely depends on the absolute value of strike/forward-price. That is, if I feed the model with scaled strike/forward-price, with IV fixed, the model output will be completely different.
I follow up the implementation from vanillaSABR (which works well on swap rate data).
Firstly, I am trying to fit the model to ETH option data.
forawrd_price=1600
strikes = [i*100 for i in range(11,22)]
time_to_expiration=0.2558724912480974 # here I am using ETH-29DEC23 options
iv=np.array([0.543,0.496,0.4613000000000001, 0.41789999999999994, 0.3821, 0.3626, 0.3608, 0.3738, 0.395,0.407,0.433])
model = SABR_swaption(F = forawrd_price, # forward rate, scalar
K = strikes, # strikes, vector (N X 1)
time = time_to_expiration, # expiry (in yrs), scalar
vols = iv, # observed market volatilities, vector (N X 1)
calibration="SLS_SciPy",
beta = 0.5)
model.plot_smile()
print(model.alpha, model.beta, model.rho, model.nu)
===>
13.706637968052135 0.5 -0.04495875656782091 1.8499748021823488
It looks good. But notice the volatility parameter (alpha=sigma_0) is extremely large. As it represents the asset volatility, it should be around its IV: 0.4 (40%).
Secondly, if we scale the strike and forward-price simultaneously,
forawrd_price=1.6
strikes = [i/10 for i in range(11,22)]
...
print(model.alpha, model.beta, model.rho, model.nu)
===>
0.4331475152825642 0.5 -0.04276820194468185 1.850789849704347
This time the volatility parameter alpha is reasonable, which matches IV.
- Question
Thus I am curious why there's so much discrepancy when fitting assets when we scale the price. If I am about to fit assets whose price has a large absolute value, should I first scale it and re-scale it back? What's the right approach here?
Thank you!