跳转至

第 19 课 趋势、均线、突破与动量

这一家族愿意在方向已经出现以后再进入,用确认带来的滞后换取一段行情继续发展的可能。

适合谁第一次完整阅读策略家族的读者
前置知识第 18 课的六层结构与统一策略卡
建议用时120 分钟,可分两次完成
本课成果区分均线、突破、时间序列动量与截面动量,并为其中一种完成策略卡

这一家族不负责预测最高点和最低点

假设价格从 10 元缓慢上涨到 12 元。趋势策略通常不会在 10 元最低点买入,因为当时还没有足够证据说明方向已经形成。它会等价格超过某条均线、突破过去区间或累计收益转正以后再行动。等到趋势结束,退出信号也会晚于最高点出现。

这段滞后来自确认方向所支付的结构成本。规则放弃最早一段行情,希望减少在没有方向时随意猜测。市场持续单边发展时,延续部分可能覆盖入场与退出的损失;价格反复横盘时,确认信号会一再出现又消失,许多小亏与交易费用便逐步累积。

趋势、突破和动量共享“过去方向可能延续”的大假设,却观察不同对象。均线与突破常判断单项资产当前状态,时间序列动量比较一项资产自己的过去,截面动量在同一日期比较许多资产的相对强弱。先把比较对象分清,后面的公式和验证才不会混在一起。

四种方法先放在同一张地图上

方法 它拿什么作比较 信号的朴素含义 主要结构风险
均线趋势 当前价格或短均线与较长均线 近期方向高于较慢中心 信号滞后、横盘反复
区间突破 当前价格与过去区间边界 价格进入过去没有到达的新区域 假突破、跳空与滑点
时间序列动量 单项资产现在与自身过去 自身过去方向可能继续 状态突然反转、做空限制
截面动量 同一日期不同资产的过去表现 相对赢家可能继续强于相对输家 拥挤反转、行业和市场暴露

这张表只说明指标与核心假设。完整策略仍要补上数据口径、信号形成时点、订单、持仓、退出、成本、风险上限、基线与时间验证。后面每种方法都会先用小数字解释,再给公式与代码。

移动平均先回答近期价格大致在哪

小岚观察三个收盘价 10 元、11 元和 12 元。若只看最后一天,12 元无法说明前面路径;把三天相加得到 33 元,再除以 3,得到平均价 11 元。这个数字把三天价格压成一个近期中心,也减少了单日波动的影响。

第二天过去以后,窗口会向前移动。假设第四天收盘为 13 元,新的三日平均不再使用最早的 10 元,而是计算 11、12 和 13 的平均,得到 12 元。每前进一天就移除最旧价格、加入最新价格,因此叫作移动平均。

把长度从三日推广到 \(n\) 日,信号日写作 \(t\),简单移动平均可以写成下面的形式。

\[ MA_{n,t}=\frac{P_t+P_{t-1}+\cdots+P_{t-n+1}}{n} \]

\(P_t\) 是当前收盘价,\(P_{t-1}\) 是前一天收盘价,向左一共取 \(n\) 个价格。平均本身不预测下一天,它只描述截至当前的近期价格水平。窗口越短,平均值越快跟随新价格,也更容易被短期噪声带动;窗口越长,曲线更平滑,方向变化会更晚反映出来。

双均线把快变化与慢变化放在一起

假设五日平均为 10.80 元,二十日平均为 10.20 元。短期中心高于长期中心,可以被解释为近期价格相对于更慢背景向上。规则可以在收盘后把这种关系标记为正信号,下一可交易时点再建立持仓。反过来,五日平均低于二十日平均时,可以退出或转为空仓。

下面代码输入一列按日期排序的收盘价,任务是计算二十日与六十日平均,并在短均线高于长均线时把信号标为 1。前五十九行历史不足,慢均线与信号应为空或零;数据足够以后,代码才开始比较。

fast_average = close.rolling(20, min_periods=20).mean()
slow_average = close.rolling(60, min_periods=60).mean()

signal = (fast_average > slow_average).astype(int)

rolling(20) 建立一个随日期移动的二十行窗口,mean 在每个窗口中求平均。min_periods=20 要求二十个有效价格都存在,避免用三四天数据冒充二十日指标。最后的比较只产生信号,下一日订单、持仓和费用仍要按第 14 课账本实现。

快均线从下向上越过慢均线常被称为金叉,从上向下越过常被称为死叉。这些名称只是图形描述,不会增加预测证据。研究卡需要说明为什么选择两种时间尺度、是否只在交叉当天交易、持仓期间如何处理重复信号,以及相近窗口是否保持方向。

区间突破观察价格是否越过过去边界

过去五日最高收盘价依次为 10.10、10.30、10.25、10.40 和 10.35 元,历史上轨为 10.40 元。今天收盘达到 10.50 元,价格第一次超过这段过去边界,突破指标成立。今天收盘要等交易结束后才完整,买入只能安排到随后可交易时点。

唐奇安通道使用过去 \(n\) 期最高价作为上轨、过去 \(m\) 期最低价作为下轨。为了让今天只与此前边界比较,计算时要先排除当前行。

\[ U_t=\max(P_{t-1},P_{t-2},\ldots,P_{t-n}) \]
\[ L_t=\min(P_{t-1},P_{t-2},\ldots,P_{t-m}) \]

\(U_t\) 是今天开盘前就能由过去数据得到的上轨,\(L_t\) 是下轨。若收盘价高于上轨,下一时点可以生成顺势买入计划;持仓后跌破较短下轨时退出,是一种常见教学设计。入场与退出窗口不同,会改变持有时长和风险,必须分别给出理由。

下面代码输入按日排列的最高价、最低价与收盘价,任务是先把高低价向后移动一行,再在过去二十日最高与十日最低上计算边界。运行后要检查突破日的上轨不包含当天高价。

upper = high.shift(1).rolling(20, min_periods=20).max()
lower = low.shift(1).rolling(10, min_periods=10).min()

enter_long = close > upper
exit_long = close < lower

shift(1) 把今天高低价移到下一行可见位置,使今天边界只来自昨天及更早数据。若删掉移动,极端情况下今天价格会参与定义自己需要突破的边界。即使信号时间正确,次日开盘若直接跳到 10.90 元,回测也不能把成交价写回信号日的 10.50 元。

stateDiagram-v2
    accTitle: 突破策略从观察到退出的生命周期
    accDescr: 历史窗口准备完成后继续观察,收盘突破过去上轨只生成下一时点订单,成交后进入持仓,跌破退出线、风险超限或研究结束时再退出

    [*] --> 观察: 历史窗口尚未就绪
    观察 --> 等待成交: 收盘突破过去上轨
    等待成交 --> 持仓: 下一时点订单成交
    持仓 --> 持仓: 方向继续且风险允许
    持仓 --> 观察: 跌破退出线并成交
    持仓 --> 风险退出: 仓位或损失限制触发
    风险退出 --> 观察: 完成退出

著名的海龟交易体系使用突破思想,还包含波动调整的风险单位、分批加仓、退出规则和组合限制。只复制一条突破条件,不能代表完整体系。学习经典方法时要尊重它的整体结构,也要在当前市场重新估计费用与执行。

时间序列动量比较一项资产自己的过去

假设某资产十二个月前价格为 100 元,今天为 112 元,过去十二个月收益为 12%。时间序列动量把正负方向作为信号。过去收益为正时持有多头,过去收益为负时持有空头或现金,具体选择取决于市场是否允许做空。

对资产 \(i\) 和日期 \(t\),回看 \(h\) 期的收益方向可以写成下面的信号。

\[ s_{i,t}=\operatorname{sign}\left(\frac{P_{i,t}}{P_{i,t-h}}-1\right) \]

函数 sign 只保留正、零或负方向。它丢掉了趋势强度,优点是规则透明。完整策略还要规定未来哪一段持有、信号多久更新、空头怎样借券或通过期货实现,以及不同资产如何控制风险。

下面代码输入单项资产收盘价,任务是计算约一年的过去收益并提取方向。输出 1 表示过去收益为正,-1 表示为负,前二百五十二个交易日因为历史不足会缺失。

past_return = close / close.shift(252) - 1
direction = np.sign(past_return)

跨资产期货研究常让仓位随近期波动调整,避免高波动品种主导组合。波动目标与风险上限将在第 22 课详细解释。这里先知道方向信号与仓位大小是两层决定,过去上涨不能自动推出应该投入全部资金。

Moskowitz、Ooi 与 Pedersen 对时间序列动量进行了经典实证研究,文献信息收录在参考资料中。经典证据说明一种现象值得复查,目标市场的合约拼接、汇率、保证金和成本仍要重新处理。

截面动量在同一天给许多资产排序

假设同一天有四项资产,过去十二个月收益分别为 18%、5%、负 2% 和 11%。截面动量先在当天横向排序,18% 排第一,11% 排第二,5% 排第三,负 2% 排最后。若规则选择前四分之一,就只持有第一项;若允许多空,还可能卖空最后一项。

资产 过去收益 当日排名 教学分组
18% 1 最强组
11% 2 中上组
5% 3 中下组
-2% 4 最弱组

时间序列动量问“这项资产相对自己过去是向上还是向下”,截面动量问“这项资产相对于同日其他资产强不强”。丙即使过去收益为负,在更差的候选池中也可能不排最后;甲即使收益为正,在普遍暴涨市场中也可能只排中间。比较对象不同,基线和风险解释也不同。

下面代码假设 close 的每一列是一项资产、每一行是一个日期。任务是计算约一年收益,再在每一行内部转成百分位排名。排名靠近 1 的资产位于当日强者一侧。

past_return = close / close.shift(252) - 1
percentile_rank = past_return.rank(axis=1, pct=True)

long_group = percentile_rank >= 0.90
short_group = percentile_rank <= 0.10

axis=1 表示同一日期横向比较各列,pct=True 把名次缩放到 0 与 1 附近。布尔分组仍然不是持仓。若只持有赢家并保留现金,策略带有市场上涨暴露;若同时做多赢家、做空输家,还要处理借券、融资和两边风险。两种实现不能直接与同一数字比较。

Jegadeesh 与 Titman 的研究是股票截面动量的重要早期文献,入口同样列在参考资料中。论文使用的市场、样本、形成期与持有期都要在阅读卡中还原,不能只保留“买赢家”三个字。

为什么有些研究跳过最近一个月

股票短期内可能出现反转,交易微观结构也会让最近价格包含暂时冲击。部分经典截面动量研究因此使用大约十二个月前到一个月前的价格,暂时跳过最近一个月。这个选择把中期延续与极短期反转分开研究。

假设今天是十二月底,信号不会直接用今天与去年十二月底比较,而是用大约一个月前的价格与大约十二个月前的价格比较。代码可以把整个价格序列先向后移动二十一个交易日,再计算更早区间收益。

momentum_12_to_1 = close.shift(21) / close.shift(252) - 1

运行前要画出两个价格日期,确认分子来自约一个月前,分母来自约十二个月前。二十一与二百五十二只是交易日近似,不能脱离市场日历当成永久答案。研究包含近期与跳过近期的版本时,要提前说明比较目的并记录全部结果。

双动量把相对排名与自身方向连接起来

相对动量可能选出“一群下跌资产中跌得最少的那一个”。双动量先在资产之间选择相对强者,再要求入选资产自己的过去收益为正。相对条件回答谁更强,绝对条件回答它是否仍处于正方向。没有对象同时通过时,规则会转向现金或事先指定的防御资产。

这个过滤能减少普遍下跌期的持仓,也会在快速反弹时较晚重新进入。现金替代资产的利息、转换成本和可交易时间都要进入账本。新增绝对条件是否有价值,应与只有相对排名的简单版本使用同一候选池、时间和费用比较。

多层过滤需要逐层证明增量

有些轮动研究先按中期动量排序,再要求价格位于长期均线上方,用短期指标避开过热日期,最后按照波动调整仓位。每一层都能讲出一个故事,也会增加参数、换手与选择机会。研究者应把完整方案拆成逐层版本。

版本 保留的组件 它要单独回答的问题
A 只有中期动量排名 最基本的相对延续是否存在
B A 加长期趋势过滤 过滤是否减少普遍下跌期暴露
C B 加短期过热条件 少追涨的好处能否补偿错过行情
D C 加波动调整仓位 账户风险是否更稳定,成本增加多少

趋势过滤、突破确认与分层退出可以组合成一条较长规则。组合以前,先让每个组件单独面对简单均线或突破基线。趋势过滤减少了哪些逆势交易,突破确认让入场晚了多少,分层退出又增加了多少换手,都要在相同数据、费用和时间验证下分别记录。否则完整版本即使结果变化,也无法知道是哪一层带来的。

趋势为什么可能延续

一种解释认为,新信息出现后,不同参与者需要时间理解、审批与调整仓位,价格因而逐步反映变化。大型机构为了减少冲击会分批交易,被动资金申赎和风险限制也可能让需求持续多个时点。行为研究还讨论投资者反应不足与随后追随造成的延续。

另一类解释把趋势收益视为承担快速反转和危机状态的补偿。策略平时接受许多小损失,少数长行情贡献主要盈利;市场从恐慌迅速转向反弹时,过去赢家与输家可能一起逆转,动量组合会集中受伤。

机制提供可检验后果,不会保证每段上涨继续。若信息扩散是重要来源,持续期可能随资产关注度和交易活跃度改变;若收益主要来自风险补偿,坏时期应呈现可解释的共同特征。把收益按市场状态、资产和交易期拆开,能检查故事与数据是否一致。

横盘、反转与拥挤怎样让策略受伤

横盘市场会让价格反复穿过均线与突破边界。每次损失可能不大,买卖价差、费用和滑点却持续累积。增加确认天数或设置缓冲带可以减少交易,也会更晚进入真正趋势。这个取舍要通过换手、错过收益与净结果一起评价。

快速反转会让慢信号在方向末端进入,再在相反方向已经发展后退出。趋势策略通常依赖少数较长盈利覆盖许多小亏,过紧止损可能同时切断那些关键长持有。止损、退出窗口和仓位必须与交易盈亏分布共同研究,不能只选择最能美化历史回撤的阈值。

拥挤表示许多参与者持有相似方向并可能在同一时间退出。高换手、小盘资产和低流动性时期尤其脆弱。容量测试、延迟成交、更差滑点和共同反转情景,能让这种风险进入回测。

跨资产趋势还要处理合约与汇率

期货研究需要构造连续价格、处理换月、保证金与抵押资金收益。直接拼接不同到期合约可能在换月处产生人为跳跃,错误触发突破或收益。海外资产还会加入汇率变化,同一本位币报告必须说明是否对冲货币风险。

不同资产波动差异很大,按相同名义金额持有会让高波动品种主导组合。第 22 课会用逆波动、风险预算和波动率目标控制这类差异。当前策略卡只需把信号方向与仓位大小分开,并把合约、汇率和市场日历列为所需数据。

延续策略排雷清单

  • 信号窗口只使用当时及更早数据,突破边界排除了当前行。
  • 收盘信号在随后可交易时点成交,跳空使用可实现价格。
  • 相近窗口呈现可解释区域,没有只留下唯一冠军参数。
  • 与买入持有、简单均线、随机选择或朴素动量公平比较。
  • 费用、成交延迟和容量变差以后,净结果仍有多少余量。
  • 趋势、横盘、快速反转和高波动时期分别报告。
  • 收益是否依赖少数长交易、少数资产或极端日期得到展示。
  • 做空、期货、汇率与风险调整的额外条件已经进入账本。

容易弄错的地方

常见误解 规则中真正发生了什么 检查方法
均线能预测转折点 均线只总结已经出现的价格,天然带有滞后 比较信号日与真实转折日
价格触及上轨就能按上轨成交 收盘确认后边界价可能已经过去,跳空还会更差 使用下一可交易价并做滑点压力
截面赢家一定处于上涨趋势 它可能只是在普遍下跌中跌得较少 同时查看绝对收益与市场暴露
增加过滤器总能降低风险 过滤会增加参数、滞后和错过行情 逐层与简单祖先比较
短窗口回测更灵敏,所以更好 更快反应也会放大噪声、换手和成本 同时报告交易次数与扣费结果

一分钟自测

时间序列动量与截面动量都使用过去收益,它们比较的对象有什么不同?

查看答案 时间序列动量把一项资产与自己的过去比较,判断自身方向;截面动量在同一日期把许多资产互相比较,判断相对强弱。两者的基线、市场暴露和组合风险因此不同。

本课术语

词语 先这样理解
移动平均 随日期向前移动、每次计算最近固定窗口平均值的指标
突破 当前价格越过此前一段区间边界的状态
唐奇安通道 使用过去最高与最低形成上下边界的指标
时间序列动量 根据单项资产自己的过去方向形成信号
截面动量 在同一日期按过去表现比较多项资产
双动量 同时要求相对排名靠前与自身方向为正
假突破 价格越过边界后很快返回原区间的情况
拥挤 许多参与者持有相似方向并可能同时退出的状态

课后练习

1 手算移动平均

最近四日收盘价为 10、11、12 和 13 元。后三日简单移动平均是多少?若下一日为 11 元,新的三日平均是多少?

提示第一次使用 11、12、13,第二次窗口向前移动为 12、13、11。
答案后三日平均为 12 元。下一日加入后,新的三日平均为 12 元。相同平均值可以来自不同路径,指标会压缩顺序信息。

2 判断突破时间

今天收盘 10.60 元超过此前二十日上轨 10.50 元,明天开盘跳到 10.90 元。教学回测应使用哪个价格附近作为买入参考?

提示信号要等今天收盘后才完整。
答案应使用明天开盘附近可实现的价格,例如 10.90 元并考虑滑点,不能回填今天的 10.60 元或过去上轨 10.50 元。

3 寻找截面误解

某资产过去一年下跌 5%,同日其他资产平均下跌 20%,它能否成为截面动量赢家?

提示截面排名比较的是同日相对位置。
答案可以。它虽然绝对收益为负,却可能比其他资产更强。这也说明只持有截面赢家仍可能承受市场整体下跌。

4 动手拆组件

为多层过滤动量设计 A、B、C 三个版本,固定候选池、日期、成本和订单,只逐步增加一项过滤。

提示先用朴素动量,再加入长期趋势,最后加入一个短期条件。
答案每次只增加一项以后,版本差异才能解释该组件带来的收益、回撤、换手和错过行情。具体参数需要写明来路与邻近检查。

5 开放思考

趋势策略为什么常出现许多小亏与少数大盈利,这种分布会怎样影响止损设计?

评价要点确认方向需要等待,横盘会产生多次失败信号,持续趋势才可能形成长盈利。止损过紧虽然减少单次损失,也可能截断关键长趋势;应结合交易分布、费用、跳空与仓位共同验证。

参考资料

时间序列动量、股票截面动量、唐奇安与海龟体系的文献入口统一列在参考资料中。阅读原文时请记录资产范围、样本时期、信号形成、持有期、费用与验证方法,再与本课策略卡逐项对应。

离开本页前
均线比较近期与较长期平均,突破比较当前价格与历史边界,时间序列动量比较一项资产现在与自己的过去,截面动量则比较同一天的多项资产。四种方法都可能因确认而入场较晚,也会在横盘和快速反转中反复受伤。策略名称记住多少并不重要,能说清比较对象和失败路径才算读懂。