Thursday, November 18, 2010

Progress on the Implied Distribution Project

So some success has been had since the last post. After talking to a professor I was steered towards the big Hull options book for Hull's solution to creating a risk neutral implied distribution from option prices.

His solution involved using the butterfly spread payoff to construct the distribution on the segments between strikes, and then march along all traded exercise prices to map out the full curve. For instance the formula for the expected likelihood of the stock reaching $6.5 would be = (e^(T*rf)*(Call_Price@6 + Call_Price@7 - 2*Call_Price@6.5))/(0.5^2)

He was using Derivagem to price his calls (including the never-to-be-traded 6.5) and everything worked out peachy keen.

Well it didn't for me. After running through several different stocks I concluded that this method either doesn't make sense in the real world, or is being badly abused by my hackneyed knowledge for probability density functions.

I went back to the drawing board and decided to go big or go home. Here is a screen shot of my option calculator.
I know you can't see anything so it basically is 35 replications of this

So now at the touch of a button I run this code

Sub Button1_Click()
Dim min As Double
Dim target As Double
Dim vol As Double
Dim i As Single

Application.ScreenUpdating = False
Sheets("BS MODEL").Activate
i = 0
Do
    target = 0
    Range("b14").Offset(0, i).Value = 0.0001
    vol = 0
    min = Range("b16").Offset(0, i).Value
    ' we have reset the implied volatility to 0, and are ready to min the difference between bs call and market    call
    Do
    vol = vol + 0.0001
    'we step the implied vol by 1
    Range("b14").Offset(0, i).Value = vol
    min = Range("b16").Offset(0, i).Value
    'bs theory tells us the market call must be larger than a bs call with a lower volatility so we can use an absolute inequality
    Loop While min > target
'we now solve the call/put of the next strike
i = i + 2
Loop While i < 31

Sheets("IMPLIED DIST").Activate
Application.ScreenUpdating = True
End Sub

And we solve for 35 implied volatiles at the same time... COOOOL!

With some =1-Normsdist() work I was able to back out the implied likelihood for each strike and was left with this implied distribution for Apple from now to December 17th. 
Woo Hoo! This rough cut of the apple distribution tells a good story. The left tail is significantly fatter than the right tail (recall the stock is trading at 300), and there is some skew. The skew bothers me a little bit because I think it is partially a product of where I chose to switch from calls to puts. 

Remembering that options have a volatility smile we know that deep in the money options are biased upwards in volatility. Theoretically the smile should look something like the black line below. 
If the intersection between the put volatility smile and the call volatility smile is at the stock price then if you switch from out of the money calls to predict volatility, to out of the money puts as you cross the stock price your predicted volatility should have a pretty seamless transfer (think about just always using the lowest black line). Unfortunately I am  seeing a much higher put volatility in options with exercise ~ stock price than in calls. I show this with the red line above, but this is with the assumption that the puts are "to high" at the stock price and the calls have the true volatility. It could just as easily be reversed where exercise = stock price calls could have too low of a volatility and the puts have the true volatility.

This whole scenario forces me to make a judgment call. Do I a) accept that the distribution has a 10% stdev jump, b) use calls and switch over at a lower exercise price where the volatiles cross, or C) average into (smooth into) the new volatility around the stock price. Some definite thinking time.

When I get that part figured out I'm going to modify the model to be plug and play with bloomberg exported option data, and I want to solve the distribution for all the option expiry periods simultaneously so I can create something that looks like this:
Comments, suggestions, corrections welcome!

No comments:

Post a Comment