# Black-Scholes-Merton Implied Volatilities of
# Call Options on the EURO STOXX 50
# Option Quotes from 30. September 2014
# Source: www.eurexchange.com, www.stoxx.com
#
import numpy as np
import pandas as pd
from BSM_imp_vol import call_option
import matplotlib as mpl
import matplotlib.pyplot as plt
mpl.rcParams['font.family'] = 'serif'
# Pricing Data
pdate = pd.Timestamp('30-09-2014')
#
# EURO STOXX 50 index data
#
# URL of data file
es_url = 'http://www.stoxx.com/download/historical_values/hbrbcpe.txt'
# column names to be used
cols = ['Date', 'SX5P', 'SX5E', 'SXXP', 'SXXE',
'SXXF', 'SXXA', 'DK5F', 'DKXF', 'DEL']
# reading the data with pandas
es = pd.read_csv(es_url, # filename
header=None, # ignore column names
index_col=0, # index column (dates)
parse_dates=True, # parse these dates
dayfirst=True, # format of dates
skiprows=4, # ignore these rows
sep=';', # data separator
names=cols) # use these column names
# deleting the helper column
del es['DEL']
S0 = es['SX5E']['30-09-2014']
r = -0.05
#
# Option Data
#
data = pd.HDFStore('./03_stf/es50_option_data.h5', 'r')['data']
#
# BSM Implied Volatilities
#
def calculate_imp_vols(data):
''' Calculate all implied volatilities for the European call options
given the tolerance level for moneyness of the option.'''
data['Imp_Vol'] = 0.0
tol = 0.30 # tolerance for moneyness
for row in data.index:
t = data['Date'][row]
T = data['Maturity'][row]
ttm = (T - t).days / 365.
forward = np.exp(r * ttm) * S0
if (abs(data['Strike'][row] - forward) / forward) < tol:
call = call_option(S0, data['Strike'][row], t, T, r, 0.2)
data['Imp_Vol'][row] = call.imp_vol(data['Call'][row])
return data
#
# Graphical Output
#
markers = ['.', 'o', 'ˆ', 'v', 'x', 'D', 'd', '>', '<']
def plot_imp_vols(data):
''' Plot the implied volatilites. '''
maturities = sorted(set(data['Maturity']))
plt.figure(figsize=(10, 5))
for i, mat in enumerate(maturities):
dat = data[(data['Maturity'] == mat) & (data['Imp_Vol'] > 0)]
plt.plot(dat['Strike'].values, dat['Imp_Vol'].values,
'b%s' % markers[i], label=str(mat)[:10])
plt.grid()
plt.legend()
plt.xlabel('strike')
plt.ylabel('implied volatility')