判断是否为调仓日
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)