3. 回测规则分类:入场、出场、仓位、风控、过滤与执行

在将 Backtrader 策略从单机脚本向灰度生产环境迁移时,首要任务是对策略中的所有逻辑单元进行解耦与归类。一套完整的量化回测规则可拆解为六大核心类别:入场规则、出场规则、仓位管理规则、风控规则、过滤规则与执行规则。每一类规则在迁移过程中拥有独立的配置化路径与灰度验证策略。

3.1 六大规则分类总览

下表从定义、典型信号与迁移关注点三个维度,对六类规则进行横向对比:

规则类别 核心定义 典型信号 / 参数 灰度迁移关注点
入场规则 触发开仓的条件集合 金叉、突破均线、动量拐点 信号延迟、滑点模拟、K线闭合判定
出场规则 触发平仓的条件集合 死叉、移动止盈、时间止损 出场优先级、部分平仓逻辑
仓位管理规则 每次开仓的头寸计算方式 固定手数、百分比、凯利公式 资金精度、最小交易单位截断
风控规则 全局或单笔的风险限制 最大回撤、单笔止损、杠杆上限 实时检查 vs 回测后校验
过滤规则 对信号进行二次筛选的条件 成交量过滤、波动率过滤、时间窗口 过滤顺序、数据依赖完整性
执行规则 订单如何被提交与成交 限价单、市价单、冰山订单 撮合引擎差异、成交率模拟
迁移原则: 在灰度迁移的第一阶段,建议将入场规则与出场规则作为首批独立模块进行配置化改造,因为它们对策略收益的敏感度最高,且最容易通过 A/B 回测验证迁移正确性。

3.2 规则分类与策略执行流程

六类规则在策略的一次完整交易生命周期中按固定顺序协作。下图展示了从数据输入到订单输出的规则执行流水线:

策略规则执行流水线(单次交易周期) 数据输入 过滤规则 入场规则 仓位管理 持仓阶段 风控规则 出场规则 执行规则 订单输出 风控规则在持仓期间 持续并行检查
流水线解读: 数据经过过滤规则筛选后,进入入场规则判定;满足条件则通过仓位管理计算头寸,进入持仓阶段。持仓期间风控规则与出场规则持续监控,一旦触发则交由执行规则生成最终订单。这种流水线结构在迁移时天然适合拆分为独立的微服务或配置模块。

3.3 各类规则的 Backtrader 实现要点

3.3.1 入场规则

在 Backtrader 中,入场规则通常写在 next() 方法内,通过判断指标交叉或价格突破来触发 self.buy()。迁移时需将入场条件提取为可配置的 JSON 或 YAML 规则块:

# 迁移前:硬编码入场
if self.sma5[0] > self.sma20[0] and self.sma5[-1] <= self.sma20[-1]:
    self.buy()

# 迁移后:配置化入场规则
# config/entry_rules.json
# {"type": "cross_above", "fast": "sma5", "slow": "sma20"}

3.3.2 出场规则

出场规则包含止盈、止损、时间出场与反向信号出场四种子类型。在灰度迁移中,出场规则的执行优先级需要显式定义:

  • 止损 > 时间出场 > 止盈 > 反向信号(默认安全顺序)
  • 通过 self.sell(exectype=Order.Stop) 实现止损单
  • 通过 self.sell(exectype=Order.Limit, price=entry_price * 1.1) 实现止盈单

3.3.3 仓位管理规则

仓位管理决定每次开仓的头寸规模。Backtrader 提供 self.sizer 接口,迁移时应将仓位计算逻辑从策略中剥离:

class FixedPercentSizer(bt.Sizer):
    params = (('percents', 20),)  # 每次使用 20% 可用资金

    def _getsizing(self, comminfo, cash, data, isbuy):
        position_value = cash * (self.params.percents / 100.0)
        size = position_value // data.close[0]
        return size

3.3.4 风控规则

风控规则在回测与实盘中的行为差异最大。回测中通常使用事后校验,而灰度迁移要求实时阻断。典型风控参数包括:

风控指标 回测实现方式 灰度迁移目标
最大回撤限制 回测结束后计算 盘中实时检查,超过阈值停止开仓
单笔最大亏损 通过止损单实现 独立风控模块,与策略解耦
杠杆上限 仓位管理间接控制 全局杠杆计数器,逐笔校验

3.3.5 过滤规则

过滤规则用于剔除无效信号,降低交易频率。常见过滤条件包括:

  • 成交量过滤: 当日成交量低于 20 日均量 50% 时不开仓
  • 波动率过滤: 日内振幅小于 1% 时不开仓
  • 时间窗口过滤: 仅允许在 10:00-14:30 之间开仓

过滤规则应放在入场规则之前执行,以减少不必要的计算开销。

3.3.6 执行规则

执行规则控制订单的提交方式与成交模拟。在 Backtrader 中,通过 exectype 参数指定:

# 市价单(回测默认)
self.buy(exectype=bt.Order.Market)

# 限价单(灰度迁移推荐,更贴近实盘)
self.buy(exectype=bt.Order.Limit, price=data.close[0] * 0.99)

# 冰山订单(需自定义执行器)
self.buy(exectype=bt.Order.Limit, price=data.close[0],
         size=1000, valid=bt.Order.DAY)
迁移陷阱: 回测中使用市价单通常能全部成交,但灰度环境引入限价单后,未成交率会显著上升。建议在迁移初期同时记录“信号触发次数”与“实际成交次数”,作为规则正确性的辅助验证指标。

3.4 规则分类的灰度迁移策略

基于六类规则的依赖关系与风险等级,推荐以下分阶段迁移顺序:

  1. 第一阶段(低风险): 迁移过滤规则与执行规则。这两类规则不改变信号逻辑,仅影响信号筛选与订单提交,回测结果偏差最小。
  2. 第二阶段(中风险): 迁移仓位管理规则与风控规则。需确保资金计算精度与回测环境一致,建议使用相同的浮点截断策略。
  3. 第三阶段(高风险): 迁移入场规则与出场规则。这是策略的核心逻辑,必须通过 A/B 回测验证迁移前后的信号序列完全一致。

下图展示了规则分类与迁移阶段的对应关系:

规则分类 → 灰度迁移阶段映射 第一阶段(低风险) 过滤规则 执行规则 信号筛选 + 订单提交 回测偏差 < 1% 第二阶段(中风险) 仓位管理 风控 资金计算 + 风险限制 需精度对齐 第三阶段(高风险) 入场规则 出场规则 核心信号逻辑 必须 A/B 验证
核心结论: 六类规则在灰度迁移中不应同时改造。按照“外围 → 核心”的顺序,先迁移过滤与执行规则,再迁移仓位与风控,最后迁移入场与出场规则。每一阶段完成后,必须与基线回测结果进行逐笔信号比对,确保迁移后的规则行为与原始策略一致。