Volatility Mismatch in SABR Calibration

• 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!

Let's assume you can calibrate just as well using $$\beta = 1$$. Then you'd have $$dF = \alpha \sqrt F dW$$ and $$dF = \tilde\alpha F dW = (\tilde\alpha \sqrt F) \sqrt F dW$$ So you can make the identification $$\alpha \sim (\tilde\alpha \sqrt F)$$ In your example $$\alpha = 13.71$$ and $$\tilde \alpha = 0.43$$. So I'm guessing the spot price $$F_t$$ is in the order of magnitude $$1016$$. Is that close?

• Thank you Frido. May I ask why when beta=1, in the first equation, we have sqrt(F) instead of F (this term should be F^beta). Also, when beta=1, I find that the calibrated result for both (either scaling price or not) gives the same result (alpha is the same). I updated this example here (github.com/0xJchen/SABR_Sample/blob/master/test_same_beta.ipynb)
– anmo
Commented Sep 29, 2023 at 19:10
• The first is beta is half the second is beta is one. Assuming the choice of beta doesnt affect the calibration too much then the two alphas should be different. I find it a bit strange in your second trial you get the same value for the alphas. Commented Sep 29, 2023 at 19:36
• ok, I understood the meaning of sqrt here.
– anmo
Commented Sep 29, 2023 at 21:47
• Following you answer, what's the real-world meaning of the "order of magnitude" here? Because most of the time we assume beta level is certain. Then assuming beta!=1 (like 0.5), if the underlying price's absolute value (scaling or not) matters so much, how should we calibrate SABR?
– anmo
Commented Sep 29, 2023 at 21:53
• @anmo The way you calibrate is fine, but for $\beta \neq 1$ you may want to rescale $\alpha$ as I explained to make it into a number that is comparable to implied volatility. Commented Sep 30, 2023 at 8:14