我clone了你的代码后自己尝试了一些修改。其中一次修改中用了get_future_contracts 这个函数发现了 这个函数输出的合约有一些不懂比如24年2月份的时候可以交易的代码就有2402这个合约按道理这个合约应该下线了。
还有一个诡异的是23年6月经验两个函数都没有输出代码而你的回测中是买进6月份的到了7月份是要碰到进入交割月的。

# 导入函数库
from jqdata import *
## 初始化函数设定基准等等
def initialize(context):
# 设定沪深300作为基准
set_benchmark('I9999.XDCE')
# 开启动态复权模式(真实价格)
set_option('use_real_price', True)
# 过滤掉order系列API产生的比error级别低的log
# log.set_level('order', 'error')
# 输出内容到日志 log.info()
log.info('初始函数开始运行且全局只运行一次')
### 期货相关设定 ###
# 设定账户为金融账户
set_subportfolios([SubPortfolioConfig(cash=context.portfolio.starting_cash, type='index_futures')])
# 期货类每笔交易时的手续费是买入时万分之0.23,卖出时万分之0.23,平今仓为万分之23
set_order_cost(OrderCost(open_commission=0.000023, close_commission=0.000023,close_today_commission=0.0023), type='index_futures')
# 设定保证金比例
set_option('futures_margin_rate', 0.15)
g.tradecode=''
g.flag=0
# 设置期货交易的滑点
set_slippage(StepRelatedSlippage(2))
run_monthly(month_open, -5, time='9:01', reference_security='I9999.XDCE')
def get_近月合约(date):
ftpd=get_all_securities(['futures'])
ftpd['start_date']=[str(d)[0:10] for d in ftpd['start_date'].tolist()]
ftpd['end_date']=[str(d)[0:10] for d in ftpd['end_date'].tolist()]
ftpd['pz']=[str(x)[0:-4].upper() for x in ftpd['name'].tolist()]
ftpd['month']=[str(x)[-2::] for x in ftpd['name'].tolist()]
ftpd=ftpd[ftpd['pz']=='I']
month1=str(100+(int(date[-5:-3])+1))[1::]
month2=str(100+(int(date[-5:-3])+2))[1::]
if month1=='00':
month1='12'
if month2=='00':
month2='12'
ftpd=ftpd[(ftpd['start_date']< date)&(ftpd['end_date']>date)]
code1=ftpd[ftpd['month']==month1].index.tolist()[0]
code2=ftpd[ftpd['month']==month2].index.tolist()[0]
return code1,code2
## 开盘时运行函数
def month_open(context):
## 交易
date=str(context.current_dt.date())
log.info(date)
code1,code2 = get_近月合约(date)
code3,code4 = get_future_contracts('I')[0],get_future_contracts('I')[1]
if code1 == code3 and code2 == code4 :
log.info('两个函数输出代码一致')
else :
log.info('两个函数输入的代码不一致')
log.info(code1,code3,code2,code4)
2024-05-10