My question is about best practices for reconstructing volatility smiles for a fixed tenor from American option data. For simplicity/liquidity, I am currently considering options on SPY. I am currently having difficulty merging together information from calls and puts to construct the entire smile in a unified way. The resources I have found first recommend to construct the surface from the out-of-the-money options of both types, so I am selecting an ATM strike, solving for the implied repo rate at that strike, and then constructing the vol surface by calculating implied volatilities from end of day mid prices on those out of the money options using that repo rate. The problem with this is that the skews from the call and put sections do not line up creating a kink at the strike at which I join the surface. This kink causes a load of arbitrage violations, see the image below.

I am wondering what is the standard way to correct for this? One thing I can think of that may help would be to calculate an implied repo for each shared strike, but then we are digging into some in-the-money-options for which put-call parity has less reason to hold. On the same note is it even ok to back out implied repos from ATM American option prices given that put-call parity technically doesn't hold for them? Is there an alternative procedure for getting the appropriate rate?

Note, that I am currently using European BS to derive the implied volatilities but for OTM options I would hope the early exercise premium would be small and not be affecting the skew this much. Note: I have implemented the BAW American option approximation formula separately and the skews appear to match worse (but this may be a bug!).

My question is somewhat related to this question although it is more of an extension.

Below is an example of the difference in skew for SPY options at the March 2015 regular expiry (puts are blue, calls are green). Note the kink at strike ~205.

vol smile example

  • 2
    $\begingroup$ If you get different implied volatilities for calls and puts, it simply means that the forward being calculated inside your model (black Scholes I'm guessing). The best way to find this is to find the strike where the call price equals the put price, which you do by interpolation. Then your problems should go away. "solving" it by only using otm options is just pretending the problem doesn't exist, but you just end up with a new problem, which is what you're facing now. $\endgroup$
    – will
    Commented Aug 17, 2019 at 13:14

1 Answer 1


Okay a few things to start. You only need one forward price for whichever option maturity that you are looking at for spy. Take the dividend and the market repo rate and calculate that price using the basic forward price formula. These are board traded options so that forward price probably won't line up with an exact strike which is fine. Now build your option strike ladder with calls and puts starting with maybe slightly in the money to out of the money. I would try this exercise using bid/mid/ask on option and spy prices. Snap that market data carefully and make sure prices have adjusted which might take some manual input or a few snaps. Have a look at those option prices. Especially look the in the money strikes that overlap. With whatever market side you're using make sure that an in the money call for example equals the intrinsic to your prices that you're feeding the model and the corresponding out of the money put. if it doesn't, change it, it's not right. I would recommend using a model where you can feed it the forward price because that will give you issues if its a black box calculating that and or it might then be taking a market quote to compute it that you don't expect or isn't a lined up with your option prices. If you want deep out of money options included you may need to get some actual market quotes from a few dealers as those can trade a little sloppy sometimes.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.