- 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.
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?