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 规则分类的灰度迁移策略
基于六类规则的依赖关系与风险等级,推荐以下分阶段迁移顺序:
- 第一阶段(低风险): 迁移过滤规则与执行规则。这两类规则不改变信号逻辑,仅影响信号筛选与订单提交,回测结果偏差最小。
- 第二阶段(中风险): 迁移仓位管理规则与风控规则。需确保资金计算精度与回测环境一致,建议使用相同的浮点截断策略。
- 第三阶段(高风险): 迁移入场规则与出场规则。这是策略的核心逻辑,必须通过 A/B 回测验证迁移前后的信号序列完全一致。
下图展示了规则分类与迁移阶段的对应关系:
核心结论: 六类规则在灰度迁移中不应同时改造。按照“外围 → 核心”的顺序,先迁移过滤与执行规则,再迁移仓位与风控,最后迁移入场与出场规则。每一阶段完成后,必须与基线回测结果进行逐笔信号比对,确保迁移后的规则行为与原始策略一致。