0
点赞
收藏
分享

微信扫一扫

期权数据计算

SDKB英文 2022-02-20 阅读 50
python

判断是否为调仓日

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)
举报

相关推荐

0 条评论