2026-04-22 · 约 10 分钟

SQTS 迭代史 · 从 v1 到 v4

一个散户量化系统在三年里推翻过自己三次 — 这是那三次推翻的实录, 以及第四版为什么我现在真的在用它。

#SQTS#迭代史#反思

TL;DR

SQTS (Stock Quant Trading System, 我自己给的名字) 是我过去三年里第四版的量化交易系统。 前三版全部回测失败或实盘不敢上。v1 是"简单选股" — 分差;v2 加了"状态机" (牛/熊/震荡三态切换三套策略) — 滞后性吃掉所有优势; v3 把 v2 里唯一表现好的"熊市策略"单拎出来大面积回测 — 依然不行。v4 终于下决心用蒙特卡洛做全体因子的稳健性验证 + 统一框架代替状态机。

三次推翻的核心教训只有一句:市场状态不是你能"判断"出来的,判断出来之前它已经变了。

v1 · 最朴素的念头 (2023)

第一版是我真正动手写代码的起点。逻辑简单到不好意思复述:

  • 每天从一个预设股票池里,按几个技术指标打分;
  • 选出分数最高的 N 只,等权买入;
  • 次日或持有 T+N 卖出,再来一轮。

这个版本跑回测的时候,数据非常难看。我当时没有"成本端要打得比券商给的狠"这个意识,所以成本按单边 5bp 算 — 已经偏乐观。 即便如此,累计收益仍然跑不赢沪深 300,胜率也很普通。

那会儿我以为失败的原因是"指标没选对"。 于是花了几个月在换因子、调阈值、换数据源上。直到后来我才明白: 真正的问题不是指标对不对,而是"每天从池子里选股"本身就是一个把噪声放大的机制。

v2 · 状态机的诱惑 (2024)

既然"全市场一视同仁"行不通,那就分状态对待 — 这是 v2 的核心想法。

我给市场定义了三个状态:牛市 / 熊市 / 震荡市。然后写了三套完全不同的量化策略,分别对应三种状态。 每天开盘前,用一组宏观和技术指标 (比如均线系统、成交量、Hurst 指数之类) 判断"今天市场是什么状态",然后调用对应策略。

这个思路听起来非常合理 — 机构也有类似的"regime switching"模型。 回测跑出来的结果也看着漂亮:牛市策略在 2015、2019、2020 初涨得凶;熊市策略在 2018、2022 防得住;震荡策略在 2016-2017 这种磨洋工行情里能挣点。 三条曲线叠起来,理论上的组合似乎能平滑穿越周期。

但真把它往 walk-forward 和实盘上推的时候,问题炸了出来。

状态机的滞后性

市场状态不是你"观察到"的 — 它是你事后知道的。 我的状态机需要至少 10-20 个交易日的数据窗口才能稳定识别一个状态。 等它判断"现在是熊市"的时候,熊市已经走到一半甚至尾部了。 等它切换到"熊市策略"入场,市场反弹了,熊市策略在反弹行情里是负 alpha。

反过来也一样:识别出"牛市了"的时候,往往是牛市最亢奋的阶段 — 也是进场风险最大的时候。

滞后性吃掉了状态机所有理论上的优势,还反向拖累了组合。 三条曲线叠起来实盘跑,不仅没有理论组合那么漂亮,还经常跑输单独的任何一条子策略。

v3 · 把"唯一赢的那个"单拎出来 (2025)

v2 死掉的过程中,我做 attribution 做到一半偶然发现: 熊市策略单独看的话,不光在"熊市"赚钱,在震荡市甚至部分牛市段都不亏。 它的 drawdown 极小 — 是三条曲线里最光滑的。

我被这个发现兴奋了好一阵。于是 v3 就是一个简单粗暴的想法:把熊市策略单拎出来,全年无脑用它。 反正它回撤小,就算 alpha 不大,稳定性应该值钱。

v3 立刻推倒 v2 的状态机,全面改写成单策略全时段运行。 然后拉着它做大面积 walk-forward 回测。

然后呢?还是不行。

v3 的实测结果让我意识到 v2 attribution 给我的是一个假象 — 熊市策略之所以"在震荡市也不亏", 是因为它在震荡市里几乎不开仓。它不开仓当然不亏,但它也不赚,机会成本巨大。 真正需要它抓住 alpha 的时候 (震荡突破、小牛启动),它又错过了。

换句话说:v2 的熊市策略之所以曲线光滑,是因为它本质是一个保守的择时工具, 而不是一个能持续产生 alpha 的交易系统。把它单拎出来相当于把一个"防御专家"派去踢满 90 分钟。

一个策略在组合里的贡献,和它单独运行的表现,不是一回事。

v4 · 放弃状态机,全天候四因子 + 蒙特卡洛 (2026)

v3 死掉之后我停下来想了很久。三次失败其实在告诉我同一件事:

  • 我一直在尝试"判断市场要怎么走,然后选对应策略"
  • 但真正能赚钱的方式是"用一套不依赖我判断的策略,在任何市场都跑得住"

这个哲学转变是从状态机到全天候的跳跃。v4 的设计原则变成:

  1. 不再判断状态。四个因子 (景气度、动量、拥挤度、价值) 永远同时运行,它们之间自然对冲。 在牛市动量发力,在震荡拥挤度抑制追涨,在熊市价值提供底,在转折期景气度给方向。
  2. 用蒙特卡洛验证每一个参数选择。不是跑一次回测看 Sharpe,而是对每个因子的参数做 1000+ 次随机扰动, 看输出分布是否稳定。如果 Sharpe 的 95% 置信区间横跨 0,那这个因子就是噪声。
  3. 股债配置托底。永远有 30-40% 在国债 ETF 里。再好的股票策略也不该 100% 暴露, 心理承受不起,实盘活不过第一次 -15% 回撤。
  4. 月频调仓是底线。我试过周频和日频,换手成本最后会吃掉 alpha 的 50%+。月频让系统"有耐心"。

这套东西从 2026 年 2 月底开始在 paper trading 上跑,到写这篇文章时 47 个交易日。 它不漂亮 — NAV 只比基准多 1.15pp,TE 小到我怀疑归因里大部分是行业内选股溢出,不是真正的行业配置 alpha。 但它没死。这比前三版都强。


三个我从 v1-v3 里学到的元教训

1. 不要相信"这个想法好聪明"的感觉

状态机那一版我当时真心觉得自己想到了"机构做的事"。 回头看,那种兴奋感本身就是危险信号 — 真正 robust 的想法通常是"这个也能 work?"的意外, 而不是"我终于想明白市场了"的顿悟。

2. Attribution 只能告诉你过去,不能告诉你未来

v2 告诉我"熊市策略单独看最好",v3 就死在相信了这句话。 Attribution 是对过去历史的拆解,它不保证把"表现最好"的那块拿出来独立运行还能 work。 现在我对任何 attribution 结论的第一反应都是:"那 walk-forward 呢?"

3. 想清楚"我在解什么问题"比写代码重要 100 倍

v1-v3 每一版都是我先写了很多代码、再发现代码解决的不是真问题。 v4 之前我停了一个月不写代码,只画框架、写 doc、问自己"如果这个因子明年失效,我怎么知道?" 这一个月比前三版加起来都值。


写在最后: v4 也不是终点

必须老实讲: 我对 v4 的 alpha 到底成不成立,现在没有信心。 47 天的实盘跟基准相关系数 0.999,跟踪误差 0.57% — 这个数字小到我怀疑 v4 本质上是一个"略微倾斜的增强指数", 而不是一个真正有独立 alpha 来源的策略。主动收益 +1.15pp 也可能只是运气。

正是在这个怀疑阶段,我开始认真学可转债。 不是为了取代 v4,而是给自己一条"万一 v4 跑不通"的备选路径。 学下来发现可转债这个品种比我想象的复杂得多 — 经典的"双低策略"在 2021 年之后已经失效,但这个品种本身还很有价值。

下一篇我会写 可转债双低 · 一个失效策略的完整验尸 — 历史上它怎么赚钱的、2021 年到底坏在哪、后双低时代的 5 条路我现在选哪条。

← 返回首页 — czapple —