趋势跟踪
从这一篇开始进入第二编:把第一编的方法论落到具体策略上。第一个案例选趋势跟踪——历史最久、逻辑最简单的一类量化策略,1980 年代的海龟交易实验用的就是它,至今仍是 CTA(商品交易顾问)基金的主力打法。
趋势跟踪的全部哲学只有八个字:截断亏损,让利润奔跑。它不预测行情会涨会跌,只做一件事——价格已经开始涨了,就跟进去;涨势坏了,就出来。听起来像废话,但它隐含一个反直觉的主张:「追涨杀跌」在规则化之后可以是正期望的。买点常常设在过去 20 天的最高价之上——有意识地买在「贵」的位置,因为新高本身就是趋势存在的证据。这一篇把这套哲学拆成两条能交给机器执行的规则,配上数学、伪代码和图,最后看它最大的死穴。
方法论:把「跟着趋势走」写成无歧义规则
Section titled “方法论:把「跟着趋势走」写成无歧义规则”第 3 章说过,规则必须写到「如果……就……」、人和程序执行结果一模一样的程度。下面是趋势跟踪的两个经典实现,每条都写死:
规则 A:均线交叉(双均线)
- A1(数据):每日收盘价。快线为 5 日移动平均 MA5,慢线为 20 日移动平均 MA20,定义见下面的数学节。
- A2(买入):今日出现金叉——昨日 MA5 ≤ MA20 且今日 MA5 > MA20——则次日以收盘价全仓买入。
- A3(卖出):今日出现死叉——昨日 MA5 ≥ MA20 且今日 MA5 < MA20——则次日以收盘价清仓卖出。
- A4(仓位):只有「空仓」和「全仓」两种状态,不加仓、不减仓、不做空。
规则 B:唐奇安突破(通道突破)
- B1(通道):上轨 = 过去 20 个交易日最高价的最大值,下轨 = 过去 20 个交易日最低价的最小值。「过去 20 日」指昨日及之前,不含今天——这条是防前视的关键,伪代码一节会展开。
- B2(买入):今日收盘价 > 上轨(收盘价创 20 日新高),则次日全仓买入。
- B3(卖出):今日收盘价 < 下轨,则次日清仓卖出。
- B4(仓位):同 A4。
两条规则都符合第 3 章的可检验三要素:标的池明确(本教程用单只合成股票演示)、进出场规则机械、成功标准可以在回测后检验。注意它们共同的「慢」:都要等趋势走了一段才确认进场,也都等趋势回头了一段才离场——趋势策略买不到最低点、卖不出最高点,它赚的是中间那段。
本章演示数据是一段 300 个交易日的合成日线(趋势跟踪演示:三段行情(前 100 日上行 / 中 100 日震荡 / 后 100 日上行)的 OHLC;MA5/MA20;20 日唐奇安上下轨(t 日轨道用 t-1 及之前数据,无前视);trades 为「金叉或上轨突破买入、死叉或跌破下轨卖出」双规则信号,信号次日收盘成交,滑点 0.1%),刻意做成三段行情:前 100 日上行、中间 100 日横盘震荡、最后 100 日再上行。图上信号点是两条规则的并集:金叉或上轨突破触发买入,死叉或跌破下轨触发卖出,信号次日收盘成交、滑点 0.1%(与第 4 章的回测引擎约定一致)。
数学:移动平均
Section titled “数学:移动平均”两条规则都建立在移动平均上,先把这一个公式钉死。
人话解释: 是截至第 天、最近 天收盘价的算术平均, 是求和记号(第 2 章见过)。它回答的问题是「最近 天进场的人,平均成本是多少」。 越小越贴着价格走、越灵敏; 越大越平滑、越迟钝。MA5 大约是一周的平均成本,MA20 大约是一个月的。金叉的本质:最近一周的平均成本抬升到了最近一个月的平均成本之上——短线资金愿意比上个月的人出更高的价,这就是「转强」的可计算定义。
手算一遍:用本章演示数据的前 5 个交易日(2025-01-06 至 2025-01-10),收盘价分别是 11.80、12.04、12.08、12.17、12.21 元:
这就是图上 MA5 曲线的第一个点(第 5 天才开始有值,前 4 天数据不够一个窗口)。MA20 同理,第一个点出现在第 20 天。
一个必须记住的性质:均线是滞后指标。它是对过去 天的平均,价格掉头之后,均线要等窗口里的旧价格被逐步替换才会跟着转向, 越大滞后越严重。趋势策略「慢半拍」不是参数没调好,是平均这个操作本身带来的,改不掉,只能在灵敏(噪音多、假信号多)和平滑(滞后重、进场晚)之间做取舍。
伪代码:唐奇安突破的完整流程
Section titled “伪代码:唐奇安突破的完整流程”引擎骨架就是第 4 章那台「守规矩的时间机器」,换掉的只是信号部分:
输入:OHLC 日线序列、通道窗口 N = 20、初始资金 C₀、费率 fee、滑点 slipcash ← C₀;持仓 ← 0;pending ← 无对 t 从 1 到 n: # ① 执行昨日收盘后排队的信号(T+1:信号昨日生成,今日成交) 若 pending = 买入 且 空仓: 成交价 ← close[t] × (1 + slip);全仓买入,扣手续费;pending ← 无 若 pending = 卖出 且 持仓: 成交价 ← close[t] × (1 − slip);清仓卖出,扣手续费;pending ← 无 # ② 用今日收盘计算通道、生成信号(排队到明日执行) 上轨 ← max(high[t−N], …, high[t−1]) # 关键:只用昨日及之前的数据,绝不含今日 下轨 ← min(low[t−N], …, low[t−1]) 若 空仓 且 close[t] > 上轨:pending ← 买入 若 持仓 且 close[t] < 下轨:pending ← 卖出 # ③ 结算当日净值 净值[t] ← cash + 持仓 × close[t]输出:净值序列、成交记录第 ② 步窗口右端点是 而不是 ,这一行是整个策略最容易写错的地方。如果上轨算进了今日的最高价,那么「今日收盘 > 上轨」这个条件就被污染了——今日高点本身就是今日强势的结果,等于拿答案出考题。正确口径下,上轨在今日开盘前就已经确定,盘中任何时候都能说清「涨到多少算突破」。这也对应实盘的真实信息结构:你在 t 日 15:00 收盘那一刻做判断时,t 日的高低价确实已经知道了——但通道必须只用 t-1 及之前的数据算,否则回测里的突破点会比实盘能做到的更低,收益被系统性吹大(第 4 章前视偏差的第一种形态)。
另一个细节在 ① 和 ② 的顺序里:先执行昨日信号、再生成今日信号,同一个 t 日内「成交」和「判断」用的是不同时刻的信息,互不污染。这正是第 4 章排除的第三种前视——信号和成交不能用同一根 K 线的收盘价。
图:均线、信号与通道
Section titled “图:均线、信号与通道”把规则跑在 300 日演示数据上。下图 K 线(红涨绿跌)叠加 MA5(黄)与 MA20(蓝),红三角是买入、绿三角是卖出(滚轮可以缩放局部):
三段行情在图上一眼可辨,策略在每段的表现也完全不同:
- 第一段上行(1 月到 5 月):2025-03-28 金叉进场(12.79 元),一直拿到 2025-05-30 死叉离场(14.21 元),一笔赚 11.1%。注意进场时第一段趋势已经走了近三个月,离场时也从高点回落了一段——「赚不到头尾」在图上非常直观。
- 中间横盘(2025-05-26 到 2025-10-10):均线反复缠绕,信号连续触发又连续止损,4 笔完整买卖里 3 笔亏损。这一段是趋势策略的「出血期」,常见坑一节细说。
- 第三段上行(10 月中之后):2025-12-08 进场(14.19 元),2026-02-03 离场(15.75 元),再赚 10.99%。期末还有一笔 2026-02-23 的持仓(16.32 元)未平仓。
换成通道视角看同一段行情——紫色上下轨是 20 日唐奇安通道,注意每条轨道只由昨日及之前的数据决定,所以它永远「提前一天画好」,价格是自己撞上去的:
横盘段里通道收窄、价格在上下轨之间来回震荡,通道全程没有给出持仓理由;趋势段里价格贴着上轨走、轨道一路抬升,策略得以全程持仓。
300 个交易日合计 9 笔完整买卖,只有 4 笔盈利,胜率 44%——不到一半。但两笔趋势单合计约 +22%,覆盖全部小额止损后仍有厚利。这就是「截断亏损、让利润奔跑」的盈亏分布:胜率低于 50% 是常态,策略靠盈亏比活着(第 4 章双均线回测里「五笔买卖一笔大赚」是同一个结构)。评价趋势策略时盯着胜率看,是从根上理解错了它赚钱的方式。
- 震荡市反复打脸——趋势策略最大的死穴。把上图中段(2025-05-26 到 2025-10-10)放大看:四个半月里价格在一个窄箱体内来回,MA5 和 MA20 反复交叉,通道始终收窄、价格始终在轨道之内。策略在这里机械地执行了 4 笔完整买卖,3 笔亏损,累计约 -2.22%——每一笔单独看都合规、都只亏一点,合在一起是长达数月的持续失血。这不是 bug,是趋势策略的结构性成本:它用震荡市里的一串小亏,买趋势段里少数几笔大赚。真正的风险在执行端——连亏四五笔之后,人很容易手工停掉策略,而下一笔往往就是那段 +10% 的大趋势。评估趋势策略时,必须事先回答「我能否承受连续 5 笔、10 笔小额止损」,回答不了就不要上线。
- **参数敏感:5/20 是谁定的?**为什么快线用 5 不用 8,通道用 20 不用 55?没有先验答案。危险的做法是在同一段历史上扫参数、挑收益最高的那组——那是第 6 章讲过的过拟合标准动作。第 6 章的参数热力图在这里直接适用:健康的参数应该是一个「高原」——(5,20) 附近邻居参数的表现都差不多好;如果只有 (5,20) 一枝独秀、邻居全垮,那是孤立尖峰,大概率是运气。换参数后结论翻转的策略,不值得相信。
- 把一段行情的回测当成策略的期望。本章演示数据是「两段趋势夹一段震荡」的剧本,趋势策略自然表现体面;如果历史剧本是三年纯震荡,同一个策略会被磨死。一次回测只是一条历史路径(,第 4 章强调过),换品种、换年代,结论可能完全不同。趋势跟踪真正的可行性论证,来自它横跨几十年、横跨股票/商品/外汇多个市场的长期记录,而不是任何单一回测。
趋势跟踪回答的是「价格已经在动了,跟不跟」。下一篇看它的镜像策略:价格跌过头了,赌它涨回来——均值回归。一个赚「惯性」的钱,一个赚「弹性」的钱,两者对同一段行情会给出完全相反的操作。