import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from math import log, sqrt, exp
from scipy import stats
def draw_vola_smile(df,title):
# 定义X轴,在值程度,原数据中没有
df['Moneyness'] = df.apply(lambda x: x['StrikePrice'] / x['UnderlyingScrtClose'], axis=1)
# 将原数据按照交易日划分,每个交易日形成一个IV曲线,在此之前已经将期权分为近月和远月,所以本数据一天中只交易相同到期日的期权,不同到期日的期权被分为不同的文件
for data_key, group_df in df.groupby('TradingDate'):
# 根据在值程度将IV排序,否则不会形成微笑形状
well_df = group_df.sort_values(['Moneyness'], ascending=True)
plt.plot(well_df['Moneyness'], well_df['ImpliedVolatility'], 'k', linewidth=0.2)# 调整曲线粗度
plt.xlabel('Moneyness')
plt.ylabel('ImpliedVolativity')
plt.title(title)
return plt.show()
if __name__ == '__main__':
# 读取行情数据
near_call_high = pd.read_csv(r'C:UsersheluxiaofuPycharmProjectspythonProject论文3.4波动率微笑近月看涨高情绪.csv',encoding='utf-8')
near_call_low = pd.read_csv(r'C:UsersheluxiaofuPycharmProjectspythonProject论文3.4波动率微笑近月看涨低情绪.csv')
draw_vola_smile(near_call_high,'near_call_high')
draw_vola_smile(near_call_low,'near_call_low')