Below is an example using nag4py and the pandas library to calculate the implied volatility of options prices. All the code below can be downloaded to calculate your own implied volatility surface for data on the Chicago Board of Options Exchange website.

**Background on Implied Volatility**The famous Black Scholes formula for pricing a Call/Put option on a stock is a function of 6 variables; Underlying Price, Interest Rate, Dividends, Strike Price, Time-to-Expiration, and Volatility. Note that for a given option contract we can observe the Underlying Price, Interest Rate, and Dividend Rate. In addition, the options contract specifies the Strike Price and Time-to-Expiration.

Thus the one variable we have to tweak is the volatility. We can then ask the question: For what

**volatility*** does the Black Scholes equation price equal the market price.

**F(volatility*)=Market Option Price**

This

**volatility***is then denoted as the implied volatility observed in the market. Since the Black Scholes equation is a continuous function of volatility on (0, 1) we can use a NAG root finder to locate such

**volatility***. In fact, we will use a couple NAG functions; nag_zero_cont_func_brent will find the root using Brent's Algorithm, nag_bsm_price will calculate the theoretical option price, nag_2d_cheb_fit_lines will perform a least squares Chebyshev fit to the volatility surface, and nag_2d_cheb_eval will evaluate the surface at intermediate points.

**Running the Script**__We have created an example script that will run on data from the Chicago Board of Options Exchange (CBOE) website. The CBOE provides options data in downloadable format here.__

The program uses the pandas package to easily store and manipulate the data via DataFrames. In the script, you'll notice pandas takes care of the many data processing functions and then calls the NAG Library for more complex analysis. The program will automatically read in the options data, calculate implied volatility for the call and put options, and plot the volatility curves and surface. The above code can be run as follows (given that you have pandas, matplotlib, nag4py, and ctypes):

python implied_volatility.py QuoteData.dat

**Results**I ran the program on Apple Options data (SYM AAPL). Below is the output, generated in 10 seconds with roughly 500,000 calls to the NAG Library:

Implied Volatility for AAPL (APPLE INC),500.3691,+4.3291, Oct 15 2013 @ 15:25 ET,Bid,500.32,Ask,500.48,Size,3x1,Vol,10041069,

Calculating Implied Vol of Calls...

Calculated Implied Vol for 15800 Calls

Calculating Implied Vol of Puts...

Calculated Implied Vol for 15800 Puts

Plotting Volatility Curves/Surface

Figure 1: Volatility Curves (Click to Enlarge) |

Below is the volatility surface (plotting Strike, Expiration, and Implied Volatility from Figure 1 on the same graph).

Figure 2: Volatility Surface (Click to Enlarge) |

So go ahead, download any options data the CBOE provides and plot your own volatility surface! Many thanks to John Morrissey and Chris Seymour for code suggestions.

**Update**: Download data during CBOE trading hours to ensure the graphs are not null.

I enjoyed the last picture where you put all of the data together.

ReplyDeleteVery good work and thank you for doing this!

ReplyDeleteThanks just wondering how were you able to calculate implied volatility of an expired option in fact the valuation date is Dec 19 2013 while the first options are at Dec 13 2013

ReplyDeleteThe date these graphs were generated is in the upper right of the picture - October 15th 2013 (when AAPL was around $500 a share).

DeleteAren't the CBOE options American ? Do the NAG functions c05ayc and s30aac use some kind of Binomial tree way to return the implied vol or are they using BS reversed ? Thanks.

ReplyDeleteYes, CBOE options are American.

ReplyDeleteThe NAG function c05ayc is a general purpose root finding function, and s30aac is a BS function. So the root finder is used to find the desired solution via multiple calls of the BS function.

Thanks. My point was that, is it appropriate in real world to use BS to derive the implied vols for these options? I understand if it was done just for demo purposes but we should technically be using either Binomial tree or finite diff methods to back out implied vol and not BS (since american options).

ReplyDeleteYes - you should consider this as just for demo purposes - I've no doubt that what you suggest would be better.

Delete