第三周期货回测连接仿真交易 -内测
  WisDng 9天前 78 0

一 期货回测连接

第1步先按内测教程通过在工作流界面的AI助手,一句话生成整个回测框架和第一次的初步代码: “帮我写一个期货交易策略的回测,交易逻辑是动量和波动率,在黄金,白银,螺纹钢这3个合约上测试,时间范围设定在最近一年”
76fae4d34d99820a9c8d48268953b6f9.png

##1.1
生成后,进入节点python代码页面中,调用 量化回测测量引擎AI,(非常必要):
因为 初步代码中只是非常粗糙的,尤其期货品种的具体产品号均是不对的。

与策略AI对话:
“回测策略需求分析: 回测中没有出现买卖记录,检查是否是 黄金,白银,螺纹钢的国内 具体期货代码有误?”

0393eef79ca018e4d62829d095ab62c0.png
AI会进行修正:
下面是针对你原策略做的精确修改,核心目标是:
不再使用 AU_DOMINANT.SHF / AG_DOMINANT.SHF / RB_DOMINANT.SHF 这种“虚拟连续合约”作为下单和 data 索引的代码。
改为使用 panda_data.get_future_dominant 预先获取整个回测区间 内,黄金(AU)、白银(AG)、螺纹钢(RB) 每一天的 真实主力合约代码,例如:

AU → AU2406.SHF

AG → AG2508.SHF

RB → RB2510.SHF

所有行情访问 data[…] 和下单 target_future_group_order、long_future_target / short_future_target 都统一使用这些真实合约代码,因此在回测引擎中是 可交易,并且能取到 Bar 的具体合约,从而会产生真实的买卖记录。

关键修改点说明

  1. 在 initialize 中预加载主力合约映射

新增:

context.dominant_map = {}

dom_df = panda_data.get_future_dominant(
underlying_symbol=context.products,
start_date=start_date,
end_date=end_date,
)
for _, row in dom_df.iterrows():
prod = str(row[“underlying_symbol”]).upper()
d = str(row[“date”])
sym = str(row[“symbol”]) # 已是 AU2406.SHF 这种真实合约
context.dominant_map[(prod, d)] = sym
并进一步用这些真实合约的历史日线 get_market_data(symbol=all_symbols, …) 来拼接 context.hist_close[AU/AG/RB]。

这样,动量、波动率的历史时间序列就是由真实合约的收盘价拼起来的,不再依赖虚拟的 _DOMINANT.* symbol。

  1. 新增 _get_dominant_symbol_for_date

替代原来的 _get_dominant_symbol,逻辑是:

先直接查 (品种, 当日):
key = (prod_u, trade_date)
if key in context.dominant_map:
return context.dominant_map[key]

若当日没有记录,就向前寻找最近一个日期,返回最近的主力合约:
dates = [d for (p, d) in context.dominant_map.keys() if p == prod_u and d <= trade_date]
last_d = max(dates)
return context.dominant_map.get((prod_u, last_d))

这样每天都会拿到一个具体、可交易的合约代码,而不是虚拟的 _DOMINANT.

  1. _ensure_today_price_cached 改为用真实合约读行情

原来是:

if prod in [“AU”, “AG”]:
symbol = f"{prod}_DOMINANT.SHF"
else:
symbol = “RB_DOMINANT.SHF”
bar = data[symbol]
现在改为:

symbol = _get_dominant_symbol_for_date(context, prod, trade_date)
bar = data[symbol]
即用当天的真实主力合约从 data 中取 bar.close,写入 context.hist_close[p][trade_date]。

只要回测引擎订阅了期货品种,就能在 data 里找到这些具体合约,避免因合约代码不匹配导致 KeyError,从而后续手数计算不会被 continue 掉。

  1. 下单部分统一使用真实合约

在 handle_data 中,原来是:

symbol = _get_dominant_symbol(prod, trade_date) # 返回 AU_DOMINANT.SHF
bar = data[symbol]

long_dict[symbol] = hands
现在改为:

symbol = _get_dominant_symbol_for_date(context, prod, trade_date) # 返回 AU2406.SHF 这样的真实合约
bar = data[symbol]

long_dict[symbol] = hands # 或 short_dict
后面调用:

target_future_group_order(context.account, long_dict, short_dict)
或降级使用:

long_future_target(context.account, sym, h, style=MarketOrderStyle)
short_future_target(context.account, sym, h, style=MarketOrderStyle)
这些函数都会将 具体合约代码 作为参数传给回测引擎,因此会产生实际的开仓 / 平仓委托和成交,解决你之前“回测中没有买卖记录”的问题。

你回测时可以重点检查的点

在 before_trading 里可以临时加一段打印,用来确认:

今天 AU/AG/RB 分别映射到哪个合约,例如 AU2406.SHF、AG2508.SHF、RB2510.SHF;

这些合约在回测界面的合约列表里确实存在。

回测结果页里应该能看到:

订单列表中存在这些具体合约的买入开仓 / 卖出开仓 / 平仓记录;

持仓列表中有对应品种的仓位变化。

如果跑完后依然没有成交,可以把回测起止日期和回测日志里出现的合约代码发出来,我可以再帮你对照数据接口和回测引擎的合约命名,进一步排查。

二 修改好之后,保存,并运行进行回测:

ee187989e5391fcdc6df6d3bb3d4dd85.png
9a7cd8efaad4145bb1ea7ee689027bb7.png

其中回测可以选 用按天交易,还是按1m,1分钟交易。
前后两个对比了下,用1分钟的收益仅仅略高了一点点:
89989bb269edf89d28d3413563f4fd02.png
这也说明策略因子的信号是更偏日频,而非分钟级别的

2.1 回测的AI分析功能有为下一步调参及调试打好基础

如上图,右边:

  • 整体来看,这个期货动量+波动率策略的回测表现可以评为 A(优秀),属于“高收益、低回撤、风险控制较好”的组合。 整体评估 年化收益率约 33.1%,显著高于基准上证指数的 23.1%,年化超额约 10pct。 夏普比率 2.23,在量化实盘可行性标准中属于非常优秀水平(>2)。 最大回撤约 -6.47%,在中高收益策略中回撤极小,收益/回撤比超过 5,风险收益匹配非常优。 信息比率 0.52,说明相对于基准的超额收益较稳定,有持续获取 alpha 的能力。 风险与稳定性 波动率约 13.1%,在期货多品种策略中偏温和,整体风险水平适中。 下行波动(downside_risk)约 10.8%,Sortino 0.93,说明“向下”波动仍然存在,但被较高收益充分覆盖。 Beta 约 0.36,相对股指(上证指数)市场敏感度不高,有一定对冲或分散作用。 跟踪误差 0.15,说明相对基准走出了一条差异较大的曲线,主要承担的是主动风险而非单纯跟随市场。 优点 高风险调整收益:夏普>2、超额收益显著同时回撤极低,组合质量很高。 防守能力强:最大回撤仅 ~6.5%,对于趋势反转和极端行情有较好缓冲。 与股市相关性不高:beta 较低、信息比率适中,适合作为股票组合的卫星策略或对冲组件。 可能的不足与注意点 Sortino 相比 Sharpe 偏低,说明下行波动相对显著,收益中包含一定“踩节奏”的风险;在单边大反向行情中可能出现阶段性回撤。 跟踪误差较高,说明路径与基准差异大,如果用于对冲或机构组合,需要单独评估资金方对“偏离指数路径”的容忍度。 回测区间相对集中在近一年左右,结果可能对特定宏观环境(例如商品波动结构)有适应性偏差,仍需更长周期和样本外验证。 后续优化建议 周期扩展:建议将回测拉长到至少 3–5 年,并切分成样本内/样本外,验证在不同利率和大宗周期下的稳健性。 风险再优化:在当前回撤已经很低的前提下,可以尝试略微提高总风险预算或单品种目标波动,以换取更高收益,但需严格控制回撤不超过 15%。 市场状态过滤:考虑加入趋势/波动状态过滤(如 VIX、宏观或期货波动分位数),在极端高波动环境下动态降杠杆,进一步压缩尾部风险。 品种与参数调优:可测试增加或替换部分品种(如黑色系、工业品)以及调整 lookback、rebalance 周期,比较不同组合下 Sharpe 与最大回撤的变化,以确定更优稳健参数。 如果你愿意,我可以结合目前回测质量,给出一套具体的参数微调方案(例如风险预算、调仓周期、目标波动等)供你下一轮回测使用。

即下一轮可以进行AI参数微调,风险预算,波动率等。

最后一次编辑于 9天前 0

暂无评论

推荐阅读
  tyler   24小时前   16   0   0 新手入门