投资日志

回测年化 40%,实盘亏了 15% — 真实记录,不装

事情经过

2025 年 10 月,我用 Backtrader 写了一个策略,回测 5 年数据,年化收益 40%,最大回撤 12%。看着曲线我激动坏了,觉得找到了圣杯。

11 月开始实盘,小资金试水。一个月亏了 15%。

怎么回事?

三个原因

1. 过拟合

策略参数是我在回测里反复调出来的。5 年数据,调了 20 多次参数,每次都让曲线更好看。但这不是在发现规律,是在拟合噪音。换一组数据,策略立刻失效。

2. 没算滑点

回测里买卖都是按收盘价成交的,但实盘哪有那么好的事?滑点、手续费、冲击成本,每笔交易多吃 0.3-0.5%。高频策略这些成本能把利润吃光。

3. 未来函数偷看

这个最隐蔽。我的策略用了一个"当日最高价"的指标,但回测时这个数据在开盘时是不知道的。等于偷看了未来信息。修掉之后,回测收益直接砍半。

怎么修的

  1. Walk-forward 分析 — 不再全量回测,而是用前 3 年数据训练,第 4 年验证,滚动前进。这样能发现策略是否真的有预测力。
  2. 蒙特卡洛模拟 — 在回测收益上加随机噪声,模拟 1000 次。如果大部分模拟结果都是正的,策略才靠谱。
  3. 严格算滑点 — 每笔交易加 0.3% 的滑点成本。别小看这个,长期下来差别巨大。
# Walk-forward 回测
def walk_forward_test(strategy, data, train=3, test=1):
    results = []
    for i in range(train, len(data) - test):
        train_data = data[i-train:i]
        test_data = data[i:i+test]
        params = optimize(strategy, train_data)
        result = backtest(strategy, test_data, params)
        results.append(result)
    return results  # 样本外收益

修完之后,回测收益从年化 40% 降到 18%。但至少这个 18% 是诚实的。我对回测结果的态度变了:回测说能赚 20%,我预期 10%,实际可能 5%。这样心态好很多。

最大的教训

回测是工具,不是预言机。它能帮你排除明显不行的策略,但不能保证行的策略一定赚钱。这个教训跟认知偏差里的确认偏误有关——你越想证明策略有效,就越容易忽略反例。

现在我每次回测完,第一件事不是看收益,而是问自己:这个策略的逻辑说得通吗?如果说不通,收益再好看也不信。

账户全景

上面说的是 2025 年底量化工具回测踩坑的那一次——是工具层面的教训,不是实盘亏损。拉长来看,从 2019 年入市到 2026 年 3 月,我的账户**每年都是正收益,没有一年亏过**。

几个关键事实

  • 连续 7 个完整年度(2019-2025)全部正收益
  • 2022 年最难——上证跌了 15%,我的账户还是正的
  • 2021 年收益最好——核心资产崩塌那年反而赚得最多
  • 2023 年最弱——只赚了一点点,但没亏
  • 累计跑赢上证指数约 170 个百分点

连续 7 年正收益听起来不错,但这个数字背后有很多不漂亮的事——个股割肉过、拿不住卖飞过、心态失衡追过热点。下面说一个最痛的。

拿不住的痛

最典型的一只:我研究了好几个月,基本面都看完了,三张表逐项核对,估值也算过了,安全边际够大,13 块左右买入。涨到 18 的时候我觉得"赚够了"卖了。

后来它涨到了 48。

为什么卖?因为每天看 K 线,一波动就心慌。损失厌恶在作祟——赚到的钱比没赚到的钱更让我在意。Kahneman 说人们对损失的敏感度是收益的 2~2.5 倍,我亲身体会到了。看着浮盈变成实盈的快感,让我忽略了"如果拿着会怎样"的可能性。

反思

这不是马后炮。当时卖出的时候我觉得自己很理性——"获利了结,落袋为安"。但现在回头看,那个决策的理由是情绪化的:我怕利润回吐,而不是公司基本面出了问题。如果当时不看 K 线只看财报,我大概率不会卖。

后来我改了规则:买入后不看 K 线,只看季度财报。这条规则写进了我的投资决策流程。执行之后,拿住股票的时间明显变长了,卖飞的次数也少了。当然,也错过了一些该止损的机会——规则不是万能的,但它至少帮我过滤掉了最冲动的那部分操作。

这只股票的研究过程我记录在了个股研究笔记里,感兴趣的可以看看当时的分析思路。