麦克莱伦振荡指标:公式、读数与宽度推力

麦克莱伦振荡指标(McClellan Oscillator)是一种市场宽度指标,等于纽交所(NYSE)每日净上涨家数(上涨家数减下跌家数)的 19 日 EMA 减去其 39 日 EMA。比率调整版则先用净上涨家数除以上涨与下跌家数之和,再乘以 1,000。读数在零轴上方说明市场宽度正在改善;若指标从 −50 以下一举摆动到 +50 以上,就构成一次宽度推力(breadth thrust)。
标普 500 指数可以创出新高,而大多数个股却在悄无声息地下跌。麦克莱伦振荡指标正是为捕捉这种情况而设计的。它由 Sherman McClellan 和 Marian McClellan 于 1969 年创立,把纽交所每日上涨和下跌的股票家数转化为一条动量线,这条线往往先于价格掉头。这篇 Quantum Algo 指南会给你两种公式、一个手算的两日示例、±50 和 ±100 水平的真正含义、宽度推力与累积指数(Summation Index)的原理、TradingView 上应使用的准确代码,以及一个可以输入你自己数据的计算器。
经得起公开验证的指标。
一个引擎,四款精准工具:Gold(XAU)Scalper、机构级 Gravity Zone、Zeno 动量振荡指标,以及面向股票的 Zeno Stocks。
麦克莱伦振荡指标到底衡量的是什么?
价格告诉你指数做了什么,市场宽度则告诉你有多少只股票跟着一起走。麦克莱伦振荡指标就是一种宽度指标:它完全由某个交易所(通常是纽交所)每日上涨和下跌的股票家数计算而来,完全不考虑指数点位。
它衡量的不只是上涨家数是否多于下跌家数。它把每日净上涨家数的一条快速均线和一条慢速均线进行比较,从而显示市场宽度相对其近期趋势是在改善还是在恶化。指标创立者之子 Tom McClellan 在接受 AAII 采访时说得很到位:“麦克莱伦振荡指标衡量的是市场宽度的加速度,而不仅仅是方向。”
这一区别解释了它的大部分表现。在一轮上涨家数天天占优的长期上涨之后,即使上涨家数仍然多于下跌家数,振荡指标也可能回落到零轴附近,原因仅仅是上涨的节奏放缓了。而在一次暴跌之后,只要出现几个强势的宽度交易日,指标就可能大幅转正,尽管此时指数仍远低于前高。加速度总是先于方向掉头,这就是为什么振荡指标常常在拐点处领先价格,也是它频繁大幅来回摆动的原因。
如果你用过 MACD,这个形态你会觉得很眼熟。它本质上就是两条指数移动平均线之差,只不过应用对象是市场宽度而不是价格。我们的 MACD 指南讲解了价格版本,而腾落线(advance-decline line)指南则解释了这个振荡指标所依赖的原始宽度数据。
谁发明了它?为什么是 19 天和 39 天?
Sherman McClellan 和 Marian McClellan 是一对住在南加州的夫妻,他们于 1969 年开发了这个振荡指标及其配套指标——累积指数(Summation Index)。数学专业出身的 Marian 用手工完成指数移动平均的计算;学过商科和经济学的 Sherman 则是在对基本面方法感到失望之后转向技术分析的。他们的小册子Patterns for Profit于 1970 年由 Trade Levels 首次出版,书中收录了八年手工计算的振荡指标和累积指数图表。
The McClellans built on the work of P.N. Haurlan, who used exponential moving averages on breadth data in the 1960s and, according to McClellan Financial, was an actual rocket scientist at the Jet Propulsion Laboratory. Haurlan described EMAs by their smoothing percentage rather than a day count, and the McClellans kept that language. The oscillator is officially the 10% Trend minus the 5% Trend of daily net advances.
19 和 39 这两个数字,来自用标准公式“平滑常数 = 2 ÷ (n + 1)”把百分比换算成天数。10% 的常数对应 2 ÷ 20,所以 n = 19;5% 的常数对应 2 ÷ 40,所以 n = 39。McClellan Financial 指出,这种天数标签“有些误导”,因为 EMA 使用的是全部历史数据,只是权重逐渐衰减,而不是一个固定的窗口。
2004 年,Sherman McClellan 获得市场技术分析师协会(Market Technicians Association)颁发的终身成就奖,以表彰这对夫妻的共同成果;Marian 已于 2003 年 11 月去世。
麦克莱伦振荡指标是如何计算的?
它有两个版本,而把两者混淆,正是不同网站上的数值对不上最常见的原因。
经典版(未调整)
Net advances = Advancing issues − Declining issues10% Trend today = 10% Trend yesterday + 0.10 × (Net advances − 10% Trend yesterday)5% Trend today = 5% Trend yesterday + 0.05 × (Net advances − 5% Trend yesterday)Oscillator = 10% Trend − 5% Trend比率调整版
几十年来,纽交所上市的股票数量变化很大,因此在交易品种少得多的年代,+500 的净上涨读数意味着完全不同的东西。比率调整版用当天有涨跌变动的股票总数做除数,再乘以 1,000 以避免出现小数:
RANA = (Advances − Declines) ÷ (Advances + Declines) × 1,000然后,对 RANA 按照上面完全相同的方法计算两条 EMA 及其差值。由于 RANA 是放大了 1,000 倍的百分比,+753 的读数意味着净上涨家数占当天有变动股票的 75.3%,这也是 StockCharts 使用的示例。由于计算是线性的,在计算 EMA 之前或之后乘以 ×1,000,结果都一样。
| 特征 | 经典版 | 比率调整版 |
|---|---|---|
| 输入数据 | 上涨家数 − 下跌家数 | (A − D) ÷ (A + D) × 1,000 |
| 不同年代之间可比 | 否 | 是 |
| StockCharts 代码(纽交所) | $NYMOT | $NYMO |
| 固定参考水平(±50、±100) | 没有意义 | 普遍使用 |
在序列起点,StockCharts 用简单平均值作为第一个 EMA 值。实际使用中,你至少需要几个月的数据才能信任这些读数,因为早期数值仍然带有初始值的影响。下面的计算器遵循同样的做法:19 日 EMA 以前 19 天的平均值作为初始值,39 日 EMA 以前 39 天的平均值作为初始值。
实例演算:手算两天的纽交所市场宽度
下面以比率调整版为例演示计算过程,使用整数便于你跟上每一步。假设在昨天收盘时,RANA 的 19 日 EMA 为 −35.0,39 日 EMA 为 +10.0,因此振荡指标为 −45.0。比率调整版累积指数为 +120。
第 1 天:上涨 2,150 家,下跌 650 家
- RANA = (2,150 − 650) ÷ (2,150 + 650) × 1,000 = 1,500 ÷ 2,800 × 1,000 = 535.71
- 19 日 EMA = −35.00 + 0.10 × (535.71 − (−35.00)) = −35.00 + 57.07 = 22.07
- 39 日 EMA = 10.00 + 0.05 × (535.71 − 10.00) = 10.00 + 26.29 = 36.29
- Oscillator = 22.07 − 36.29 ≈ −14.2
- 累积指数 = 120 + (−14.2) = 105.8
第 2 天:上涨 2,300 家,下跌 500 家
- RANA = 1,800 ÷ 2,800 × 1,000 = 642.86
- 19 日 EMA = 22.07 + 0.10 × (642.86 − 22.07) = 22.07 + 62.08 = 84.15
- 39 日 EMA = 36.29 + 0.05 × (642.86 − 36.29) = 36.29 + 30.33 = 66.62
- Oscillator = 84.15 − 66.62 ≈ +17.5
- 累积指数 = 105.8 + 17.5 = 123.3
连续两个极强的宽度交易日——当天有变动的股票中约四分之三上涨——把振荡指标抬高了 62.5 点,从 −45.0 升到 +17.5。这就是用数字呈现的“加速度”概念:快速 EMA 的反应强度是慢速 EMA 的两倍,因此市场宽度一旦突然变化,两条线就会迅速拉开距离。
现在再看经典版。第 1 天的净上涨家数就是 +1,500,而在一个上市品种较少的交易所,同样 75% 的宽度可能只有 +900。经典振荡指标的数值大小取决于交易的股票数量,这就是为什么 ±100 的阈值只对比率调整版序列有意义。
计算器预载了 60 天纽交所风格的示例数据:先是一段震荡行情,接着是下跌家数占绝对优势的急跌,最后是一轮强劲反弹。运行之后,你会看到比率调整版振荡指标最终为 +125.7,并标记出一次从 −138.1 开始的宽度推力。把菜单切换到经典版,同样的数据会得到 +339.8,由此可见两种刻度差别有多大。
读数的含义:零轴、±50、±100 及以上
对于比率调整版振荡指标,下表列出的参考水平是实战交易者和 StockCharts 示例中最常用的。请把它们当作区间,而不是触发信号。
| 读数 | 通常含义 | 我们的处理方式 |
|---|---|---|
| +100 以上 | 宽度极强劲地放量扩张;短线超买 | 出现在新一轮上涨初期时是强势信号,而不是卖出信号 |
| +50 至 +100 | 参与度高且范围广 | 支撑市场上涨 |
| 0 至 +50 | 上涨家数占优 | 温和看涨;关注斜率 |
| 0 至 −50 | 下跌家数占优 | 温和看跌;关注斜率 |
| −50 至 −100 | 大范围的沉重抛售 | 压力是真实的;等待拐头 |
| −100 以下 | 恐慌出清;短线超卖 | 留意急剧反转,尤其是价格位于支撑位时 |
AAII 的概述给出了类似的框架:超买区约在 +70 至 +100,超卖区约在 −70 至 −100,并指出在极端压力下读数可能达到 ±150 甚至更高。所以“超卖”并不是底。在真正的崩盘中,振荡指标可以一直停留在 −100 以下,而价格继续下跌。
零轴同样重要。读数为正,意味着 10% 趋势位于 5% 趋势之上,StockCharts 将其描述为上涨家数开始占据上风。但穿越零轴的情况经常发生,AAII 也提醒不要每次穿越都去交易。在深度负值之后、以陡峭斜率出现的穿越,比在平静市场中缓缓飘过零轴要有意义得多。StockCharts 的示例显示,在方向不明的时期,振荡指标一直在 +30 和 −30 之间徘徊——这本身就是一个信息:多空双方都没有掌控局面。
还有一个细节:行情初期出现的超买读数往往是看涨的。最强劲的上涨行情,开始时市场宽度往往一边倒,振荡指标会跳到远高于 +100 的位置。在这时卖出,就好比因为一只股票突破时成交量太大而把它卖掉。
什么是麦克莱伦宽度推力(breadth thrust)?

宽度推力是指市场从大范围抛售突然转向大范围买入。StockCharts 的定义是:振荡指标从 −50 以下升至 +50 以上,涨幅至少 100 点。这类急升往往出现在一轮像样上涨的起点附近,因为它说明买盘是同时涌入整个市场,而不是只集中在少数几只大盘股上。
StockCharts 的 ChartSchool 展示了几个例子。2009 年 3 月,纳斯达克的振荡指标从 −80 飙升至 +80,涨幅超过 150 点,恰好在熊市结束时出现。在另一个例子中,它从 −70 推升到 +50,上涨 120 点。在这两个案例中,关键不在于最终读数,而在于摆动的速度和幅度。
如何运用宽度推力
- Confirm it's real. The low point should be genuinely below −50 and the high above +50, ideally within a couple of weeks.
- Expect a pause. Lower highs on the oscillator after a thrust are normal. Breadth can't stay that lopsided for long, so the oscillator usually cools off while price keeps climbing or consolidates.
- Use price for timing. The thrust tells you the backdrop has improved. A higher low on the index, or a reclaim of a key moving average, is a better entry than buying the thrust day itself.
◆ Not fail-proof: StockCharts explicitly says breadth thrusts and zero-line crosses are "certainly not fail-proof." Use a thrust as a reason to stop being bearish, not as a guarantee of new highs.
不要把它和你可能读到的其他宽度推力信号混为一谈,例如 Martin Zweig 的版本,它们使用不同的公式和阈值。麦克莱伦版本是这个振荡指标特有的。如果想在盘中实时观察市场宽度,纽交所的 TICK 指数以分钟为单位体现了同样的思路。
如何交易麦克莱伦振荡指标的背离?

当指数创出更高的高点、而振荡指标却形成更低的高点时,就出现了看跌背离:参与新高的股票越来越少。看涨背离则相反:指数创出更低的低点,振荡指标却形成更高的低点,说明即便价格还在下滑,抛压正在减弱。
StockCharts 有两条规则,能让背离分析保持客观。第一,背离必须足够明显。振荡指标的高点只是略低一点,意义不大;ChartSchool 中 2007 年 10 月的例子显示,当市场接近顶部时,指标形成了一个明显更低的高点,而且“仅仅勉强为正”。第二,背离需要确认:看涨背离要以强势进入正值区域来确认,看跌背离则要以强势进入负值区域来确认。在此之前,它只是一个警示。
StockCharts 也承认了令人不太舒服的一点:背离很常见,而且“大多数不会导致反转或持续性行情”。因此,用它来提示你何时收紧止损或减小仓位,要比用它来决定何时反手更合适。
一个实用的过滤方法是,要求出现第二个独立的走弱或走强信号。在价格图上,可以是跌破上升趋势线,或是一次失败的突破。在其他宽度指标上,可以是腾落线未能确认新高,或是站上 50 日均线的股票比例开始回落。我们的免费工具 Multi-Oscillator Divergence Scanner 负责这种交叉验证中价格振荡指标的部分,而我们的 RSI 指南则讲解了背离在价格动量上的表现。
麦克莱伦累积指数(Summation Index)是如何运作的?
Marian McClellan 将累积指数设计为每日振荡指标数值的累计总和,也就是振荡指标曲线下方的面积。振荡指标反映的是市场宽度的短期动量,而累积指数反映的是中期趋势。
Summation Index today = Summation Index yesterday + Oscillator todayStockCharts 指出,累积指数的第一个值就是振荡指标的第一个值。最初的经典版整体上移了 1,000 点,因此其中性水平是 +1,000,正常读数大致在 0 到 2,000 之间。比率调整版(RASI,在 StockCharts 上为 $NYSI)则以零为中心。
交易者关注的读数
- Direction. A rising Summation Index means the oscillator is positive and breadth is supporting the trend. StockCharts suggests smoothing it with a moving average, for example 20 days, and watching for turns.
- The zero line (RASI). Above zero favors bulls, below favors bears. Sustained readings matter more than single crosses.
- ±500 (RASI). Tom McClellan has written that a RASI move from below −500 to well above +500 shows a rally has enough "escape velocity" to continue, and that a failure to reach +500 warns the uptrend may not be strong. StockCharts presents ±500 as an example threshold a chartist can set, not a standard rule.
据 StockCharts 称,纳斯达克版本($NASI)长期存在向下的偏差,因此应把它的读数与其自身历史比较,而不是与纽交所版本比较。
如何在 TradingView 上绘制麦克莱伦振荡指标?
TradingView 以美国统计指数代码的形式提供原始宽度数据。以下是你需要的代码,均已在 TradingView 的代码页面上核实:
| 代码 | 含义 | 用途 |
|---|---|---|
| USI:ADVN.NY | 纽交所上涨家数 | 比率调整版纽交所振荡指标 |
| USI:DECL.NY | 纽交所下跌家数 | 比率调整版纽交所振荡指标 |
| USI:ADD | 纽交所上涨家数减下跌家数 | 经典版纽交所振荡指标 |
| USI:ADVN.NQ / USI:DECL.NQ | 纳斯达克上涨 / 下跌家数 | 比率调整版纳斯达克振荡指标 |
| USI:ADDQ | 纳斯达克上涨家数减下跌家数 | 经典版纳斯达克振荡指标 |
最简单的方法是使用社区脚本。打开“指标”,进入“社区”,搜索“McClellan Oscillator”。LazyBear 的开源版本是使用最广泛的之一;其说明写道,它支持比率调整模式,允许你选择任意市场的上涨和下跌家数,默认使用纽交所数据。如果你希望 ±100 的参考水平适用,请确认它已设为比率调整模式。
如果你更想亲眼看到计算过程,一个最简的 Pine 版本只需几行:
//@version=6indicator("McClellan Oscillator (ratio-adjusted)")adv = request.security("USI:ADVN.NY", "D", close)dec = request.security("USI:DECL.NY", "D", close)rana = (adv - dec) / (adv + dec) * 1000osc = ta.ema(rana, 19) - ta.ema(rana, 39)plot(osc, "McClellan", style = plot.style_columns, color = osc >= 0 ? color.teal : color.red)hline(100)、hline(0)、hline(-100)
把它加载到标普 500 或纽约证交所综合指数(NYSE Composite)的日线图上。Pine 的 ta.ema 使用同样的 2 ÷ (n + 1) 常数,因此长度 19 和 39 正好重现 10% 趋势和 5% 趋势。与公开发布的数值存在小幅差异是正常的:各数据商统计股票家数的方式略有不同,而且初始值会影响早期读数。如需计算累积值,添加 sumIdx = ta.cum(osc) 并在单独的窗格中绘制。如果你刚接触 Pine 和多窗格布局,我们的 TradingView 指南介绍了基础知识。
如何把它用于标普 500 和纽交所?
振荡指标是根据纽交所的市场宽度计算的,但大多数人是通过 SPY、ES 期货或指数 CFD 来交易标普 500 的。这没有问题。纽交所市场宽度与标普 500 的驱动因素大部分相同,而振荡指标的任务是描述市场的内部健康状况,并不是要与指数逐笔吻合。
这里有一个众所周知的复杂因素。纽交所上市的很多品种并不是实体经营公司,包括封闭式债券基金和优先股,它们可能更多地随利率而非股市波动。因此,一些分析师更偏好只统计普通股的宽度数据。Tom McClellan 的看法是,这个问题“被夸大了”,两个版本的图表结构差别并不大,而且仅限普通股的数据通常要在收盘后很久才能拿到。我们会继续使用标准序列,但在利率剧烈波动时保持警惕。
一套简单的操作手册
- Regime: Summation Index rising and above zero means you favor longs on pullbacks. Falling and below zero means you favor caution or shorts on rallies.
- Setup: in a rising regime, an oscillator dip toward −50 to −100 while the S&P 500 holds above a key moving average is a classic buy-the-dip zone, the breadth version of the setups in our mean reversion trading guide.
- Warning: a new S&P 500 high with an oscillator high that's sharply lower, especially barely positive, says participation is narrowing. Tighten stops.
- Turn: after a deep washout below −100, a thrust above +50 says the selling is exhausted; use price structure for the entry.
市场宽度与情绪指标搭配使用效果也很好。−100 以下的恐慌出清,如果与认沽/认购比率(put/call ratio)的极端读数同时出现,比单独任何一个都更能说明低点将至。再配合在指数上表现良好的价格类工具,这些我们在标普 500 最佳指标中有详细介绍。如果你的投资组合偏重纳斯达克,也要运行纳斯达克版本,价格方面可参考我们的纳斯达克最佳指标指南。如果你交易加密货币,同样的逻辑也适用于币种篮子,具体见加密货币市场宽度指标指南。
麦克莱伦振荡指标的局限与常见错误
- Comparing classic and ratio-adjusted numbers. A +300 classic reading and a +300 ratio-adjusted reading are not the same thing. Know which series you're looking at.
- Selling every reading above +100. Extreme positive readings often mark the start of strong rallies. Overbought early is strength.
- Buying every reading below −100. In a crash, the oscillator can stay deeply negative for days. Wait for a turn.
- Trading every zero cross. Crossings are frequent and noisy. Use the slope, the depth of the prior swing and the Summation Index for context.
- Trusting every divergence. By StockCharts' own account, most divergences don't lead to reversals.
- Using too little history. EMAs need warm-up. With less than a few months of data, your values depend heavily on the seed.
- Applying it to single stocks. It's a market-wide breadth tool. It tells you about the tide, not about one boat.
- Ignoring data quirks. Vendors differ in how they count issues and handle unchanged stocks, so your values may not match another site's exactly. McClellan Financial itself notes differences can come from different data or calculation errors on either end.
最大的局限是结构性的。市场宽度描述的是参与度,而当少数几只超大盘股推动指数走高时,参与度可能会在很长一段时间里保持狭窄。在这类行情中,看跌的宽度读数可能在几个月里都“正确地”反映了内部疲弱,而指数却并没有下跌。用振荡指标来调整风险,而不是用来猜顶。如果你想从另一个角度观察市场内部结构,Smart Money Index 关注的是指数在盘中不同时段的走势,而不是参与度。
麦克莱伦振荡指标与 Quantum Algo
麦克莱伦振荡指标最适合作为凌驾于具体交易工具之上的市场过滤器。在价格方面,我们的免费工具 Market Bottom Finder 与 −100 以下的恐慌出清读数天然契合,而 Directional Strength Index 则能告诉你指数趋势是否足够强,值得信任一次宽度推力。如果想了解另一种基于 EMA 的价格动量指标,TRIX 指标指南是很好的补充。
如果你用 Zeno Stocks(Quantum Algo 面向 TradingView 的高级 Zeno 套件之一)交易标普 500 或纳斯达克,一个合理的分工是:用市场宽度判断市场环境,用 Zeno 把握时机和风险——当累积指数上升时,可以更积极地采纳 Zeno 的买入信号;当市场宽度恶化时,则要更加挑剔。Zeno 提供带止损和目标位的入场点;振荡指标告诉你市场内部结构是否站在你这一边。你可以在公开的历史战绩(track record)页面查看信号的历史表现,免费的 QuantumAlgo Academy 也更深入地讲解了市场宽度和指数交易。
◆ 互动检查
您对 麦克莱伦振荡指标 了解多少?
交易者常问的 麦克莱伦振荡指标 问题
对于比率调整版,读数高于零说明上涨家数占上风,+50 至 +100 表示参与度强,高于 +100 则是短线极端值。低于 −100 属于恐慌出清。结合背景判断比任何单一数字都重要。
这意味着市场宽度极度负面,处于短线超卖状态,下跌家数远远多于上涨家数。它常出现在短线低点附近,但在严重抛售中,读数可能跌至 −150 甚至更低,价格才会掉头。
NYMO 是 StockCharts 上比率调整版纽交所麦克莱伦振荡指标的代码,是一条短期宽度动量线。NYSI 是比率调整版麦克莱伦累积指数,即 NYMO 的累计总和,用于判断中期趋势。
它经常先于价格掉头,因为它衡量的是市场宽度的加速度而不是方向。这让它在许多拐点上提前发出信号,但也会产生大量假信号,所以要结合价格确认来使用。
你可以添加社区脚本,例如 LazyBear 的 McClellan Oscillator,也可以用 USI:ADVN.NY 和 USI:DECL.NY 在 Pine 中自己编写。本指南附有一个八行的 Pine 版本。
麦克莱伦夫妇使用的 EMA 是用平滑百分比来描述的,即 10% 和 5%。按照 2 ÷ (n + 1) 的公式,10% 的常数相当于 19 天,5% 的常数相当于 39 天。
它先用净上涨家数除以上涨与下跌家数之和,再乘以 1,000,然后才计算 EMA。这样可以消除上市股票数量变化的影响,使不同年代的读数可以相互比较。
可以,使用纳斯达克的上涨和下跌家数即可(在 TradingView 上为 USI:ADVN.NQ 和 USI:DECL.NQ)。纳斯达克累积指数长期存在向下偏差,因此应与其自身历史进行比较。
腾落线是每日净上涨家数的累计总和,显示长期的市场宽度趋势。振荡指标则是净上涨家数两条 EMA 之差,显示短期动量。详见我们的腾落线指南。
不可以。它基于整个交易所的宽度数据构建,描述的是整个市场。对于单只股票,请改用价格和成交量指标。
参考资料与相关指南
接下来阅读
- 什么是腾落线?如何使用?
- S&P 500(SPX500)的最佳指标是什么?
- MACD 指标:完整交易指南
- 什么是 Crypto 市场宽度指标?
- 看跌/看涨期权比率:衡量什么、如何解读,以及何时真正有效
- Smart Money Index:开盘对收盘指标如何追踪机构资金
- 免费 TradingView 指标
- Zeno — 高级引擎
主要来源
- StockCharts ChartSchool — McClellan Oscillator
- StockCharts ChartSchool — McClellan Summation Index
- McClellan Financial Publications — Calculating the McClellan Oscillator
- McClellan Financial Publications — Sherman McClellan MTA Lifetime Achievement Award (PDF)
- McClellan Financial Publications — RASI Above +500 Says Bull Market Not Done
- AAII — Looking Beyond Price Trends With the McClellan Oscillator
- TradingView — USI:ADD, NYSE $ADV minus $DECL
- TradingView — McClellan Oscillator [LazyBear] (open-source script)