本节摘要:策略构建是把一句话假设翻译成完整状态机的过程——入场、持仓、退出、仓位四件套缺一不可;回测则是对这套规则的历史重演,其唯一价值取决于两条纪律:数据时点严格对齐、交易成本如实入账。本节承接数据工程,是流水线里"想法变工程品"的转换站。
"跌破年线就卖,站上年线就买"——这类口语化策略描述的通病,是不定义持仓期间发生什么。真实的策略必须回答一串问题:信号触发后是次日开盘成交还是当日收盘成交?持仓期间止损线设在哪里?止损触发后是清仓还是减半?同方向信号重复出现时加不加仓?资金不够时按什么优先级分配?每一个没有明确答案的分支,都会在实盘里变成"临场发挥",而临场发挥正是回测与实盘偏差的重要来源。
工程上的解法是把策略写成显式状态机:空仓、持仓、减仓、平仓是状态,信号与风控事件是状态转移的触发器,每个转移都定义了动作与参数。状态机的另一个好处是可审计——任何一笔历史交易都能回溯到"哪个状态、哪个条件、哪个数值"触发了它。
军规一:数据只读、时点冻结。回测引擎在计算第 N 根 K 线的信号时,只允许访问第 N 根之前已经收盘的数据。听起来天经地义,实践中却极易被破坏:用当日收盘价算出的指标去成交"当日收盘价"、滚动统计窗口的右端点包含当前未完成 K 线、用当期财报数据回测它在数月后才公布的时段——这些都是向前看偏差的常见形态。预防手段也很朴素:信号计算与成交执行强制错开一个时点(今日收盘算信号,明日开盘成交),引擎层面对未来数据访问做断言检查。
军规二:成本如实入账。佣金、印花税、滑点、冲击成本,一项都不能少。成本参数的选取要有依据:可以从近期实际成交记录统计,也可以参考第四章 4.5 节的敏感性实验做区间假设。没有成本入账的回测,本质是在测"如果交易免费我能赚多少"——一个与实盘无关的问题。
军规三:每笔交易可追溯。回测输出不应只有一条净值曲线。每笔交易要能查到:触发信号及其计算快照、成交时间与价格、成本明细、当时的持仓与风控状态。这份日志是第四章排错实录的原材料——没有它,偏差分析无从下手。
下面的伪码骨架展示了符合这三条军规的最小回测循环:
初始化: 账户 = {现金, 持仓=0}, 日志 = [] 对每个交易日 t (从第二个交易日起): 数据快照 = 取 t-1 日及之前的数据 # 军规一: 时点冻结 信号 = 策略.计算(数据快照) 订单 = 策略.合成订单(信号, 账户状态) 成交 = 撮合模拟(订单, t日开盘行情, 成本模型) # 军规二: 成本入账 账户 = 更新(账户, 成交) 日志.追加(信号快照, 订单, 成交, 账户) # 军规三: 全量留痕 输出: 净值曲线, 交易明细, 风控事件表
成熟的信号系统往往分三层。初级脉冲追求灵敏度:量价背离、波动突变、资金异动,宁可多报不可漏报。二级过滤叠加环境约束:同样的形态,在高波动状态与低波动状态下的含义可能完全不同,过滤层负责把"什么环境下这个信号 historically 可信"编码成条件。三级确认引入跨维度证据:价格信号要与成交量、相关性结构或基本面事件相互印证。分层不是为了堆复杂度——每一层都在回答一个明确的问题:这是不是真信号、现在是不是合适的环境、有没有旁证。层级设计得过深也有代价:信号覆盖率下降,参数数量翻倍,过拟合风险随之上升。层数与样本量之间要算账,这是工程取舍而非教条。
| 常见回测偏差 | 产生机制 | 一句话检验法 |
|---|---|---|
| 向前看偏差 | 决策用了决策时尚未存在的数据 | 把"未来"数据整体加噪声,净值应明显退化 |
| 幸存者偏差 | 样本池缺少已退市标的 | 检查股票池是否含退市名单 |
| 复权错误 | 除权跳空被当成行情 | 抽查除权日附近的交易是否成串 |
| 成交假设过优 | 信号价与成交价同点 | 信号与成交强制错开一个时点 |
| 忽略停牌 | 平仓指令遇到涨跌停无处理 | 检查日志里是否有"想卖卖不出"的状态 |
⚠️ 常见坑:把回测报告的夏普比率当唯一判据。夏普是筛选指标,不是判决书——它不回答收益来源(第一章 1.3)、不回答容量与执行(第四章),更不回答策略什么时候失效(第六章)。
练一遍翻译。原始口语:"这只 ETF 涨势变强就买一点,涨不动了就走。"翻译先追问四个问题。"涨势变强"的可操作定义是什么?——定为"五日均线上穿二十日均线,且当日成交量高于二十日均量"。买一点是多少?——定为目标仓位的固定比例,并设单日最大建仓次数。"涨不动了"呢?——定为"收盘价连续两日低于五日均线"或"从入场后最高点回撤超过两倍平均波幅",两者谁先触发谁生效。持仓期间还有什么例外?——定为"账户当日回撤超过阈值,暂停新开仓"。四个答案凑齐,这段口语就变成了一个可回测的状态机:空仓态监听上穿事件,持仓态监听两套退出事件,任何时刻受账户级熔断约束。翻译的过程会逼你发现口语里藏着的所有含糊之处——而含糊之处,就是实盘里临场发挥的入口。反过来检验也成立:如果你无法把一个策略描述翻译成状态机,说明它还没到能回测的程度,不是回测工具不行。
问:回测引擎是自己写还是用开源框架? 学习阶段用开源框架,生产阶段视需求而定。自建的核心价值不在功能,而在对每一条撮合假设的完全掌控——执行语义的每个细节(成交时点、部分成交、重连行为)都可审计。用现成框架时,至少要读完它的撮合模块,否则你提交的是一个自己没读过的实验方案。
问:回测跑多少年数据合适? 以覆盖至少一轮完整的市场风格周期为底线——只有单一风格样本的策略结论,本质是"在牛市或熊市里成立"。样本越长越好是错觉:更早的年代市场机制差异大,太老的数据参考价值有限。务实的答案是取覆盖涨跌各阶段的区间,并单独报告分时段表现。
问:怎么判断一个回测结果"好到可疑"? 看三个危险信号:收益几乎不受成本参数影响(说明毛利奇厚,多半有数据问题);回撤浅得不像话(对照随机对照的回撤分布);业绩集中在极短时段(集中度异常)。三条中任何一条出现,先怀疑回测本身,再怀疑市场。
💡 关键直觉:回测引擎的本质是"历史的市场模拟器 + 审计员"。它模拟得像不像市场,决定结论像不像实盘;它审计得细不细,决定你下次迭代有没有线索。
规则跑通之后,下一节进入量化研究最甜蜜也最危险的环节——参数优化与验证。