Use actual data to plot option Greek letters_20200525_

Use actual data to plot option Greek letters

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='执行月份')#绘制所有期权希腊值与执行月份的关系并保存










Guess you like

Origin blog.csdn.net/weixin_45590329/article/details/106337463