判斷是否為調倉日
ef is_adjust_day(self, dom=1):'''判斷是否是每月的調倉日。 :params int dom: 每月第幾個交易日進行調倉,缺省是第1個交易日。:return: 如果是調倉日,返回True,否則返回False。'''ret = Falsetoday = self.datetime.date()if self.month is None or self.month != today.month:self.month = today.monthself.num_of_days = 1else:self.num_of_days += 1if self.num_of_days == dom:ret = Truereturn ret
獲取指定檔位期權
def get_opt(self, otype='call', pos=1, when=1):'''根據ETF當前價格獲取期權。:params str otype: 期權類型,call或者put。:params int pos: 期權的位置,正數表示比當前標的價格高幾檔,負數表示比當前期權價格低幾檔。:params int when: 期權的到期日期,0/1/2/3分別表示當月/下月/當季/下季。:return: 期權代碼,如果沒有找到則返回None。'''etf_price = self.datas[0].close[0]# 獲取期權的到期日期m = self.get_maturity(when=when)# 篩選這個到日期的期權并按照行權價由低到高排序d = self.params.optsd = d[ (d['maturity'] == m) & (d['type'] == otype) ]d = d.sort_values(by=['strike'])# 建立一個按照行權價由低到高排列的期權代碼列表option_codes = []pos_etf = 0for _, row in d.iterrows():if row['strike'] >= etf_price :if pos_etf == 0 :option_codes.append(None)pos_etf = len(option_codes) - 1option_codes.append(row['code'])# 返回需要的期權代碼idx = pos_etf + posif idx >=0 and idx < len(option_codes) :return option_codes[idx]else:return None
計算結束日期
def get_maturity(self, when=1):'''獲取期權的結束日期:param int when: 哪一個到期日期。0/1/2/3分別表示當月/下月/當季/下季的到期日期。:return: 期權的到期日期'''# 獲取所有已經開始交易的期權代碼trading_codes = []for d in self.datas:if len(d) > 0:trading_codes.append(d._name)#print(trading_codes)
# 選出到期日期大于等于今天的期權合約df = self.params.opts#print(df)df = df[ df['maturity'] >= pd.to_datetime(self.datetime.date()) ]#print(df)
# 現在可以交易的期權的到期日期列表,按照從小到大排序m_list = sorted(list(set(df[df['code'].isin(trading_codes)]['maturity'])))#today = self.datetime.date()#print(today)#print(m_list)
# 如果給的參數不符合要求,返回最后一個日期if when > len(m_list):when = len(m_list) - 1#return m_list[when]if len(m_list)!=0:print(m_list)return m_list[0]else:pass
添加期權數據到backtrader
# 添加ETF日線數據到回測引擎。ETF是159919。日線數據在策略中通過self.datas[0]來引用,
df2['date'] = df2['date'].astype('datetime64[ns]')
data = PandasData(dataname=df2, datetime='date')cerebro.adddata(data, name='159919') # 添加期權數據到回測引擎
for opt in list(set(hs300['code'])):d = hs300[hs300['code']==opt].iloc[:,1:]d['trade_date'] = d['trade_date'].astype('datetime64[ns]')d.index = pd.to_datetime(d['trade_date'])data = PandasData(dataname=d)cerebro.adddata(data, name=opt)