7. 回测、实盘与优化:统一入口与不同模式

7.1. 1. 统一入口

用户通过 **qt.run(op, mode=…, kwargs) 触发运行。内部会:

  • 将 kwargs 与全局配置合并为 config(ConfigDict)。

  • 调用 op.run(config, datasource, logger),并传入 qteasy 的默认 datasource 与 logger。

mode 决定走哪条分支:

  • mode=0:实盘模式,进入 Trader 流程(定时触发、获取实时数据、生成信号、下单并记录)。

  • mode=1:回测模式,构建 Backtester,按 group_timing_table 逐步运行 Operator,模拟成交并输出资金曲线与绩效。

  • mode=2:优化模式,Optimizer 在参数空间搜索,每组参数执行一次回测,按目标函数汇总结果。

  • mode=3/4:追踪、预测等模式,参见文档与 API。

因此,同一 Operator 在不同 mode 下复用同一套“按时间步运行策略、混合信号”的机制,差异仅在数据来源与结果处理。

7.2. 2. 配置(config)的作用

config 包含资产池、回测区间、成本参数、资金计划等,回测/实盘/优化共用同一套配置结构。例如:

  • 资产池、资产类型、回测起止日;

  • 交易成本(费率、最低费用等);

  • 资金投入计划(invest_cash_amounts 等);

  • 实盘相关(账户、Broker 类型等,mode=0 时使用)。

config 由 **qt.run(…, kwargs) 与全局 QT_CONFIG 合并得到,并传入 op.run(config, …),由 Backtester、Trader、Optimizer 分别读取所需字段。

7.3. 3. 回测模式(mode=1)

  1. 准备历史数据:根据 config 中的资产池、回测区间与 Operator 内所有策略的 data_types、window_length,调用 check_and_prepare_backtest_data 等,从 DataSource 拉取并组装所需历史数据(含足够的历史窗口以覆盖区间起点)。

  2. 构建 Backtester:传入 Operator、资产列表、资金计划、交易价格数据、成本参数等,生成 Backtester 实例。

  3. 分支选择:若 op.check_dynamic_data() 为 False(策略不依赖过程数据),则走静态分支:一次性生成全部信号,再用 Numba 向量化回测;若为 True(策略使用 get_data('proc.xxx') 或旧式动态数据类型),则走动态分支:按步生成信号、按步模拟成交并更新过程数据,供策略下一步使用。详见 过程数据(proc.*)与动态回测

  4. 按步运行:按 group_timing_table 的每个时间步,调用 op.run_strategies(steps)(或等价接口),得到每一步的 (signal_type, signal)。

  5. 解析与模拟成交:将信号按 signal_type(PT/PS/VS)解析为买卖意图,再通过 backtest_step 等逻辑更新持仓、资金与交割队列,得到每日资金曲线与交易记录。

  6. 评价与输出:对资金曲线与交易记录做绩效评价(如夏普、回撤等),返回给用户并可选生成报告与图表。

7.4. 4. 实盘模式(mode=0)

  1. Trader 持有 Operator 与 config,按 run_freqrun_timing 与交易日历在交易日内的指定时刻触发任务。

  2. 获取当前时刻数据:根据策略声明从 DataSource(或实时接口)获取当前步所需的数据窗口。

  3. 运行 Operator:在该步调用 Operator 生成信号(与回测相同的 run_strategy 流程)。

  4. 解析并下单:将信号解析为订单,交给 Broker 执行(模拟或真实券商接口),并记录成交与持仓。

7.5. 5. 优化模式(mode=2)

  1. Optimizer 根据策略的 Parameter 定义确定参数空间(如网格、随机采样、遗传算法等)。

  2. 对每组参数:通过 set_parameter 等将参数写入 Operator,然后执行一次回测(即 mode=1 的流程)。

  3. 根据回测结果计算目标函数(如夏普比、收益回撤比等),汇总所有参数组合的结果。

  4. 输出较优参数组合及对应回测结果,供用户选择。

7.6. 6. 小结

回测、实盘、优化共享“Operator + 按时间步运行”的机制:都是先准备数据与 config,再按 group_timing_table 逐步调用策略并混合信号。差异仅在于:回测使用历史数据与 Backtester 模拟成交;实盘使用实时数据与 Trader/Broker 执行订单;优化则多次回测并比较目标函数。更多参数与用法见《使用教程》《回测并评价交易策略》《优化交易策略》与 API 参考。