两周前,我收到一位读者的消息。他在TSLab中组装了一个策略。三年历史数据的回测显示了惊人的结果:年化收益+280%,最大回撤8%。

他把策略部署到模拟账户。一个月后的结果:亏损12%。

哪里出了问题?问题不在构建器。问题在于他是如何测试的

这是一个经典故事。可视化构建器使策略组装变得简单。但它们并不能使策略正确。大多数错误不是在组装过程中发生的,而是在测试过程中。

在本文中——90%的构建器新手都会踩到的五个坑,以及如何避免。

错误 #1:过度优化(曲线拟合)

什么是过度优化:

你拿到一个策略,运行参数优化。尝试SMA从10到100步长为1。尝试RSI从20到80步长为5。找到在历史数据上表现最好的组合。

恭喜:你刚刚创建了一个在该特定历史时期有效的策略。

为什么危险:

曲线拟合是指策略对历史数据的适应性过强,以至于在新数据上失效。你找到的不是市场规律,而是随机噪声。

真实案例:

在2020-2023年数据上优化SMA交叉。最佳结果:SMA(37)和SMA(83)。年化收益+180%。

在2024年运行:亏损5%。

为什么?因为37/83的组合没有逻辑基础。这是对噪声的拟合。

如何识别:

  • 参数太多(超过3-4个)
  • 历史结果完美(年化200%+且无回撤)
  • 参数看起来随机(37、83而非整数20、50)
  • 参数改变1-2个单位,结果急剧下降

如何避免:

1. 限制参数数量

对于经典测试,使用不超过2个优化参数。越少越好。

简单策略寿命更长。复杂策略很快失效。

2. 样本外测试

将历史数据分为两部分:

  • 样本内(70%):参数优化
  • 样本外(30%):结果验证

如果样本外结果明显更差——过度优化。

在TSLab中:在2020-2022年优化,在2023年测试。

在Designer中:同样逻辑,手动更改时间段。

3. 前推分析

更可靠:运行滑动窗口

示例:

  • 在2020-2021年优化,在2022年测试
  • 在2021-2022年优化,在2023年测试
  • 在2022-2023年优化,在2024年测试

如果策略在所有时期都表现良好——它是稳健的。

4. 检查参数稳定性

构建优化结果的热力图。

如果最佳结果是红色海洋中的单个”热点”——这是过度优化。

如果存在良好结果的宽阔”平台”——策略对参数变化是稳定的。这很好。

TSLab和NinjaTrader提供3D优化图表。使用它们。

错误 #2:前视偏差

什么是前视偏差:

你的策略意外使用了决策时尚不可用的信息。

经典例子:

你使用K线收盘价的指标,但信号在下一根K线开盘时生成。

问题:当K线收盘时,你已经知道它的最高价/最低价/收盘价。在实际交易中——你不知道。

在哪里出现:

在TSLab中:

TSLab将K线时间计算为开始时间。如果不考虑这一点——很容易产生前视偏差。

示例:K线N上的”收盘价”模块返回的值只有在该K线收盘之后才能知道。

如果你基于Close[0]生成信号——这是前视偏差。应该使用Close[1]。

在Designer中:

同样的问题。Designer在已收盘的K线上工作。如果你的逻辑基于当前K线——检查这些数据在实时中是否可用。

在NinjaTrader中:

Strategy Builder有一个选项”Calculate on bar close”。如果禁用——信号在每个tick上生成,包括未收盘的K线。如果启用——仅在收盘时。

对于大多数策略,你需要”Calculate on bar close = true”。

如何避免:

  1. 仅使用已收盘的K线
    • 如果策略在H1上,信号仅在小时K线收盘后出现
    • 不要使用当前K线数据生成信号
  2. 检查数据延迟
  3. 在实盘测试前先在模拟账户运行
    • 如果回测显示每月100笔交易,而模拟只有10笔,问题在于前视偏差

错误 #3:生存偏差

什么是生存偏差:

你在今天存在的股票上测试策略。但在三年中,一些公司破产、退市或被收购。

它们不在你的回测中。但在实际交易中它们存在过。

真实案例:

俄罗斯股票策略。2020-2023年回测。测试的股票列表包括:

  • 储蓄银行 ✅
  • 天然气工业公司 ✅
  • Yandex ✅
  • TCS控股 ✅

但缺少:

  • 俄铝(2022年退市)❌
  • 莫斯科交易所(2022年临时退市)❌
  • 下跌90%并从视线中消失的股票 ❌

你的策略”忘记”了这些证券上的亏损。生存偏差使年化收益虚高1-4%

在哪里出现:

在TSLab和Designer中:

如果你通过券商连接加载股票列表——你只能获得当前的股票。退市的不在其中。

在NinjaTrader中:

期货也有同样的问题。过期的合约通常不会出现在回测中。

如何避免:

  1. 使用包含退市证券的数据库
  2. 在指数上测试,而非精选股票
    • 如果策略是MOEX股票——使用整个MOEX指数,而非仅前10名
  3. 检查测试期间有多少证券消失
    • 如果测试3年而股票列表没有变化——有问题
  4. 添加流动性过滤器
    • 策略不应交易日成交额低于1000万卢布的股票
    • 这降低了在退市前进入股票的风险

错误 #4:忽略佣金、滑点和执行现实

什么是:

回测假设:你总是以你想要的价格买入。订单立即执行。佣金=0。

现实:佣金、滑点、延迟、部分成交。

真实案例:

分钟K线策略。每月200笔交易。每笔交易平均利润:0.15%。

券商佣金:入场0.05%,出场0.05%。往返共0.1%。

净利润: 0.15% - 0.1% = 每笔交易0.05%。

200笔交易 * 0.05% = 每月10%。看起来不错。

但加上每笔交易0.03%的滑点。现在:0.15% - 0.1% - 0.03% = 0.02%

200笔交易 * 0.02% = 每月4%。不再那么令人印象深刻了。

如果价差很宽(流动性差的股票),滑点0.1%?策略就是亏损的。

如何避免:

1. 在构建器中配置佣金

TSLab: 设置 → 交易 → 佣金。输入券商的实际佣金(通常0.03-0.05%)。

Designer: 回测窗口有一个”佣金”字段。以绝对值(卢布)或百分比设置。

NinjaTrader: 策略 → 属性 → 佣金。输入每合约佣金。

fxDreema: 在生成的MQL代码中,需要手动添加价差检查。

2. 添加滑点

TSLab和NinjaTrader允许单独配置滑点。对于交易流动性好的股票的零售交易者:1-3个tick。

对于流动性差的:5-10个tick或更多。

3. 在真实价差上测试

如果策略在价差内交易(剥头皮)——检查利润是否覆盖价差大小。

简单公式:

每笔交易利润 > 佣金 * 2 + 平均价差 + 滑点

如果不是——策略无法在实盘中生存。

4. 检查交易数量

交易越多,佣金的影响越大

每年100笔交易——佣金不是关键。

每年1000笔交易——佣金可能吃掉所有利润。

规则: 如果策略在扣除佣金后每笔交易收益不到0.5%——它处于边缘。市场稍有恶化就会让它失效。

错误 #5:缺少前向测试

什么是前向测试:

回测是对过去的测试。前向测试是对未来的测试(但不使用真实资金)。

前向测试展示策略在从未见过的数据上的表现

为什么重要:

假设你在2020-2023年优化了一个策略。结果非常好。你在2024年启动实盘。

问题:2024年的市场行为可能不同。波动率改变了。相关性破裂了。

在模拟账户上的前向测试让你可以在亏钱之前验证这一点。

如何进行前向测试:

1. 在模拟账户上运行

最短时间: 3-6个月

为什么这么久?因为:

  • 需要经历不同的市场状态(趋势、震荡、波动)
  • 需要至少50-100笔交易
  • 需要检查心理承受能力(是的,即使是在模拟账户)

2. 记录交易日志

记录:

  • 入场/出场
  • 交易原因(哪个模块产生了信号)
  • 与回测的偏差(如果有)

如果模拟结果明显差于回测——某处出了问题。回到调试。

3. 比较指标

指标 回测 前向测试
胜率 65% ?
平均利润 1.2% ?
平均亏损 -0.8% ?
最大回撤 12% ?
每月交易次数 20 ?

如果偏差超过20-30%——有问题。

4. 在平台上使用模拟交易

TradingView: 免费模拟交易通过虚拟账户。

AlgoTest: 带详细分析的模拟交易

TSLab/Designer: 使用真实券商连接进行模拟运行(但不发送订单)。

5. 不要急于求成

最常见的错误:在模拟账户上测试一周,看到盈利,就部署到实盘。

一周什么都不是。你需要至少2-3个月来了解策略在不同条件下的表现。

启动实盘前的检查清单

在实盘账户上按下”开始”之前,检查以下列表:

测试

  • 策略至少在2年的历史数据上测试过
  • 进行了样本外测试(30%的历史数据)
  • 参数数量 ≤ 3
  • 参数有逻辑依据(不是噪声拟合)
  • 参数改变±10%时结果稳定

偏差

  • 验证无前视偏差(仅使用已收盘K线)
  • 考虑了生存偏差(或通过过滤器最小化)
  • 添加了真实佣金(0.03-0.05%)
  • 添加了滑点(流动性好的证券1-3个tick)
  • 扣除佣金和滑点后策略仍有盈利

前向测试

  • 策略在模拟账户上至少测试了3个月
  • 至少积累了50笔交易
  • 模拟结果接近回测(偏差<30%)
  • 维护交易日志
  • 在不同市场状态下测试过(趋势、震荡、波动)

风险管理

  • 每笔交易最大风险 ≤ 账户的2%
  • 回测最大回撤 ≤ 20%
  • 有回撤>15%时的应对计划
  • 仓位大小基于标的波动率计算

如果任何一项不满足——不要上实盘。

构建器中的调试工具

TSLab

优点:

  • 内置逐步执行调试器
  • 图表上的交易可视化
  • 每笔交易的详细报告
  • 3D优化可视化

缺点:

StockSharp Designer

优点:

  • 灵活的佣金和滑点设置
  • 支持tick和订单簿数据
  • 导出到C#进行深度调试

缺点:

  • 调试文档较少
  • 可视化不如TSLab

NinjaTrader Strategy Builder

优点:

  • 与Visual Studio集成进行代码调试
  • 详细的执行日志
  • Market Replay用于逐步测试

缺点:

  • 对初学者来说设置更难
  • 价格昂贵(终身版$1,500)

fxDreema

优点:

  • 生成可在MetaEditor中调试的MQL代码
  • MetaTrader可视化测试器

缺点:

  • 免费版限制(模块间10个连接)
  • 深度调试需要MQL知识

总结

可视化构建器使策略创建变得简单。但调试仍然很难。

五个主要错误:

  1. 过度优化 — 拟合历史噪声
  2. 前视偏差 — 使用未来数据
  3. 生存偏差 — 忽略退市证券
  4. 忽略佣金 — 不切实际的执行假设
  5. 缺少前向测试 — 未经模拟验证就上实盘

该怎么做:

  • 限制参数(≤3)
  • 进行样本外测试
  • 检查前视偏差
  • 添加真实的佣金和滑点
  • 在模拟账户上至少测试3个月

正确的回测不是漂亮的收益曲线。而是对问题的诚实回答:”这在实盘中会有效吗?”

如果回测显示年化300%——很可能某处有错误。零售算法交易的现实收益:年化20-50%,回撤10-20%。

如果你的结果明显更好——回到上面的要点。你遗漏了什么。


有用链接:

研究和资源: