将指定的档位的期权,指定阶段剩余到期日的期权数据合并,用于回测
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'])-jreturn 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-1final = 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:passelse:last_1.iloc[j,-1] = len(last_1['date'])-j-1final = 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
final.to_csv('E:/final.csv')