I wish to check if the fitted volatility smile/surface from the SABR model for a fixed time period is arbitrage free. Through my research, I've learnt the following need to be checked:
The RND (risk neutral density) should be non negative and integrates to 1, and recovers all call prices when numerically integrated.
[Necessary for no arbitrage across time] The value of a calendar call spread for any arbitrary maturities must be non negative at any horizon.
I'm looking for the most efficient (computationally) way to do this. Here is what I have decided -
Construct the vol surface using call price data for the time horizon. For each day, fix beta (from historic data) and use least squares to estimate alpha, rho and mu for the day.
Obtain RND by second order derivative of the call price w.r.t strike. I'm confused if I should do this analytically (since this is essentially the second partial of Black Scholes call price fitted with SABR vol., both of which are in closed form) or numerically (by taking finite differences).
Also, since integration here is essentially infinite, would I run into problems by using the usual >integrate< function?