利用实际数据对期权希腊字母绘图_20200525_

利用实际数据对期权希腊字母绘图

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










猜你喜欢

转载自blog.csdn.net/weixin_45590329/article/details/106337463