判断是否为调仓日
ef is_adjust_day(self, dom=1):
'''
判断是否是每月的调仓日。
:params int dom: 每月第几个交易日进行调仓,缺省是第1个交易日。
:return: 如果是调仓日,返回True,否则返回False。
'''
ret = False
today = self.datetime.date()
if self.month is None or self.month != today.month:
self.month = today.month
self.num_of_days = 1
else:
self.num_of_days += 1
if self.num_of_days == dom:
ret = True
return 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.opts
d = d[ (d['maturity'] == m) & (d['type'] == otype) ]
d = d.sort_values(by=['strike'])
# 建立一个按照行权价由低到高排列的期权代码列表
option_codes = []
pos_etf = 0
for _, row in d.iterrows():
if row['strike'] >= etf_price :
if pos_etf == 0 :
option_codes.append(None)
pos_etf = len(option_codes) - 1
option_codes.append(row['code'])
# 返回需要的期权代码
idx = pos_etf + pos
if 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)