股指期货贴水收益研究(三)

发布于: 修改于:雪球转发:0回复:7喜欢:30

股指期货贴水收益研究(一)

股指期货贴水收益研究(二)

以前发过两篇文章(见上),对利用股指期货贴水产生收益,进行了系统的量化研究与回测。最近总有些朋友问我,这个东西是在哪个平台怎么回测的。于是,我整理了一下代码,在这里公布出来。

有几点说明一下:

1、代码的功能是对股指期货贴水收益进行回测:就是模拟买卖,然后把收益曲线画出来。

2、代码是运行在米筐量化ricequant.com上面。使用是时候,可以新建一个含有期货交易的策略,把我的代码直接粘贴进去就可以了。

3、代码是Python语言的。因为雪球这里对代码没有高亮格式等显示,看着会比较乱。所以我把代码粘贴到了CSDN,链接在这里:

网页链接

4、如果你没有CSDN,就想在这里看,那我也把代码粘贴到了下面。

5、更新一下回测数据,这次回测到了上周末,即2021年1月30日。其结果如下图:

(一)100万资金只开仓1手IC的回测结果

(二)100万资金开仓2手IC的回测结果

从图中可见,还是和预期一样。与我前面文章中的结论是一脉相承的。

 $上证指数(SH000001)$  $中证500(SH000905)$ $沪深300(SH000300)$  

最后,代码文本如下:

#
# 股指期货贴水收益回测

# 策略:始终持有股指期货IC,吃贴水;每月初,卖出当月合约,买入下月合约,实现移仓
# 回测平台:米筐量化 网页链接
# 作者微信公众号:北京耳东陈 
# 雪球主页: 网页链接


import datetime
from dateutil.relativedelta import relativedelta

# 在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间做传递。
def init(context):
    # context内引入全局变量
    context.first_day = True
    context.month = 0
    context.trading_days = -99
    
    # 实时打印日志
    #logger.info("RunInfo: {}".format(context.run_info))
    

# before_trading此函数会在每天交易开始前被调用,当天只会被调用一次
def before_trading(context):
    pass


# 返回下个月的合约代码
def next_month_code(context, future_name):
    d = context.now + relativedelta(months=+1)
    return  future_name + d.strftime("%y%m")


# 始终持有股指期货合约,每月移仓只下月合约
# 月初换下月,如:2月初,换3月合约
def holding(context, bar_dict, future_name, stock):
    
    # 持有的合约数量;为了便于测试,假设100万本金,开仓 NUMBER_OF_CONTRACT 手
    NUMBER_OF_CONTRACT = 2
    
    # 获取下个月的合约代码
    future_code = next_month_code(context, future_name)
    
    # 初始状态是:持仓
    # 程序运行的第一天,开仓买入
    if context.first_day:
        buy_open(future_code, NUMBER_OF_CONTRACT)
        print("初始开仓买入", future_code, "买入价格", current_snapshot(future_code).last)
        context.first_day = False
        context.month = context.now.month
        return
    
    # 进入一个新的自然月
    if context.now.month != context.month:
        context.month = context.now.month
        context.trading_days = 1
        return

    # 交易日计数
    context.trading_days += 1

    # 每月的第2个交易日移仓至下月合约
    if context.trading_days == 2:
        
        # 平仓现有的当月合约
        for fid in context.future_account.positions:            
            sell_close(fid, NUMBER_OF_CONTRACT)
        
        # 开仓下月合约
        buy_open(future_code, NUMBER_OF_CONTRACT)
        future_price = current_snapshot(future_code).last
        print("开仓买入", future_code, 
              "买入价格", future_price,
              "买入时的贴水", "%.2f" % (current_snapshot(stock).last - future_price))
        
    pass



# 你选择的证券的数据更新将会触发此段逻辑,例如日或分钟历史数据切片或者是实时数据切片更新
def handle_bar(context, bar_dict):
    
    # 持有股指期货IC
    holding(context, bar_dict, "IC", "000905.XSHG")
    
    # 也可以回测持有股指期货IH与IF,但由于后两种贴水少,超额收益少于持有IC
    
    #holding(context, bar_dict, "IH", "000016.XSHG")
    #holding(context, bar_dict, "IF", "000300.XSHG")
    
    
# after_trading函数会在每天交易结束后被调用,当天只会被调用一次
def after_trading(context):
    pass

全部讨论

2021-02-02 16:02

感谢分享!我从去年以来也在做IC贴水的套利,最近在想怎么能规避18年那种下跌,远期贴水减少的情况,想能否开2手合约,最近月和最远月,然后每个月滚动替换,始终持有最近和最远的两个

2022-06-14 16:58

请问菜鸟入行,想买点期指书籍学习,劳烦推荐一下,感激不尽