利用实际数据对期权希腊字母绘图
import pandas as pd
import re
import os
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
import time
import math
from scipy.stats import norm
plt.rcParams['font.sans-serif']=['simhei']#用于正常显示中文标签
plt.rcParams['axes.unicode_minus']=False#用于正常显示负号
class GreekAlphabetPlot():
"""利用实际数据对希腊字母绘图
作者:袁江磊
"""
def __init__(self,data_path):
"""data_path为数据所在路径,数据从 http://www.sse.com.cn/assortment/options/risk/ 下载,手动转为.xlsx格式"""
self.make_files()
self.data=pd.read_excel(data_path)
self.data_process()
self.plt_save=False#是否将图片保存
self.plot_show = True#是否将图片显示出来
self.X_col='执行月份'#'执行月份':将绘制希腊值和执行月份的关系;'执行价格':将绘制希腊值和执行价格的关系
def make_files(self):
"""在当前工作文件夹下生成文件夹用于存放各种生成资料"""
path=os.getcwd()
#生成用于存放图片的文件夹
self.plt_save = False # 决定是否保存图片
self.plt_save_order = 0 # 记录保存图片的顺序
self.path_picture=os.path.join(path,'生成图片')
if os.path.exists(self.path_picture) == False:
os.makedirs(self.path_picture)
def data_process(self):
"""将下载下来的数据做简单处理,以备绘图使用"""
data=self.data
data['日期'] = data['日期'].str[:-1]
data_names = data['合约简称']
# 将期权合约名称切割为标的资产,期权类型,执行日期,执行价格几部分,用于后期分类作图
data_info = []
for name in data_names:
info = re.findall('(\d{2,3}ETF)(.)(\d{1,2})月(\d{4})(\w{0,1})', name)[0]
info = list(info)
data_info.append(info)
data_info = np.array(data_info)
data['标的资产'] = data_info[:, 0]
data['期权类型'] = data_info[:, 1]
data['执行月份'] = data_info[:, 2]
data['执行价格'] = data_info[:, 3]
data['执行价格'] = data['执行价格'].astype('int') / 1000
data['修正次数'] = data_info[:, 4]
# 计算修正次数
for i in range(len(data['修正次数'])):
if data['修正次数'][i] == 'A':
data['修正次数'][i] = '二次'
else:
data['修正次数'][i] = '初次'
self.data=data.ix[data['修正次数']=='初次']
def lookup_plot_vari(self):
"""查看plot()方法中各个自变量可以输入的值"""
data=self.data[['标的资产', '期权类型', '执行月份', '执行价格']]
return data
def plot(self,stock_name,option_type,X,date,Y_cols):
"""绘制希腊值与指定变量的关系
stock_name = '50ETF' # 股指名称
option_type = '购' # 期权类型
X = 2.65 # 执行价格
date = 5 # 执行月份
Y_cols = ['Delta', 'Theta', 'Gamma', 'Vega', 'Rho'] # 所选因变量名称
"""
data=self.data
if self.plot_show == False:
matplotlib.use('Agg')# 是否显示所生成的图片
if self.X_col=='执行价格':
option_title = stock_name + option_type + str(date) + '月' # 股指期权名称
data_ = data.ix[(data['标的资产'] == stock_name) & (data['期权类型'] == option_type) & (data['执行月份'] == str(date))]
elif self.X_col=='执行月份':
option_title = stock_name + option_type + str(int(X * 1000)) # 股指期权名称
data_ = data.ix[(data['标的资产'] == stock_name) & (data['期权类型'] == option_type) & (data['执行价格'] == X)]
X_label = self.X_col # 横轴标签
Y_label = '' # 纵轴标签
X = data_[X_label] # 自变量取值
plt.figure(figsize=(12, 8))
for Y_col in Y_cols:
Y = data_[Y_col]
plt.plot(X, Y, label=Y_col)
Y_label += '.' + Y_col
plt.legend(loc='upper right')
plt.grid(True, alpha=0.3)
plt.title(option_title + Y_label + '与' + X_label + '的关系', fontsize=18)
plt.xlabel(X_label, fontsize=18)
plt.ylabel(Y_label, fontsize=18)
if self.plt_save==True:
fig=option_title + Y_label + '与' + X_label + '的关系.jpg'
fig_path =os.path.join(self.path_picture,fig)
plt.savefig(fig_path)
def plot_all(self,X_col):
"""绘制出所有期权希腊字母图
X_col = '执行价格':绘制所有期权希腊值与执行价格的关系
X_col = '执行月份':绘制所有期权希腊值与执行月份的关系
"""
greak_plot.plt_save = True # True可以将生成图片保存
self.plot_show = False
data = greak_plot.lookup_plot_vari() # 所有可以输入plot()方法的可取值
# 绘制所有期权希腊值与执行价格的关系
self.X_col=X_col
if X_col == '执行价格':
total = 0 # 计算生成了多少图片
for stock_name in ['50ETF', '300ETF']:
for option_type in ['购', '沽']:
data_1 = data.ix[(data['标的资产'] == stock_name) & (data['期权类型'] == option_type)]
for date in data_1['执行月份']:
greak_plot.plot(stock_name=stock_name, option_type=option_type, X='none', date=date,
Y_cols=['Delta', 'Theta', 'Gamma', 'Vega', 'Rho'])
total += 1
print(total)
# 绘制所有期权希腊值与执行月份的关系
elif X_col == '执行月份':
total = 0 # 计算生成了多少图片
for stock_name in ['50ETF', '300ETF']:
for option_type in ['购', '沽']:
data_1 = data.ix[(data['标的资产'] == stock_name) & (data['期权类型'] == option_type)]
for X in data_1['执行价格']:
greak_plot.plot(stock_name=stock_name, option_type=option_type, X=X, date='none',
Y_cols=['Delta', 'Theta', 'Gamma', 'Vega', 'Rho'])
total += 1
print(total)
if __name__=='__main__':
#data_path为数据所在路径,数据从 http://www.sse.com.cn/assortment/options/risk/ 下载,手动改为.xlsx格式
greak_plot=GreekAlphabetPlot(data_path='E:\课件\研一下\金融衍生品定价\风险对冲\风险指标.xlsx')
greak_plot.plt_save=True#True可以将生成图片保存
data=greak_plot.lookup_plot_vari()#所有可以输入plot()方法的可取值
# 绘制 50ETF购2650 的希腊值['Delta', 'Theta', 'Gamma', 'Vega', 'Rho']与执行月份的关系
greak_plot.X_col = '执行月份' # '执行月份':将绘制希腊值和执行月份的关系;'执行价格':将绘制希腊值和执行价格的关系
greak_plot.plot(stock_name = '50ETF',option_type = '购',X = 2.55,date ='none',Y_cols = ['Delta', 'Theta', 'Gamma', 'Vega', 'Rho'])
greak_plot.plot(stock_name='300ETF', option_type='沽', X=3.3, date='none',Y_cols=['Gamma', 'Vega', 'Rho'])
# 绘制 50ETF购2650 的希腊值['Delta', 'Theta', 'Gamma', 'Vega', 'Rho']与执行价格的关系
greak_plot.X_col = '执行价格' # '执行月份':将绘制希腊值和执行月份的关系;'执行价格':将绘制希腊值和执行价格的关系
greak_plot.plot(stock_name='50ETF', option_type='购', X='none', date=6,Y_cols=['Delta', 'Theta', 'Gamma', 'Vega', 'Rho'])
greak_plot.plot(stock_name='300ETF', option_type='沽', X='none', date=5, Y_cols=['Gamma', 'Vega', 'Rho'])
#绘制出所有期权希腊字母图,执行下面函数后将在‘生成图片文件夹下逐渐生成图片’
greak_plot.plot_all(X_col='执行价格')#绘制所有期权希腊值与执行价格的关系并保存
greak_plot.plot_all(X_col='执行月份')#绘制所有期权希腊值与执行月份的关系并保存