利用Tushare合成期货主力连续数据
生活随笔
收集整理的這篇文章主要介紹了
利用Tushare合成期货主力连续数据
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
畢業論文選擇了做期貨的橫截面策略,因此需要合成各個品種的主力連續數據。
在此要感謝Tushare社區及團隊的支持,提供了非常給力且全面的數據,畢業許久也終于抽出時間完成本篇分享。
精力原因,無法給出代碼更詳細的注釋。
代碼或者計算邏輯有問題的,還希望各位大佬不吝賜教。
代碼如下:
# -*- coding: utf-8 -*-import tushare as ts import numpy as np import pandas as pd import time pro = ts.pro_api('your token') #%%品種選擇 code_list = ['m','p','jd','rm','sr','cf','ru','rb','ag','ni','hc','zn','cu','al','au','i','sc','ma','ta','fg','if','ic','ih','a','c','y','cs','oi','ap','cy','pb','sn','sf','sm','j','jm','zc','l','v','pp','fb','bb'] f_list = [] for f in code_list:f_list.append(f.upper()) f_list = ['M', 'P', 'JD', 'RM', 'SR', 'CF', 'RU', 'RB', 'AG', 'NI', 'HC', 'ZN', 'CU', 'AL', 'AU', 'I', 'SC', 'MA', 'TA', 'FG', 'IF', 'IC', 'IH','A','C','Y','CS','OI','AP','CY','PB','SN','SF','SM','J','JM','ZC','L','V','PP','FB','BB'] name_list = ['豆粕', '棕櫚油', '雞蛋', '菜籽粕', '白糖', '棉花', '橡膠', '螺紋鋼', '白銀', '鎳', '熱軋卷板', '鋅', '銅', '鋁', '黃金', '鐵礦石', '原油', '甲醇', 'PTA', '玻璃', '滬深300', '中證500', '上證50','豆一','玉米','豆油','玉米淀粉','菜籽油','蘋果','棉紗','鉛','錫','硅鐵','錳硅','焦炭','焦煤','動力煤','聚乙烯','PVC','聚丙烯','纖維板','膠合板'] code_list = ['M.DCE', 'P.DCE', 'JD.DCE', 'RM.ZCE', 'SR.ZCE', 'CF.ZCE', 'RU.SHF', 'RB.SHF', 'AG.SHF', 'NI.SHF', 'HC.SHF', 'ZN.SHF', 'CU.SHF', 'AL.SHF', 'AU.SHF', 'I.DCE', 'SC.INE', 'MA.ZCE', 'TA.ZCE', 'FG.ZCE', 'IF.CFX', 'IC.CFX', 'IH.CFX','A.DCE','C.DCE','Y.DCE','CS.DCE','OI.ZCE','AP.ZCE','CY.ZCE','PB.SHF','SN.SHF','SF.ZCE','SM.ZCE','J.DCE','JM.DCE','ZC.ZCE','L.DCE','V.DCE','PP.DCE','FB.DCE','BB.DCE']#%% 嘗試,以FU為例看能否成功下載 filepath = r'D:\tushare' # .ZCE .SHF .DCE .CFX .INE a = pro.fut_daily(ts_code='FU.SHF', start_date='20130101', end_date='20200930')#設置品種和起始日期 a.sort_values(['trade_date'],inplace = True) a = a.reset_index(drop=True) b = pro.fut_mapping(ts_code='FU.SHF', start_date='20130101', end_date='20200930') # c = pro.fut_daily(ts_code='FU.SHF', trade_date='20180627') b.sort_values(['trade_date'],inplace = True) b = b.reset_index(drop=True) a['weight'] = 1.#復權因子序列 for i in range(1,b.shape[0]):if b['mapping_ts_code'][i] != b['mapping_ts_code'][i-1]:try:temp = pro.fut_daily(ts_code=b['mapping_ts_code'][i-1], trade_date=b['trade_date'][i-1], fields='close')['close'][0]/pro.fut_daily(ts_code=b['mapping_ts_code'][i], trade_date=b['trade_date'][i-1], fields='close')['close'][0]except:temp = pro.fut_daily(ts_code=b['mapping_ts_code'][i-1], trade_date=b['trade_date'][i-2], fields='close')['close'][0]/pro.fut_daily(ts_code=b['mapping_ts_code'][i], trade_date=b['trade_date'][i-2], fields='close')['close'][0]a['weight'][i] = tempprint('*****************')print(i)print('*****************')else:print(i)a['multiplier'] = np.cumprod(a['weight']) a['pre_close'] = a['pre_close']*a['multiplier'] a['pre_settle'] = a['pre_settle']*a['multiplier'] a['open'] = a['open']*a['multiplier'] a['high'] = a['high']*a['multiplier'] a['low'] = a['low']*a['multiplier'] a['close'] = a['close']*a['multiplier'] a['settle'] = a['settle']*a['multiplier'] a.to_csv(filepath+r'\origin_data\FU.csv', index=None) #成功后可進行下一步,下載各個品種的日行情數據#%%下載各品種日行情數據 filepath = r'D:\tushare4' # f_list.index('AP') for i in range(len(f_list)):print(i)code = code_list[i]name = f_list[i]a = pro.fut_daily(ts_code='%s'%code, start_date='20130101', end_date='20200930')a.sort_values(['trade_date'],inplace = True)a = a.reset_index(drop=True)b = pro.fut_mapping(ts_code='%s'%code, start_date='20130101', end_date='20200930')b.sort_values(['trade_date'],inplace = True)b = b.reset_index(drop=True)a['weight'] = 1.for j in range(1,b.shape[0]):if b['mapping_ts_code'][j] != b['mapping_ts_code'][j-1]:try:temp = pro.fut_daily(ts_code=b['mapping_ts_code'][j-1], trade_date=b['trade_date'][j-1], fields='close')['close'][0]/pro.fut_daily(ts_code=b['mapping_ts_code'][j], trade_date=b['trade_date'][j-1], fields='close')['close'][0]a['weight'][j] = tempexcept:a['weight'][j] = 1.a['multiplier'] = np.cumprod(a['weight'])a['pre_close'] = a['pre_close']*a['multiplier']a['pre_settle'] = a['pre_settle']*a['multiplier']a['open'] = a['open']*a['multiplier']a['high'] = a['high']*a['multiplier']a['low'] = a['low']*a['multiplier']a['close'] = a['close']*a['multiplier']a['settle'] = a['settle']*a['multiplier']a['vwap'] = a['amount']*a['multiplier']/a['vol']a.to_csv(filepath+r'\origin_data\%s.csv'%name, index=None)if a.shape[0]>10:print('success with %s'%name)time.sleep(12)#%%生成各量價指標的矩陣,行為日期,列為品種,這里是根據我的需要將數據處理為矩陣的形式,每個指標都會生成一個矩陣 datatypes = (a.columns)[2:] for datatype in datatypes:for i in range(len(f_list)):name = f_list[i]if i == 0:x = pd.read_csv(filepath+r'\origin_data\%s.csv'%name,engine='python')x = x[['trade_date','%s'%datatype]]x.columns = ['trade_date','%s'%name]y = xelse:x = pd.read_csv(filepath+r'\origin_data\%s.csv'%name,engine='python')x = x[['trade_date','%s'%datatype]]x.columns = ['trade_date','%s'%name]y = pd.merge(y,x,on='trade_date',how = 'left')y.to_csv(filepath+r'\%s.csv'%datatype, index=None)#%%生成展期收益率文件,行位日期,列為品種,選擇主力和次主力的展期收益率 # A = pro.fut_daily(trade_date='20181113', fields='ts_code,trade_date,pre_close,pre_settle,open,high,low,close,settle,vol') # example = pro.fut_daily(trade_date='20130104', exchange='DCE', fields='ts_code,trade_date,pre_close,pre_settle,close,settle,vol') # df = pro.fut_daily(trade_date='20130104', exchange='DCE', fields='ts_code,trade_date,pre_close,pre_settle,close,settle,vol') a = pd.read_csv(filepath+r'\origin_data\M.csv',engine='python') filepath = r'D:\暑期+論文\tushare4' date_list = a.trade_date rr = [] for date in date_list:temp = []df0 = pro.fut_daily(trade_date=str(date), fields='ts_code,trade_date,pre_close,pre_settle,close,settle,vol')df0['num'] = df0['ts_code'].apply(lambda x: len(x)) df0 = df0.loc[df0['num']>6]df0['code'] = df0['ts_code'].apply(lambda x: x[:-8])for f in code_list:exchange = f[-3:]code = f[:-4]try:df = df0.copy()df = df.loc[df['code']==code]df.sort_values(['vol'],inplace = True,ascending=False) df['year'] = df['ts_code'].apply(lambda x: x[-8:-6]) df['month'] = df['ts_code'].apply(lambda x: x[-6:-4]) df = df.reset_index(drop=True)time_delta = (int(df['year'][1]) - int(df['year'][0]))*12 + (int(df['month'][1]) - int(df['month'][0])) x = (df['close'][1] / df['close'][0] - 1)*(12/time_delta)print('success' + f,date)except:x = np.nanprint('failure' + f,date)temp.append(x)time.sleep(2)rr += [temp]rr = pd.DataFrame(rr, columns=f_list) rr.index = date_list rr.to_csv(filepath+r'\rr.csv', index=True)#%%總結
以上是生活随笔為你收集整理的利用Tushare合成期货主力连续数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WinForm:进度条的实现(异步)
- 下一篇: Multisim14.0的详细安装步骤