0
点赞
收藏
分享

微信扫一扫

期权制作回测数据

点亮自己的那盏灯 2022-02-20 阅读 68
python

将指定的档位的期权,指定阶段剩余到期日的期权数据合并,用于回测

import pandas as pd
import numpy as np
import akshare as ak
pd.set_option("display.max_rows",None)
pd.set_option("display.max_columns",None)

nh_price = ak.nh_price_index('RM')
nh_price.head()

nh_return = ak.nh_return_index('RM')
nh_return.head()

nh_volatility = ak.nh_volatility_index('RM')
nh_volatility.head()


# rm_fu = ak.get_futures_daily(start_date='20180101',end_date='20210624',market='CZCE')
# rm_fu = rm_fu.loc[rm_fu['symbol'].str.contains('RM')]
import datetime
rm_fu = pd.read_csv('rm_fu.csv')
rm_fu['date'] = rm_fu['date'].apply(lambda x:datetime.datetime.strptime(str(x),'%Y-%m-%d'))
rm_fu = rm_fu.iloc[:,6:]
#rm_fu.to_csv('rm_fu.csv')
rm_fu.head()

rm = pd.read_csv('RM.csv')
import datetime
rm['date'] = pd.to_datetime(rm['date'])
rm = rm.iloc[:,6:]
#rm.to_csv('RM.csv')
rm.head()

#rm['date'] = rm['date'].apply(lambda x:datetime.datetime.strptime(x, '%Y-%m-%d').strftime('%Y-%m-%d %H:%M:%S')).tolist()

rm.rename(columns={'合约系列':'symbol'},inplace=True)
last = pd.merge(rm,rm_fu,how = 'left',on=['date','symbol'])
last.head()


#根据长度,制作合约剩余交易日
#寻找每一个合约
"""
def fun1(df):
    for j in range(len(df['date'].unique())):
        df.iloc[j,-1] = len(df['date'])-j
    return df
"""
from tqdm import tqdm
final = pd.DataFrame()
for i in tqdm(last['品种代码   '].unique()):
    #print(last['品种代码   '].head(1))
    #print(i)
    last_1 = last.loc[last['品种代码   '] == i]
    #print(last_1)
    last_1 = last_1.sort_values(by='date')
    last_1['rt'] = 0
    #print(last_1.date.head())
    #寻找每一个日期
    for j in tqdm(range(len(last_1['date'].unique()))):
        #print('j',j)
        #print(range(len(last_1['date'].unique())))
        if len(last_1['date'])-j-1 == 0:
            print('特殊')
            print(len(last_1['date']))
            print(j)
            print(last_1.iloc[j,:])
        else:
            last_1.iloc[j,-1] = len(last_1['date'])-j-1
    final = final.append(last_1)
#print(final)
final.to_csv('final_1.csv')


#数据长度小于20日的删除
from tqdm import tqdm
final = pd.DataFrame()
for i in tqdm(last['品种代码   '].unique()):
    #print(last['品种代码   '].head(1))
    #print(i)
    last_1 = last.loc[last['品种代码   '] == i]
    #print(last_1)
    last_1 = last_1.sort_values(by='date')
    last_1['rt'] = 0
    #print(last_1.date.head())
    #寻找每一个日期
    for j in tqdm(range(len(last_1['date'].unique()))):
        #print('j',j)
        #print(range(len(last_1['date'].unique())))
        if len(last_1['date'])< 20:
            pass
        else:
            last_1.iloc[j,-1] = len(last_1['date'])-j-1
    final = final.append(last_1)
#print(final)
final.to_csv('final_2.csv')


#选择某一天的合约,
print(last['品种代码   '].head(1))

#选取某一天的全部合约
final = pd.read_csv('final_1.csv')
date = '2020-01-16'
test = final.loc[final['date']==date]
test.head()

#根据CP,距离期货价格数据长短,判定合约(也可以根据希腊字母,价格等)
final['date'][0]==date
inal.to_csv('E:/final.csv')

举报

相关推荐

0 条评论