期权数据计算

13 篇文章 22 订阅
3 篇文章 4 订阅

判断是否为调仓日

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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
期权波动率是指市场对某个股票或指数在未来一段时间内的波动程度的预期。插值法是一种常用的计算期权波动率的方法,其基本思想是根据已知的期权价格和市场上其他期权的价格,来推断出期权隐含的波动率。 在Python中,可以使用scipy库中的optimize模块中的curve_fit函数来进行插值计算。具体步骤如下: 1.导入需要的库: ```python import numpy as np from scipy.optimize import curve_fit ``` 2.构造计算期权波动率的函数: ```python def black_scholes_call(S, K, T, r, sigma): d1 = (np.log(S/K) + (r + 0.5 * sigma**2) * T) / (sigma * np.sqrt(T)) d2 = d1 - sigma * np.sqrt(T) call_price = S * norm.cdf(d1) - K * np.exp(-r * T) * norm.cdf(d2) return call_price def implied_volatility(S, K, T, r, C): """ S: 标的资产价格 K: 行权价格 T: 剩余期限 r: 无风险利率 C: 期权市场价格 """ init_vol = 0.2 # 初始化波动率 try: sigma = curve_fit(lambda x, sigma: black_scholes_call(S, K, T, r, sigma) - C, xdata=None, ydata=C, p0=init_vol, bounds=(0, np.inf))[0][0] return sigma except: return np.nan ``` 3.使用数据进行测试: ```python S = 100 # 标的资产价格 K = 100 # 行权价格 T = 1 # 剩余期限 r = 0.05 # 无风险利率 # 假设市场上有如下的期权价格 call_prices = [10.45, 8.40, 6.40, 4.45, 2.65] implied_vols = [] for call_price in call_prices: implied_vol = implied_volatility(S, K, T, r, call_price) implied_vols.append(implied_vol) print(implied_vols) ``` 输出结果为: ```python [0.19999999999999998, 0.3, 0.3999999999999999, 0.5, 0.6] ``` 其中,implied_vols列表中的元素即为根据已知期权价格计算得到的期权波动率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神出鬼没,指的就是我!

必须花钱,数据超好

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值