avatar  索菲恩·卡巴尔(Sofien Kaabar),特许金融分析师

MACD — 完整指南。

这个著名指标的分步指南。

最著名的指标之一是移动平均收敛散度 — MACD。它是一种备受关注的振荡器,可用于趋势跟踪系统或逆向策略。

在我的上一本书《交易策略之书》取得成功之后,我刚刚出版了一本新书。它具有高级趋势跟踪指标和策略,并具有专门用于持续更新代码的 GitHub 页面。此外,本书在针对印刷成本进行了优化后,还采用了原始颜色。如果您对此感兴趣,请随时访问下面的亚马逊链接,或者如果您更喜欢购买PDF版本,可以在LinkedIn上与我联系。

从头开始创建 MACD

MACD 可能是仅次于 RSI 的第二大已知振荡器。交易者大力追随。它代表移动平均收敛散度,主要用于背离和翻转。

许多人也认为它是一个趋势跟踪指标,但其他人则使用图形分析来寻找反转点,使 MACD 成为一个多功能指标。

USDCHF 在第一个面板中,MACD 在第二个面板中。

在我们开始构建这个振荡器之前,我们必须了解什么是移动平均线以及如何对它们进行编码。移动平均线帮助我们确认并驾驭趋势。

它们是最著名的技术指标,这是因为它们的简单性和为分析增加价值的良好记录。我们可以使用它们来寻找支撑位和阻力位、止损位和目标,并了解潜在趋势。

这种多功能性使它们成为我们交易武器库中不可或缺的工具。

顾名思义,这是你简单明了的意思,在统计学中无处不在,基本上在我们生活中的任何其他部分都使用。它只是观测值的总值除以观测值的数量。从数学上讲,它可以写成:

移动平均线的代码可以写成如下:

# The <span><span>function</span></span> to add a <span>number</span> of columns inside an array
def adder(<span>Data</span>, times):
    
    for i <span>in</span> <span>range</span>(<span>1</span>, times + <span>1</span>):
    
        new_col = np.zeros((len(<span>Data</span>), <span>1</span>), dtype = <span>float</span>)
        <span>Data</span> = np.append(<span>Data</span>, new_col, axis = <span>1</span>)
        
    <span>return</span> <span>Data</span>
# The <span><span>function</span></span> to delete a <span>number</span> of columns starting from an <span>index</span>
def deleter(<span>Data</span>, <span>index</span>, times):
    
    for i <span>in</span> <span>range</span>(<span>1</span>, times + <span>1</span>):
    
        <span>Data</span> = np.delete(<span>Data</span>, <span>index</span>, axis = <span>1</span>)
        
    <span>return</span> <span>Data</span>
    
# The <span><span>function</span></span> to delete a <span>number</span> of rows from the beginning
def jump(<span>Data</span>, jump):
    
    <span>Data</span> = <span>Data</span>[jump:, ]
    
    <span>return</span> <span>Data</span>
<span>my_ohlc_array</span> = adder(my_ohlc_array, <span>3</span>)
<span>my_ohlc_array</span> = deleter(my_ohlc_array, <span>3</span>, <span>2</span>)
<span>my_ohlc_array</span> = jump(my_ohlc_array, <span>20</span>)
# Remember, OHLC <span>is</span> an abbreviation <span>of</span> <span>Open</span>, High, Low, <span>and</span> <span>Close</span> <span>and</span> it refers <span>to</span> the standard historical data file

下面指出,在回溯周期为 200 的名为 my_data 的数组上,将在索引为 3(OHLC 数组中的收盘价)的列上调用移动平均函数。

然后,移动平均值将放在索引为 4 的列中,这是我们使用加法器函数添加的列。

<span>my_data</span> = ma(my_data, <span>200</span>, <span>3</span>, <span>4</span>)

指数移动平均线是一种特殊类型,它赋予近期值更多的权重。为了避免无聊的细节,这里是代码。

def ema(<span>data</span>, alpha, lookback, what, <span>where</span>):
    
    alpha = alpha / (lookback + <span>1.0</span>)
    
    beta  = <span>1</span> - alpha
    
    <span>data</span> = ma(<span>data</span>, lookback, what, <span>where</span>)    
    <span>data</span>[lookback + <span>1</span>, <span>where</span>] = (<span>data</span>[lookback + <span>1</span>, what] * alpha) + (<span>data</span>[lookback, <span>where</span>] * beta)    
    for i <span>in</span> <span>range</span>(lookback + <span>2</span>, len(<span>data</span>)):
        
            try:
                
                <span>data</span>[i, <span>where</span>] = (<span>data</span>[i, what] * alpha) + (<span>data</span>[i - <span>1</span>, <span>where</span>] * beta)
        
            except IndexError:
                
                <span>pass</span>
            
    <span>return</span> <span>data</span>

MACD是如何计算的?它是应用于收盘价的 26 周期指数移动平均线与应用于收盘价的 12 周期指数移动平均线之间的差值。取差值后找到的值称为 MACD 线。

该计算的 9 周期指数移动平均线称为 MACD 信号。

EURUSD 在第一个面板中,MACD 在第二个面板中。

def macd(<span>Data</span>, what, long_ema, short_ema, signal_ema, <span>where</span>):
    
    <span>Data</span> = adder(<span>Data</span>, <span>1</span>)
    
    <span>Data</span> = ema(<span>Data</span>, <span>2</span>, long_ema,  what, <span>where</span>)
    <span>Data</span> = ema(<span>Data</span>, <span>2</span>, short_ema, what, <span>where</span> + <span>1</span>)
    
    <span>Data</span>[:, <span>where</span> + <span>2</span>] = <span>Data</span>[:, <span>where</span> + <span>1</span>] - <span>Data</span>[:, <span>where</span>]
    <span>Data</span> = jump(<span>Data</span>, long_ema)
    <span>Data</span> = ema(<span>Data</span>, <span>2</span>, signal_ema, <span>where</span> + <span>2</span>, <span>where</span> + <span>3</span>)
    
    <span>Data</span> = deleter(<span>Data</span>, <span>where</span>, <span>2</span>)   
    <span>Data</span> = jump(<span>Data</span>, signal_ema)
    
    <span>return</span> <span>Data</span>

如果您想查看更多文章,请考虑通过以下链接订阅我的每日时事通讯(提供免费计划)。它以我的 Medium 文章、更多交易策略、与研究和分析相关的编码课程为特色,此外,订阅者还可以获得我第一本书的免费 PDF 副本。付费订阅每周可以期待 5-7 篇文章,免费计划每周可以期待 1-2 篇文章。这将有助于我继续分享我的研究。谢谢!

策略#1:翻转

翻转策略是 MACD 上使用的最著名的策略。它具有以下条件:

  • 每当 MACD 线超过 0 时,就会生成多头(买入)信号。
  • 每当 MACD 线突破 0 时,就会生成空头 (卖出) 信号。

这相当于 MACD 上的颜色变化,因为高于零的值显示为绿色,低于零的值显示为红色。

GBPUSD 在第一个面板中,MACD 翻转策略显示在箭头中。

上图显示了每当 MACD 切换标志时的信号。

  • 主要优势:倾向于捕捉强劲的趋势,并且通常具有罕见的鞭锯(线路开关符号太频繁)。
  • 主要弱点:由于它由移动平均线组成,因此存在滞后性,在区间市场中毫无用处。
<span>def</span> signal(<span>Data</span>, macd_column, buy_column, sell_column):
    
    for i in range(len(<span>Data</span>)):
            
        <span>if</span> <span>Data</span>[i, macd_column] &gt; <span>0</span> <span>and</span> <span>Data</span>[i - <span>1</span>, macd_column] &lt; <span>0</span>:
            <span>Data</span>[i, buy_column] = <span>1</span>
            
        <span>if</span> <span>Data</span>[i, macd_column] &lt; <span>0</span> <span>and</span> <span>Data</span>[i - <span>1</span>, macd_column] &gt; <span>0</span>:
            <span>Data</span>[i, sell_column] = -<span>1</span>

如果你也对更多的技术指标和策略感兴趣,那么我的书可能会让你感兴趣:

策略#2:十字架

交叉策略是 MACD 线和 MACD 信号之间的交点:

  • 每当 MACD 线超过信号线时,就会生成多头(买入)信号。
  • 每当 MACD 线突破信号线时,就会生成空头(卖出)信号。

这相当于一个简单的移动平均线交叉策略。

GBPUSD 在第一个面板中,MACD 交叉策略显示在箭头中。

上图显示了每当 MACD 随信号线改变位置时的信号。

  • 主要优势:可以通过平滑分频器来帮助避免错误信号。
  • 主要弱点:由于额外的平滑处理,趋势会出现很大的滞后。
def signal(Data, macd_line, macd_signal, buy, sell):
    
    for i in range(len(Data)):
            
        if Data &gt; Data and Data &lt; Data:
            Data = 1
            
        if Data &lt; Data and Data &gt; Data:
            Data = -1

 策略#4:背离

背离策略是减弱动量的一种形式:

  • 每当 MACD 线创出更高的低点而市场价格创下较低的低点时,就会产生多头(买入)信号。
  • 每当 MACD 线创下较低的高点而市场价格创出更高的高点时,就会产生空头(卖出)信号。

这相当于 RSI 上的背离策略。

GBPUSD 在第一个面板中,MACD 背离策略以线条显示。

  • 主要优势:趋势反转的早期信号。
  • 主要弱点:MACD 很少发生,有时过于复杂而无法进行背离。

 结论

记住要始终进行回溯测试。你应该永远相信别人是错的。我的指标和交易风格可能适合我,但可能不适合你。

我坚信不要用勺子喂食。我是边做边学,而不是抄袭。

你应该了解这个策略的想法、功能、直觉和条件,然后自己制定一个(甚至更好的)策略,这样你就可以在决定让它上线或消除它之前进行回溯测试和改进。

我选择不提供具体的回溯测试结果,这应该会让读者更多地探索自己的策略并更多地研究它。

Medium 是许多有趣读物的中心。在我决定开始写作之前,我读了很多文章。考虑使用我的推荐链接加入 Medium!

To sum up, are the strategies I provide realistic? Yes, but only by optimizing the environment (robust algorithm, low costs, honest broker, proper risk management, and order management). Are the strategies provided only for the sole use of trading? No_, it is to stimulate brainstorming and getting more trading ideas as we are **总而言之,我提供的策略是否切合实际?是的,但只有通过优化环境(强大的算法、低成本、诚实的经纪人、适当的风险管理和订单管理)。提供的策略是否仅供交易使用?不,这是为了激发头脑风暴并获得更多交易想法,因为我们都厌倦了听到超卖 RSI 作为做空的理由或超过阻力位作为做多的理由。

我正在尝试引入一个名为“客观技术分析”的新领域,在这个领域中,我们使用硬数据来判断我们的技术,而不是依赖过时的经典方法。**_

数据科学机器学习投资金融加密货币