MACD被股民戏称为技术分析领域的Abandon,是每个刚开始学习技术分析的同学都躲不开的一个指标。

几十年来,我们一直被教导,将MACD(移动平均收敛散度指标)视为一个发现金叉与死叉的简单工具。我们盯着两条线的交汇,然后做出反应。

但大多数交易者都体验过MACD带来的困扰:它似乎总是慢半拍,在震荡市中频繁发出错误的信号,而其默认的(12, 26, 9)参数组合,似乎也有点玄学 。这些挫败感是真实存在的,它们源于一个根本性的误解:我们一直在观察指标的影子,而非其本体。

本文将带领你重新审视MACD。我们将从基础出发,彻底厘清其传统逻辑,随后进行一次深度探索,从数字信号处理(DSP)与物理学模型的视角,揭示其不为人知的真实机制。最终,你将获得一套客观、可量化的进阶交易策略(Python代码在文末给出)。

第一部分:MACD基础概念

在揭示MACD的深层秘密之前,我们必须确保每一位读者都站在同一起跑线上。我们将在这部分细致地讲解MACD的传统定义、构成要素和经典信号,为后续的进阶内容构建必要的词汇和概念基础。

MACD指标由杰拉尔德·阿佩尔(Gerald Appel)于上世纪70年代开发,其核心思想是创造一个既简单又有效的动量震荡指标 。它的本质,是通过追踪两条不同速度的移动平均线之间的关系,来衡量市场趋势的强度和动能的变化 。  

MACD指标的构成

当你在任何交易软件中调出MACD指标时,通常会看到四样东西:两条线、一簇柱状图,以及一条贯穿中心的零轴。让我们逐一拆解它们 。  

MACD线(DIF线,也叫快线):

这是MACD指标的核心引擎。它的计算公式是短期指数移动平均线(EMA)减去长期指数移动平均线(EMA)。最常用的参数是12周期和26周期 。  

\begin{equation} \text{MACD Line (DIF)} = \text{EMA}(12) – \text{EMA}(26) \end{equation}

这条线衡量的是短期动量相对于长期趋势的偏离度。当快线(12周期EMA)比慢线(26周期EMA)上涨得更快时,MACD线就会上升,反之则下降。因此,它反映了市场动能的直接变化 。  

信号线(DEA线,也叫慢线):

信号线是对MACD线本身进行的平滑处理,通常是计算MACD线的9周期EMA

\begin{equation} \text{Signal Line (DEA)} = \text{EMA}(\text{MACD Line}, 9) \end{equation}

它的作用类似于一个过滤器或缓冲器,通过平滑MACD线的波动,来提供更清晰、更可靠的交易触发信号 。由于它是对MACD线的平均,所以它的反应速度总是比MACD线慢,故称慢线。  

柱状图(Histogram或OSC):

柱状图并非独立元素,它仅仅是MACD线与信号线之间差距的视觉化呈现

\begin{equation} \text{Histogram} = \text{MACD Line} – \text{Signal Line} \end{equation}

当MACD线在信号线上方时,柱状图为正(通常显示为绿色或红色),柱子的高度代表两者相距多远。当MACD线在信号线下方时,柱状图为负(通常显示为另一种颜色),柱子的深度同样代表差距。柱状图的伸长或缩短,直观地展示了动能是在增强还是在减弱 。  

零轴 (多空分界线):

零轴是整个指标图的中心线。当MACD线位于零轴之上时,意味着短期EMA高于长期EMA,市场处于多头动能区域;反之,当MACD线位于零轴之下时,市场则处于空头动能区域 。零轴本身就是短期趋势与长期趋势的平衡点。  

经典交易信号:市场共识的语言

基于以上四个元素,交易者发展出了三种经典的解读方式。

MACD金叉和死叉的图解

金叉(Bullish Crossover)

当反应更快的MACD线(快线)从下向上穿越反应较慢的信号线(慢线)时,这被称为金叉 。这通常被解读为一个买入信号,其背后的逻辑是:短期动能的增长速度已经超越了其近期的平均增长速度,预示着一轮上涨行情可能开启 。  

死叉(Bearish Crossover)

与金叉相反,当MACD线从上向下穿越信号线时,形成死叉,这被视为一个卖出信号 。它意味着短期动能正在快速衰竭,空头力量可能开始占据主导 。  

背离(Divergence)

MACD背离

背离是MACD传统用法中最具前瞻性的信号。它指的是指标的走势与价格的走势出现了不一致 。  

  • 看涨背离(Bullish Divergence):当价格创出新低,但MACD指标的对应低点却在抬高时,形成看涨背离。这暗示着尽管价格仍在下跌,但下跌的动能已经显著减弱,趋势可能即将反转向上 。  
  • 看跌背离(Bearish Divergence):当价格创出新高,但MACD指标的对应高点却在降低时,形成看跌背离。这表明上涨动能正在枯竭,即便价格表面上依旧强劲,但内部力量已经衰退,是潜在的顶部信号 。  

然而,传统解读的局限性也恰恰在于此。

一个金叉信号,仅仅告诉我们MACD线的值大于了它自身的9周期平均值。这个定性的事件,并未提供任何关于趋势强度、市场波动性或该信号统计显著性的信息。它是一个在复杂、量化的世界里,过于简化的二元事件。正是这种对定性模式的依赖,导致了MACD在特定市场环境下的频繁失效。

而这,也正是我们接下来要用一个全新的量化框架去解决的核心问题。

第二部分:作为数字信号处理器的MACD

传统的技术分析将MACD视为一种描述性工具,但从第一性原理出发,MACD实际上是一个设计精密的数字信号处理(Digital Signal Processing, DSP)系统 。这个系统并非随意构建,它的每一个组件都对应着一种特定的数字滤波器,其终极目标是测量价格运动的物理属性。  

为了理解这个新框架,我们需要引入一个核心类比:如果把资产的价格(Price)看作一个物体在空间中的位置(Position),那么这个物体运动的其它物理属性是什么?

答案是速度和加速度。

这个看似简单的类比,是解锁MACD深层逻辑的钥匙 。  

EMA:平滑位置的低通滤波器

指数移动平均线(EMA)是MACD的基础构件。在DSP术语中,EMA是一种递归低通滤波器 。它的作用就像相机的降噪功能,通过赋予近期数据更高的权重,来平滑原始的价格时间序列,滤除高频噪音(即短期、无意义的市场波动),从而更清晰地揭示出底层的信号(即趋势)。

\begin{equation} EMA_t = \alpha \cdot \text{Price}_t + (1 – \alpha) \cdot EMA_{t-1} \end{equation}

其中,平滑系数 α 由周期 N 决定,即 α=2/(N+1)。周期 N 越短(如12),α 越大,滤波器允许通过的频率就越高,对价格变化越敏感;周期 N 越长(如26),α 越小,滤波器就越平滑,能更有效地滤除噪音 。  

MACD线:测量价格速度的带通滤波器

这是第一个颠覆性的认知。MACD线的计算公式 EMA(12)−EMA(26),在数学上等同于对价格序列应用了一个带通滤波器 。  

想象一下,EMA(12)是一个轻度滤除噪音的信号,保留了较多的价格波动信息。而EMA(26)是一个重度滤除噪音的信号,代表了更长期的趋势。

当用前者减去后者时,这个操作巧妙地剔除了极低频的成分(长期趋势本身)和极高频的成分(市场噪音),最终只留下了一个特定频带内的信号。

这个信号,就是价格的变化率,也就是物理学中的一阶导数——速度(Velocity) 。  

这一解释意义深远。它意味着:

  • 一个正值的MACD线,不再仅仅是模糊的看涨动量,而是精确地表示,在MACD这个滤波器所关注的周期频带内,价格的速度为正
  • MACD线上升,意味着价格正在加速上涨。
  • MACD线下降,意味着价格正在减速上涨,或者正在加速下跌。

柱状图:测量价格加速度的高通滤波器

这是第二个颠覆性的认知。柱状图的计算公式是 MACD线−信号线。信号线本身是对MACD线(速度)应用的低通滤波器(EMA(9))。从一个原始信号中减去其平滑后的版本,是数字信号处理中估算该信号导数的经典技术 。  

因此,柱状图量化的正是速度的变化率,也就是物理学中的二阶导数——加速度(Acceleration) 。  

这就完美地解释了为何柱状图被认为是MACD的领先指标。在物理世界中,一个物体的加速度必须先改变,其速度的方向才可能改变。例如,一辆高速向北行驶的汽车,必须先经历向南的加速度(即刹车),其向北的速度才会减慢、归零,并最终转为向南。

同理,在市场中:

  • 柱状图(加速度)必须先开始向零轴回落(加速度减小),然后MACD线(速度)才能达到其峰值。
  • 柱状图(加速度)必须先穿越零轴(加速度变为负值),然后MACD线(速度)才可能与信号线(平滑后的速度)发生死叉(速度方向改变的信号)。

这场关于MACD是领先还是滞后的争论,在这里得到了数学上的终结。

MACD线(速度)是价格(位置)的滞后指标,因为导数天然滞后于原函数。

但柱状图(加速度)是MACD线(速度)的领先指标,因为它揭示了动能变化的内在驱动力 。

交易者们所熟知的金叉/死叉,实际上只是加速度变化所导致的结果,是一个已经发生的过程的确认,而非预测。  

下图做个简单总结,方便大家理解:

MACD的信号处理视角
图有点小,点击可以放大

第三部分:用统计学洞察MACD的内在规律

如果说物理学视角揭示了MACD是什么,那么统计学视角则告诉我们如何利用它来构建概率优势。

接下来我们将把MACD及其组成部分视为可分析的随机过程,从单纯的模式识别,转向构建基于可量化概率和期望值的交易模型,这正是量化交易的精髓所在 。  

金融资产的价格通常被建模为非平稳时间序列,它们具有趋势性(均值随时间变化)和变化的方差,这使得直接进行预测性建模极为困难 。然而,MACD计算过程中内含的差分操作(即EMA相减),恰好是一种能将非平稳序列转换为更接近平稳序列的数学技巧 。  

一个平稳的时间序列,其统计特性(如均值和方差)不随时间改变。通过应用如增强迪基-福勒(ADF)等统计检验,可以证明,虽然价格序列通常是非平稳的,但MACD柱状图序列在很大程度上是平稳的 。  

这一特性引出了一个至关重要的推论:根据其定义,一个平稳序列必然是均值回归的

MACD柱状图的均值就是零轴。这意味着,柱状图的每一次偏离零轴,都会产生一种统计上的张力,将其拉回至零。这种偏离的幅度越大,回归的统计压力就越强。  

这就为交易策略提供了坚实的统计学基础。

  • 一个极端的负值柱状图(例如,低于均值超过2个标准差),不仅仅是超卖的视觉信号,它代表了一个具有高回归概率的统计状态。
  • 一个看涨的金叉(柱状图由负转正),不再是一个孤立的买入事件,而是一个均值回归过程的高潮。
  • 基于此,可以构建一种反向操作策略:在柱状图达到极端负值时入场做多,并将零轴作为第一个概率目标位,而不是等待交叉信号的出现 。  

尽管MACD柱状图是均值回归的,但它的数值分布并非标准的正态分布(钟形曲线)。它表现出典型的肥尾特性,即极端值(无论是极正还是极负)的出现频率远高于正态分布的预测 。  

这些统计学上的尾部事件,在市场中往往对应着最关键的时刻:趋势的耗尽、恐慌性抛售的投降阶段,或是非理性的狂热顶部。

因此,并非所有的MACD信号都生而平等。一个在柱状图处于历史极值区域(例如,位于其滚动分布的第95或第5百分位)后产生的交叉信号,其可靠性和重要性远大于在低波动盘整期于零轴附近产生的微弱信号 。  

这为我们提供了一种量化信号强度或质量的方法。我们可以构建一个过滤器:

  1. 计算柱状图的滚动标准差,以此作为市场波动性的代理指标。
  2. 设定一个阈值,例如,仅当交叉发生前,柱状图的绝对值超过其100周期滚动标准差的1.5倍时,才接受该交叉信号。
  3. 这个简单的规则可以有效地过滤掉大量在横盘震荡市场中产生的、低置信度的“噪音”信号,从而显著提升策略的胜率 。  

通过这种方式,我们从被动地接受每一个信号,转变为主动地、基于统计显著性去筛选高价值的交易机会。

第四部分:构建自适应MACD框架

现在我们来直面标准MACD最致命的缺陷:

其固定的参数(12, 26, 9)使其成为一个僵化的系统,无法适应千变万化的市场环境 。

在某些市场中,它反应太慢;在另一些市场中,它又过于敏感。接下来我们将构建一个系统性框架,用于创造一个能够根据市场状态动态调整自身的自适应MACD。  

首先必须破除一个迷思:(12, 26, 9) 并非某种经过科学优化的黄金参数。

它很大程度上是历史的产物,源于过去每周有6个交易日的市场环境 。在数字信号处理的视角下,这组数字定义了MACD滤波器的固定频率响应,也就是说它对特定长度的市场周期其实是最为敏感的。  

固守这套参数肯定是不可取的。毕竟现代市场每周交易5天,其波动性和周期特征已截然不同。大量研究表明,通过历史数据回测找到的一组最优静态参数,往往是曲线拟合的产物,在样本外表现不佳 。  

真正的解决方案不是去寻找一组完美的静态数字,而是构建一个能够实时动态调整参数的系统。其核心思想是,让参数成为市场状态的函数:

\begin{equation} \text{参数} = f(\text{市场状态}) \end{equation}

解决方案一:内部自适应

第一种方法是从内部改造MACD的计算公式,用能够根据市场波动性自动调整其平滑周期的移动平均线,来替代标准的EMA。

  • 考夫曼自适应移动平均线 (KAMA):KAMA的核心是其效率比率(Efficiency Ratio),该比率衡量价格运动的信噪比。当趋势强劲、噪音低时,KAMA会自动加速,变得对价格变化更敏感;当市场进入盘整、噪音高时,KAMA则会自动减速,变得更平滑以过滤掉无效波动 。  
  • 分形自适应移动平均线 (FRAMA):FRAMA则利用分形几何学的概念来衡量市场的复杂性。在方向明确的趋势市场中(分形维数低),FRAMA的反应会变得非常迅速;在复杂混乱的震荡市场中(分形维数高),它则会变得异常平滑 。  

基于此,我们可以构建一个全新的指标,称之为自适应MACD(A-MACD):

这个A-MACD指标从根本上解决了标准MACD的核心矛盾。它能够在趋势行情中变得灵敏以尽早捕捉动量,又能在区间行情中变得迟钝以避免拉锯亏损,成为一个更稳健的全天候工具 。  

解决方案二:外部自适应

第二种方法则是在不改变MACD内部公式的前提下,使用外部指标将市场划分为不同的状态(Regime),并为每种状态匹配最合适的MACD策略和参数。这就像一个智能汽车的驾驶模式切换系统:在高速公路上激活巡航模式,在市区激活经济模式,在山路激活运动模式。

我们可以使用如平均趋向指标(ADX)来衡量趋势强度,以及平均真实波幅(ATR)来衡量波动率,从而构建一个量化的市场状态过滤器 。  

一个完整的量化交易系统可以围绕一个状态机来构建:

  1. 状态诊断:系统首先使用ADX和ATR等指标判断当前市场属于哪种状态。
  2. 策略匹配:根据诊断结果,激活相应的MACD交易模块和参数集。

例如,一个基于规则的系统可以是:

  • 如果 ADX > 25 (强趋势状态):激活“趋势跟踪_MACD_交叉_模块”,使用标准或稍长的参数,顺势交易交叉信号。
  • 如果 ADX < 20 (区间震荡状态):激活“均值回归_柱状图_模块”,忽略所有交叉信号,转而将柱状图的极端读数作为反向交易的依据。
  • 如果 ATR 处于历史高百分位(高波动突破状态):激活“突破_捕捉_模块”,并自动切换到更短的MACD参数(如5, 35, 5),以提高灵敏度,捕捉突破行情的初始爆发力 。  

这种方法远比盲目地在所有市场条件下应用同一种策略要稳健得多。下表清晰地展示了这个框架的运作逻辑。

市场状态量化过滤器主要MACD弱点推荐策略参数调整
强劲牛市趋势Price > EMA(200) & ADX > 25信号滞后顺势交易看涨交叉标准(12,26,9)或稍长
强劲熊市趋势Price < EMA(200) & ADX > 25信号滞后顺势交易看跌交叉标准(12,26,9)或稍长
区间/盘整ADX < 20产生大量错误交叉信号柱状图均值回归延长周期(如21,55,9)以减少噪音
高波动/突破ATR 处于高百分位对突然的价格变动反应慢交易柱状图的快速扩张缩短周期(如5,35,5)以提高灵敏度

第五部分:三种可执行的进阶量化策略

接下来我们将前面所有的理论工作、物理学模型、统计学思考和自适应框架,全部融合成具体、新颖且可测试的量化交易策略。这些策略是传统技术分析文献中无法找到的,它们是建立在对MACD第一性原理理解之上的直接产物

策略一:柱状图的高阶导数策略

既然柱状图代表价格的加速度(二阶导数),那么柱状图自身的变化率,就代表了价格的三阶导数(在物理学中称为Jerk,急动)和四阶导数(称为Jounce/Snap,加加加速度,嗯,没有打错字,就是加加加速度😂)。这些更高阶的导数,提供了关于市场动态变化的最早期信号,它们是动能拐点的拐点 。  

策略构建

第一步:计算柱状图速度

第二步:计算柱状图加速度

信号生成逻辑:交易信号不再是等待MACD交叉,甚至不是等待柱状图穿越零轴,而是在动能变化的加速度层面产生。

当柱状图处于深度负值区域时(市场处于强劲的下跌加速度中),我们观察其急动(Histogram_Velocity)。当急动达到负向极值并开始回升时(即其导数 加加加速度Histogram_Acceleration刚刚由负转正),这表明向下的加速度正在减缓。这个时刻,就是最领先的买入信号,它预示着柱状图即将触底反弹,远早于任何传统的交叉信号 。

策略二:多时间框架共振策略

核心概念:超越传统的多时间框架分析(即在高时间框架的趋势方向上,寻找低时间框架的入场信号)。共振策略寻求的是在具有数学关联的多个时间框架上,不同物理量(位置、速度、加速度)的谐波对齐 。  

策略构建

定义时间框架:选择一组具有近似分形关系的时间框架,例如:

  • 日线图 (Daily):代表长期位置
  • 4小时图 (H4):代表中期速度
  • 1小时图 (H1):代表短期加速度

信号生成逻辑(高概率共振买入信号):一个高置信度的买入信号,仅在以下三个条件同时或在极短时间内相继满足时才被触发:

  • 日线图(位置确认):MACD处于看涨状态(例如,MACD线在零轴之上),确认长期市场环境对多头有利。
  • H4图(速度确认):MACD刚刚发生看涨的金叉,确认中期动能(速度)已经转为向上。
  • H1图(加速度触发):MACD柱状图刚刚触底反弹(可使用策略一中的急动策略进行精确识别),确认短期下跌的加速度已经耗尽,并开始转为正向加速度。

这种跨越多个时间维度的位置、速度和加速度的协同对齐,表明一个强大且结构稳固的市场运动正在启动。它过滤掉了大量仅在单一维度上出现的随机波动,只捕捉那些在市场分形结构中产生共鸣的、最高质量的信号 。  

策略三:系统化背离交易

核心概念:背离是一个强大的概念,但其传统应用依赖于交易员的主观视觉识别,这使得它难以被精确回测和系统化。本策略的目标是将背离这一模式,转化为一个可量化、可评分的数学信号 。  

策略构建

第一步:定义回顾期(Lookback Period):设定一个用于寻找极值的窗口,例如50根K线。

第二步:识别价格极值:在回顾期内,找到最高价(Phigh​)和最低价(Plow​)及其出现的时间点。

第三步:识别指标极值:在同一回顾期内,找到MACD线的最高值(MACDhigh​)和最低值(MACDlow​)及其出现的时间点。

第四步:量化看跌背离

  • 触发条件:如果 (当前价格 > P_high) 并且 (当前MACD线 < MACD_high),则一个看跌背离信号被确认。
  • 信号强度打分:可以为这个背离信号的强度进行打分,以评估其可靠性。一个简单的评分公式可以是:

一个较高的正分值,代表价格创新高的幅度远大于MACD创新低的幅度(或者说MACD未能跟随的程度更严重),因此是一个更显著、更可靠的背离信号。

通过这个过程,我们将一个主观的图表模式,转化为了一个可以被计算机识别、回测和优化的连续变量(Divergence_Score)。这个变量可以被用作更庞大的量化模型中的一个输入因子,或者直接基于评分的高低来触发交易 。

Python代码

Python
import pandas as pd
import numpy as np
from scipy.signal import find_peaks
import matplotlib.pyplot as plt

# --- 核心函数:手动计算 MACD ---
def calculate_macd(df, fast_period=12, slow_period=26, signal_period=9):
    """
    使用 pandas 内置函数手动计算 MACD 指标。
    
    参数:
    df (pd.DataFrame): 包含 'close' 列的数据帧。
    fast_period (int): DIF 快线周期。
    slow_period (int): DIF 慢线周期。
    signal_period (int): DEA 信号线周期。

    返回:
    pd.DataFrame: 带有 DIF, DEA 和 Histogram 列的数据帧。
    """
    # 计算快慢指数移动平均线 (EMA)
    ema_fast = df['close'].ewm(span=fast_period, adjust=False).mean()
    ema_slow = df['close'].ewm(span=slow_period, adjust=False).mean()
    
    # 计算 DIF (快慢线差离值)
    df['DIF'] = ema_fast - ema_slow
    
    # 计算 DEA (DIF的指数移动平均)
    df['DEA'] = df['DIF'].ewm(span=signal_period, adjust=False).mean()
    
    # 计算 MACD 柱状图 (Histogram)
    df['Histogram'] = (df['DIF'] - df['DEA']) * 2
    
    return df


# --- 数据生成 ---
# 创建一个模拟数据集来演示策略,确保代码无需外部数据即可运行。
print("正在生成模拟股票数据...")
date_rng = pd.to_datetime(pd.date_range(start='2023-01-01', end='2024-01-01', freq='H'))
# 生成一个更有趣、波动更明显的价格路径
price_path = (np.sin(np.linspace(0, 40, len(date_rng))) * 15 + 
              np.cos(np.linspace(0, 10, len(date_rng))) * 8 + 
              np.random.randn(len(date_rng)) * 3 + 150)
data_h1 = pd.DataFrame(date_rng, columns=['time'])
data_h1['close'] = price_path
data_h1.set_index('time', inplace=True)
print("1小时 (H1) 周期数据已生成。")

# 通过重采样生成日线 (D1) 和4小时 (H4) 数据
data_d1 = data_h1['close'].resample('D').ohlc()
data_h4 = data_h1['close'].resample('4H').ohlc()
print("日线 (D1) 和 4小时 (H4) 周期数据已通过重采样生成。")
print("-" * 30)


# --- 策略一:柱状图的高阶导数策略 ---
# 我们通过观察柱状图数值的变化来近似其“导数”。
# 斜率的平缓(变化值趋向于零)可以作为一个早期预警信号。
def strategy_1_histogram_derivative(df):
    """
    计算MACD及其柱状图的'导数'(即连续柱子间的差值)。
    """
    # 调用我们自制的函数计算MACD
    df = calculate_macd(df)
    
    # 计算柱状图的变化值(近似导数)
    df['histogram_derivative'] = df['Histogram'].diff()
    
    # --- 信号逻辑 ---
    # 导数为正,意味着柱状图在增长(动能增强)。
    # 导数为负,意味着柱状图在缩短(动能减弱)。
    # 导数符号的变化,预示着柱状图达到峰值或谷值,是动量反转的早期信号。
    
    # 寻找柱状图顶峰的信号点(由增长转为缩短)
    df['peak_signal'] = (df['histogram_derivative'] > 0) & (df['histogram_derivative'].shift(-1) < 0)
    
    # 寻找柱状图谷底的信号点(由缩短转为增长)
    df['trough_signal'] = (df['histogram_derivative'] < 0) & (df['histogram_derivative'].shift(-1) > 0)

    return df

print("正在执行策略一:基于H1数据的柱状图导数策略...")
strategy_1_data = strategy_1_histogram_derivative(data_h1.copy())
print("策略一执行完毕。早期预警信号已生成在 'peak_signal' 和 'trough_signal' 列中。")
print(strategy_1_data[['close', 'Histogram', 'histogram_derivative', 'peak_signal', 'trough_signal']].tail(10))
print("-" * 30)


# --- 策略二:多时间框架共振策略 ---
# 只有在更高时间框架的趋势与当前信号方向一致时,才采纳低时间框架的信号。
def strategy_2_multi_timeframe(df_d1, df_h4, df_h1):
    """
    在 D1, H4, 和 H1 三个时间框架上寻找MACD共振信号。
    """
    # 为所有时间框架计算MACD
    df_d1 = calculate_macd(df_d1)
    df_h4 = calculate_macd(df_h4)
    df_h1 = calculate_macd(df_h1)

    # 重命名列以避免合并时发生冲突
    df_d1.rename(columns=lambda c: c + '_D1', inplace=True)
    df_h4.rename(columns=lambda c: c + '_H4', inplace=True)
    
    # 通过 merge_asof 将高时间框架的数据对齐到H1数据帧上
    merged_df = pd.merge_asof(df_h1.sort_index(), df_h4.sort_index(), left_index=True, right_index=True, direction='forward')
    merged_df = pd.merge_asof(merged_df.sort_index(), df_d1.sort_index(), left_index=True, right_index=True, direction='forward')

    # --- 信号逻辑 ---
    # 做多条件: H1周期出现金叉,并且H4和D1周期的DIF线都在零轴之上(代表大趋势看涨)。
    # 金叉定义: DIF线从下向上穿过DEA线。
    dif_h1 = merged_df['DIF']
    dea_h1 = merged_df['DEA']
    h1_golden_cross = (dif_h1.shift(1) < dea_h1.shift(1)) & (dif_h1 > dea_h1)

    # 高时间框架的趋势确认
    d1_bullish = merged_df['DIF_D1'] > 0
    h4_bullish = merged_df['DIF_H4'] > 0

    merged_df['buy_signal_resonance'] = h1_golden_cross & d1_bullish & h4_bullish

    return merged_df

print("正在执行策略二:多时间框架共振策略...")
strategy_2_data = strategy_2_multi_timeframe(data_d1.copy(), data_h4.copy(), data_h1.copy())
print("策略二执行完毕。共振买入信号已生成在 'buy_signal_resonance' 列中。")
print(strategy_2_data[strategy_2_data['buy_signal_resonance']][['close', 'DIF_D1', 'DIF_H4']].head())
print("-" * 30)


# --- 策略三:系统化背离交易策略 ---
# 通过程序化寻找价格和指标的峰谷,来识别背离。
def strategy_3_systematic_divergence(df):
    """
    系统化地识别看涨和看跌背离。
    """
    df = calculate_macd(df)
    
    # 使用scipy库的find_peaks函数来寻找价格的峰值和谷值。
    # `distance`参数至关重要,它定义了两个峰/谷之间的最小间隔,以避免找到过多微小的波动。
    peak_indices, _ = find_peaks(df['close'], distance=15)
    trough_indices, _ = find_peaks(-df['close'], distance=15)
    
    macd_hist = df['Histogram']
    
    df['bearish_divergence'] = False
    df['bullish_divergence'] = False
    
    # --- 看跌背离逻辑 ---
    # 寻找价格创出新高,但MACD柱状图却没有创出新高的情况。
    for i in range(len(peak_indices) - 1):
        idx1 = peak_indices[i]
        idx2 = peak_indices[i+1]
        
        price_high1 = df['close'].iloc[idx1]
        price_high2 = df['close'].iloc[idx2]
        macd_high1 = macd_hist.iloc[idx1]
        macd_high2 = macd_hist.iloc[idx2]
        
        if price_high2 > price_high1 and macd_high2 < macd_high1:
            df.loc[df.index[idx2], 'bearish_divergence'] = True

    # --- 看涨背离逻辑 ---
    # 寻找价格创出新低,但MACD柱状图却没有创出新低的情况。
    for i in range(len(trough_indices) - 1):
        idx1 = trough_indices[i]
        idx2 = trough_indices[i+1]

        price_low1 = df['close'].iloc[idx1]
        price_low2 = df['close'].iloc[idx2]
        macd_low1 = macd_hist.iloc[idx1]
        macd_low2 = macd_hist.iloc[idx2]

        if price_low2 < price_low1 and macd_low2 > macd_low1:
            df.loc[df.index[idx2], 'bullish_divergence'] = True
            
    return df

print("正在执行策略三:基于H1数据的系统化背离策略...")
strategy_3_data = strategy_3_systematic_divergence(data_h1.copy())

写在最后

我们从一个简单的交叉信号工具出发,通过物理学的透镜,将其重新构想为一个测量价格速度和加速度的数字信号处理系统;借助统计学的视角,我们分析了其作为均值回归时间序列的内在特性;最后,我们为它装上了一个能够适应不同市场状态的动态调整框架。

这一系列认知上的升级,开启了一个全新的分析维度。所提出的高级量化策略——从分析柱状图的高阶导数,到识别多时间框架的物理共振,再到将主观的背离模式数学化——将MACD从一个被动的滞后指标,转变为一个强大、具有前瞻性且适应性强的分析工具包。

对于量化交易者而言,真正的启示在于:MACD不应再被视为一组需要被动观察的线条。它是一个丰富的数据集,蕴含着市场的多阶动态信息。它可以被建模、被量化、被利用,最终成为在复杂市场中获取持续性统计优势的利器。是时候放下旧地图,用新的物理和数学语言,来重新探索这片早已被无数人踏足,却鲜有人真正理解的领域了。

【推荐阅读】RSI指标从入门到精通

【推荐阅读】KDJ指标深度解析