第 19 课 趋势、均线、突破与动量¶
这一家族愿意在方向已经出现以后再进入,用确认带来的滞后换取一段行情继续发展的可能。
这一家族不负责预测最高点和最低点¶
假设价格从 10 元缓慢上涨到 12 元。趋势策略通常不会在 10 元最低点买入,因为当时还没有足够证据说明方向已经形成。它会等价格超过某条均线、突破过去区间或累计收益转正以后再行动。等到趋势结束,退出信号也会晚于最高点出现。
这段滞后来自确认方向所支付的结构成本。规则放弃最早一段行情,希望减少在没有方向时随意猜测。市场持续单边发展时,延续部分可能覆盖入场与退出的损失;价格反复横盘时,确认信号会一再出现又消失,许多小亏与交易费用便逐步累积。
趋势、突破和动量共享“过去方向可能延续”的大假设,却观察不同对象。均线与突破常判断单项资产当前状态,时间序列动量比较一项资产自己的过去,截面动量在同一日期比较许多资产的相对强弱。先把比较对象分清,后面的公式和验证才不会混在一起。
四种方法先放在同一张地图上¶
| 方法 | 它拿什么作比较 | 信号的朴素含义 | 主要结构风险 |
|---|---|---|---|
| 均线趋势 | 当前价格或短均线与较长均线 | 近期方向高于较慢中心 | 信号滞后、横盘反复 |
| 区间突破 | 当前价格与过去区间边界 | 价格进入过去没有到达的新区域 | 假突破、跳空与滑点 |
| 时间序列动量 | 单项资产现在与自身过去 | 自身过去方向可能继续 | 状态突然反转、做空限制 |
| 截面动量 | 同一日期不同资产的过去表现 | 相对赢家可能继续强于相对输家 | 拥挤反转、行业和市场暴露 |
这张表只说明指标与核心假设。完整策略仍要补上数据口径、信号形成时点、订单、持仓、退出、成本、风险上限、基线与时间验证。后面每种方法都会先用小数字解释,再给公式与代码。
移动平均先回答近期价格大致在哪¶
小岚观察三个收盘价 10 元、11 元和 12 元。若只看最后一天,12 元无法说明前面路径;把三天相加得到 33 元,再除以 3,得到平均价 11 元。这个数字把三天价格压成一个近期中心,也减少了单日波动的影响。
第二天过去以后,窗口会向前移动。假设第四天收盘为 13 元,新的三日平均不再使用最早的 10 元,而是计算 11、12 和 13 的平均,得到 12 元。每前进一天就移除最旧价格、加入最新价格,因此叫作移动平均。
把长度从三日推广到 \(n\) 日,信号日写作 \(t\),简单移动平均可以写成下面的形式。
\(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\) 是今天开盘前就能由过去数据得到的上轨,\(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\) 期的收益方向可以写成下面的信号。
函数 sign 只保留正、零或负方向。它丢掉了趋势强度,优点是规则透明。完整策略还要规定未来哪一段持有、信号多久更新、空头怎样借券或通过期货实现,以及不同资产如何控制风险。
下面代码输入单项资产收盘价,任务是计算约一年的过去收益并提取方向。输出 1 表示过去收益为正,-1 表示为负,前二百五十二个交易日因为历史不足会缺失。
跨资产期货研究常让仓位随近期波动调整,避免高波动品种主导组合。波动目标与风险上限将在第 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 的研究是股票截面动量的重要早期文献,入口同样列在参考资料中。论文使用的市场、样本、形成期与持有期都要在阅读卡中还原,不能只保留“买赢家”三个字。
为什么有些研究跳过最近一个月¶
股票短期内可能出现反转,交易微观结构也会让最近价格包含暂时冲击。部分经典截面动量研究因此使用大约十二个月前到一个月前的价格,暂时跳过最近一个月。这个选择把中期延续与极短期反转分开研究。
假设今天是十二月底,信号不会直接用今天与去年十二月底比较,而是用大约一个月前的价格与大约十二个月前的价格比较。代码可以把整个价格序列先向后移动二十一个交易日,再计算更早区间收益。
运行前要画出两个价格日期,确认分子来自约一个月前,分母来自约十二个月前。二十一与二百五十二只是交易日近似,不能脱离市场日历当成永久答案。研究包含近期与跳过近期的版本时,要提前说明比较目的并记录全部结果。
双动量把相对排名与自身方向连接起来¶
相对动量可能选出“一群下跌资产中跌得最少的那一个”。双动量先在资产之间选择相对强者,再要求入选资产自己的过去收益为正。相对条件回答谁更强,绝对条件回答它是否仍处于正方向。没有对象同时通过时,规则会转向现金或事先指定的防御资产。
这个过滤能减少普遍下跌期的持仓,也会在快速反弹时较晚重新进入。现金替代资产的利息、转换成本和可交易时间都要进入账本。新增绝对条件是否有价值,应与只有相对排名的简单版本使用同一候选池、时间和费用比较。
多层过滤需要逐层证明增量¶
有些轮动研究先按中期动量排序,再要求价格位于长期均线上方,用短期指标避开过热日期,最后按照波动调整仓位。每一层都能讲出一个故事,也会增加参数、换手与选择机会。研究者应把完整方案拆成逐层版本。
| 版本 | 保留的组件 | 它要单独回答的问题 |
|---|---|---|
| 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 开放思考¶
趋势策略为什么常出现许多小亏与少数大盈利,这种分布会怎样影响止损设计?
评价要点
确认方向需要等待,横盘会产生多次失败信号,持续趋势才可能形成长盈利。止损过紧虽然减少单次损失,也可能截断关键长趋势;应结合交易分布、费用、跳空与仓位共同验证。参考资料¶
时间序列动量、股票截面动量、唐奇安与海龟体系的文献入口统一列在参考资料中。阅读原文时请记录资产范围、样本时期、信号形成、持有期、费用与验证方法,再与本课策略卡逐项对应。
均线比较近期与较长期平均,突破比较当前价格与历史边界,时间序列动量比较一项资产现在与自己的过去,截面动量则比较同一天的多项资产。四种方法都可能因确认而入场较晚,也会在横盘和快速反转中反复受伤。策略名称记住多少并不重要,能说清比较对象和失败路径才算读懂。