量化投资分析平台 迅投 QMT(四)获取标的期权的代码

迅投 QMT

我目前在使用

两个月前(2024年4月)迅投和CQF有一个互动的活动,进行了平台的一个网上路演,刚好我也去听了,感觉还是挺不错的。后来与“客服麻瓜”进行了对QMT的深入了解和使用,最后决定买了他们的服务。注册就可以进行试用,但是是有期限的。如果只是单方面的研究的话,还是建议用稍微便宜些的平台,我主要是需要期权的实时数据进行分析和交易。

有了底层标的如何获取期权的交易代码呢?

我们知道期权交易是有时效性的,目前A股开放的可交易期权都是欧式期权,也就是说只有到了交割日才能行权。这样对于我们交易者来讲还是比较友好的,计算起来更方便些。目前A股的期权的时效是当月、隔月、季度、半年,四个周期。按照今天2024年6月5日来看,沪深300ETF的期权的交割月是6月、7月、9月、和12月。如果到了7月,就是7月、8月、10月、和次年1月。说实话,的确挺烦人的,烧脑的逻辑。那我今天呢就给大家展示一下我实现的方式。

上代码

  1. 首先我们先把日期锁定为本月到次年上月,按照2024年6月距离,就是到2025年的5月;然后按照月份进行获取期权数据;最终把底层标的的期权交易代码全部获取出来。
def obtain_annual_opt_tickers(ticker_: str):
    current_month = str(dt.now().strftime('%Y%m%d'))   # 当月
    one_year_later = dt.now() + relativedelta(years=1)   # 次年上月计算
    one_year_later = str(one_year_later.strftime('%Y%m%d'))   # 次年上月转string格式
    
    #通过pandas的date_range()函数获取未来12个月所有的日期,频率为"M"month月份
    dates = pd.date_range(start=current_month, end=one_year_later, freq='M')
    
    # Convert the dates to the required format (YYYYMM)
    expiration_months = [date.strftime('%Y%m') for date in dates]   # 将获取到的12个月打包列表并设置格式为yyyymm
    
    option_tickers = []
    for month in expiration_months:
        option_tickers.append(
            xtdata.get_option_list(ticker_, month, isavailavle=True)   # 这里ticker_参数为标的资产,举例'510050.SH'
        )
    
    # Flatten the list 因为这里我们会收到套娃的列表,需要处理,扁平处理
    flattened_option_tickers = [item for sublist in option_tickers for item in sublist]
    
    return flattened_option_tickers

obtain_annual_opt_tickers('510050.SH')[-5:]

'>>> ['10007156.SHO', '10007229.SHO', '10007230.SHO', '10007245.SHO', '10007246.SHO']'
'>>> 这样我们就获取到目前底层标的资产所有的期权交易代码的ticker了'
  1. 拿到所有期权交易代码ticker后我们来进行遍历,把所有的标的资产期权信息做成一个dataframe,为后续做准备。
@cache
def option_details(ticker_: str):
    flat_opt_tickers_list = obtain_annual_opt_tickers(ticker_)
    
    df_opt_details_ = pd.DataFrame()
    
    for tick_ in flat_opt_tickers_list:
        xtdata.download_history_data(tick_, period='1d')
        opt_detail_ = pd.DataFrame([xtdata.get_option_detail_data(tick_)])
        df_opt_details_ = pd.concat([df_opt_details_, opt_detail_], axis=0)   # 纵向拼接
        time.sleep(1/25)
    df_opt_details_ = df_opt_details_.reset_index(drop=True)   # 重置引索,避免后面出问题

    # add exchange ID to the instrument ID for latter use
    new_instID = df_opt_details_['InstrumentID'] + '.' + df_opt_details_.ExchangeID.unique()[0]
    df_opt_details_['InstrumentID'] = new_instID   # 重新定义'InstrumentID'
    
    # retain only useful columns
    df_opt_details_ = df_opt_details_[['InstrumentID', 'InstrumentName', 
                                        'OpenDate', 'CreateDate', 'ExpireDate', 'PreClose', 
                                        'UpStopPrice', 'DownStopPrice', 
                                        'LongMarginRatio', 'ShortMarginRatio', 
                                        'VolumeMultiple', 
                                        'MaxMarketOrderVolume', 'MinMarketOrderVolume', 
                                        'MaxLimitOrderVolume', 'MinLimitOrderVolume', 
                                        'OptUnit', 'MarginUnit', 'OptExercisePrice', 
                                        'OptUndlRiskFreeRate', 'OptUndlHistoryRate', 
                                        'optType']].reset_index(drop=True)

    # construct a new column for days to expiry for volatility use
    # 重新定义交割日格式,为了计算剩余交割天数使用
    df_opt_details_['ExpireDate'] = pd.to_datetime(df_opt_details_['ExpireDate'], format='%Y%m%d')
    # 增加新列,到期交割日天数,后面会使用到,很重要的数据,BSM模型也会用到
    df_opt_details_['days_to_expiry'] = (df_opt_details_['ExpireDate'] - dt.now()).dt.days
    
    return df_opt_details_

option_details('510050.SH')
'>>> 我就不截完整图了,太大了,意思一下,大家知道是什么就好。'

期权信息截图
这样我们就获取到所有的底层标的期权的交易代码和期权完整信息了。

下一贴我来跟大家讲一讲我对期权的理解,普及一些期权这类衍生品的相关知识。

希望大家能够给予一键三连啥的,您的鼓励就是我最大的动力!

历史帖子

量化投资分析平台 迅投 QMT(一)激活python迅投对接端口
量化投资分析平台 迅投 QMT(二)服务器端订阅下载数据
量化投资分析平台 迅投 QMT(三)字典数据下载后读取成Dataframe形式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mike_Leigh

您的鼓励就是我最大的动力!

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

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

打赏作者

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

抵扣说明:

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

余额充值