为什么你在可视化构建器中创建的机器人在实盘中亏损:5个无人提及的调试错误
两周前,我收到一位读者的消息。他在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”。
如何避免:
- 仅使用已收盘的K线
- 如果策略在H1上,信号仅在小时K线收盘后出现
- 不要使用当前K线数据生成信号
- 检查数据延迟
- 宏观经济数据有延迟发布
- 新闻不会即时出现
- 财务报表会被修订
- 在实盘测试前先在模拟账户运行
- 如果回测显示每月100笔交易,而模拟只有10笔,问题在于前视偏差
错误 #3:生存偏差
什么是生存偏差:
你在今天存在的股票上测试策略。但在三年中,一些公司破产、退市或被收购。
它们不在你的回测中。但在实际交易中它们存在过。
真实案例:
俄罗斯股票策略。2020-2023年回测。测试的股票列表包括:
- 储蓄银行 ✅
- 天然气工业公司 ✅
- Yandex ✅
- TCS控股 ✅
但缺少:
- 俄铝(2022年退市)❌
- 莫斯科交易所(2022年临时退市)❌
- 下跌90%并从视线中消失的股票 ❌
你的策略”忘记”了这些证券上的亏损。生存偏差使年化收益虚高1-4%。
在哪里出现:
在TSLab和Designer中:
如果你通过券商连接加载股票列表——你只能获得当前的股票。退市的不在其中。
在NinjaTrader中:
期货也有同样的问题。过期的合约通常不会出现在回测中。
如何避免:
- 使用包含退市证券的数据库
- QuantConnect、Norgate Data提供无生存偏差的数据
- 对于俄罗斯市场——更困难,这类数据库很少
- 在指数上测试,而非精选股票
- 如果策略是MOEX股票——使用整个MOEX指数,而非仅前10名
- 检查测试期间有多少证券消失
- 如果测试3年而股票列表没有变化——有问题
- 添加流动性过滤器
- 策略不应交易日成交额低于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优化可视化
缺点:
- 没有自动样本外测试
- tick数据存在问题
StockSharp Designer
优点:
- 灵活的佣金和滑点设置
- 支持tick和订单簿数据
- 导出到C#进行深度调试
缺点:
- 调试文档较少
- 可视化不如TSLab
NinjaTrader Strategy Builder
优点:
- 与Visual Studio集成进行代码调试
- 详细的执行日志
- Market Replay用于逐步测试
缺点:
- 对初学者来说设置更难
- 价格昂贵(终身版$1,500)
fxDreema
优点:
- 生成可在MetaEditor中调试的MQL代码
- MetaTrader可视化测试器
缺点:
- 免费版限制(模块间10个连接)
- 深度调试需要MQL知识
总结
可视化构建器使策略创建变得简单。但调试仍然很难。
五个主要错误:
- 过度优化 — 拟合历史噪声
- 前视偏差 — 使用未来数据
- 生存偏差 — 忽略退市证券
- 忽略佣金 — 不切实际的执行假设
- 缺少前向测试 — 未经模拟验证就上实盘
该怎么做:
- 限制参数(≤3)
- 进行样本外测试
- 检查前视偏差
- 添加真实的佣金和滑点
- 在模拟账户上至少测试3个月
正确的回测不是漂亮的收益曲线。而是对问题的诚实回答:”这在实盘中会有效吗?”
如果回测显示年化300%——很可能某处有错误。零售算法交易的现实收益:年化20-50%,回撤10-20%。
如果你的结果明显更好——回到上面的要点。你遗漏了什么。
有用链接:
研究和资源:
- TradingView: How to Debug Pine Script
- FTMO Academy: Forward Testing of Trading Strategies
- AlgoTest: Paper Trading Guide
- QuantifiedStrategies: Curve Fitting in Trading
- Build Alpha: 3 Ways to Reduce Curve-Fitting Risk
- AlgoTrading101: What is Overfitting in Trading?
- Auquan: Backtesting Biases and How To Avoid Them
- LuxAlgo: Survivorship Bias Explained
- Empirix: Strategy Over-Optimization
- LONG/SHORT: Backtesting Strategies on Historical Data
- TSLab Documentation: Agent Operation and Special Situations
- EA Trading Academy: Walk Forward Testing
讨论
加入我们的讨论 Telegram 群组!