Python实现MACD指标计算:股票技术分析的利器系列(1)


介绍

先看看官方介绍:

MACD (平滑异同平均线)
指标说明
DIF线:收盘价短期、长期指数平滑移动平均线间的差;
DEA线:DIF线的M日指数平滑移动平均线;
MACD线:DIF线与DEA线的差,彩色柱状线;
参数:SHORT(短期)、LONG(长期)、M 天数,一般为12、26、9。
用法
1.DIF、DEA均为正,DIF向上突破DEA,买入信号;
2.DIF、DEA均为负,DIF向下跌破DEA,卖出信号;
3.DEA线与K线发生背离,行情反转信号;
4.分析MACD柱状线,由红变绿(正变负),卖出信号;由绿变红,买入信号。

算法解释:


DIF:EMA(CLOSE,SHORT)-EMA(CLOSE,LONG);
DEA:EMA(DIF,MID);
MACD:(DIF-DEA)*2,COLORSTICK;
缩写 全称 描述
EMA 指数移动平均线(Exponential Moving Average) 一种常见的移动平均线计算方法,用于平滑股票价格数据以观察价格的长期趋势。它计算最新价格的权重比较高,而旧价格的权重逐渐减小。
DIF 差离值(Difference) 也称为快线。通过计算两条指数移动平均线(一般是短期EMA和长期EMA)的差异得到。DIF用于观察价格的短期趋势。
DEA 差离平均值(Difference Exponential Average) 也称为慢线。是DIF的移动平均值,通常采用较长的周期。DEA用于观察价格的中期趋势。
MACD 移动平均线收敛与发散(Moving Average Convergence Divergence) 由DIF和DEA之间的差异计算得出,可以帮助确定价格的长期趋势。其计算公式为(DIF-DEA)*2。

这些数据都依赖于收盘价格。我们找一个股票进行参考:

在这里插入图片描述

当观察股票技术分析中的MACD指标时,关注DIF、DEA和MACD数值是至关重要的。截至2024年2月8日的数据显示,DIF指标为-2.558,DEA指标为-2.317,而MACD指标为-0.482。这些数值的变化反映了股票价格的趋势及其潜在的发展方向。在分析这些指标时,我们可以将它们与股票价格的走势相互比较,以辅助我们做出更加明智的投资决策。

DIF指标为-2.558
DEA指标为-2.317
MACD指标为-0.482

根据算法,要先计算EMA,那么将使用 ewm ,Pandas中的ewm函数是指数加权移动平均的缩写(Exponential Weighted Moving Average)。它是Pandas中用于计算指数加权移动平均的功能强大且灵活的方法之一。指数加权移动平均是一种常用的时间序列数据平滑技术,用于消除数据中的噪声并突出数据的趋势。

ewm函数可以应用于Pandas的Series和DataFrame对象,它返回一个指数加权移动平均值的对象。该函数接受几个参数,其中包括alpha参数,用于指定指数加权的衰减率,以及min_periods参数,用于指定计算指数加权移动平均所需的最小观察值数量。

核心代码:EMA

计算指数移动平均值(Exponential Moving Average)

参数:

  • data: pandas Series or DataFrame,输入的时间序列数据
  • window: int,移动窗口的大小,即计算指数移动平均值的观察窗口大小

返回值:

  • pandas Series or DataFrame,指数移动平均值

注意:

  • 该函数将输入的数据作为参数,使用指数加权移动平均(EWMA)方法计算指定窗口大小下的指数移动平均值。
def EMA(data, window):
    return data.ewm(span=window, min_periods=window, adjust=False).mean()

核心代码:MACD

计算MACD指标(Moving Average Convergence Divergence)

参数:

  • close: pandas Series,收盘价的时间序列数据
  • short: int,短期EMA的窗口大小,默认为12
  • long: int,长期EMA的窗口大小,默认为26
  • mid: int,DEA的窗口大小,默认为9

返回值:

  • dif: pandas Series,MACD指标中的DIF值
  • dea: pandas Series,MACD指标中的DEA值
  • macd: pandas Series,MACD指标的数值

注意:

  • 该函数使用指数移动平均(EMA)方法计算短期EMA和长期EMA,然后基于这两者计算DIF和DEA,最终得出MACD指标的数值。

def MACD(close, short=12, long=26, mid=9):
    dif = EMA(close, short) - EMA(close, long)
    dea = EMA(dif, mid)
    macd = (dif - dea) * 2
    return dif, dea, macd

200 次交易日的收盘价格


# 200 次交易日的收盘价格
close_prices = [14.06, 14.18, 12.76, 14.04, 15.44, 16.98, 17.0, 17.66, 19.43, 20.79, 22.87, 20.58, 20.79, 18.71, 19.62,
                20.96, 19.58, 20.38, 20.97, 22.02, 22.0, 19.98, 21.44, 23.58, 25.94, 28.53, 31.38, 34.52, 34.07, 32.6,
                35.86, 35.97, 39.57, 39.94, 38.0, 39.51, 37.63, 35.07, 35.09, 35.23, 34.44, 35.37, 37.05, 34.98, 37.96,
                36.59, 35.18, 35.08, 36.4, 36.35, 34.51, 36.89, 35.55, 35.3, 34.94, 31.45, 30.54, 29.65, 28.64, 27.96,
                29.12, 27.31, 27.89, 30.68, 33.75, 33.39, 31.56, 30.3, 33.33, 33.1, 36.41, 37.6, 38.6, 38.03, 37.53,
                35.31, 34.5, 33.95, 37.35, 41.09, 38.0, 37.92, 37.43, 41.17, 45.29, 42.3, 42.07, 37.86, 36.83, 39.04,
                39.96, 39.16, 38.35, 38.48, 39.93, 38.69, 36.55, 37.06, 36.89, 37.09, 34.61, 33.4, 36.74, 36.69, 36.99,
                36.72, 36.82, 38.17, 37.65, 38.75, 38.02, 36.73, 36.98, 36.97, 38.45, 37.54, 37.52, 38.02, 37.04, 33.39,
                35.5, 35.1, 33.46, 34.33, 34.19, 31.54, 31.03, 33.15, 33.3, 34.36, 33.9, 32.9, 34.01, 37.41, 37.53,
                38.1, 35.9, 36.12, 36.52, 36.08, 35.4, 35.74, 35.81, 35.37, 33.14, 33.22, 32.6, 32.45, 31.68, 33.76,
                33.41, 33.63, 33.29, 34.2, 32.35, 32.03, 32.19, 32.36, 33.3, 32.37, 31.92, 32.18, 31.8, 29.75, 27.98,
                28.23, 26.78, 27.06, 26.52, 27.52, 27.82, 27.8, 26.87, 25.84, 25.36, 24.69, 23.79, 24.36, 23.91, 24.72,
                23.62, 23.63, 22.9, 21.86, 23.15, 22.7, 21.68, 22.24, 21.81, 23.99, 22.62, 20.84, 20.16, 18.89, 19.07,
                18.26, 16.44, 16.76, 16.33, 17.06]

完整代码

import pandas as pd


def EMA(data, window):
    return data.ewm(span=window, min_periods=window, adjust=False).mean()


def MACD(close, short=12, long=26, mid=9):
    dif = EMA(close, short) - EMA(close, long)
    dea = EMA(dif, mid)
    macd = (dif - dea) * 2
    return dif, dea, macd


# 200 次交易日的收盘价格
close_prices = [14.06, 14.18, 12.76, 14.04, 15.44, 16.98, 17.0, 17.66, 19.43, 20.79, 22.87, 20.58, 20.79, 18.71, 19.62,
                20.96, 19.58, 20.38, 20.97, 22.02, 22.0, 19.98, 21.44, 23.58, 25.94, 28.53, 31.38, 34.52, 34.07, 32.6,
                35.86, 35.97, 39.57, 39.94, 38.0, 39.51, 37.63, 35.07, 35.09, 35.23, 34.44, 35.37, 37.05, 34.98, 37.96,
                36.59, 35.18, 35.08, 36.4, 36.35, 34.51, 36.89, 35.55, 35.3, 34.94, 31.45, 30.54, 29.65, 28.64, 27.96,
                29.12, 27.31, 27.89, 30.68, 33.75, 33.39, 31.56, 30.3, 33.33, 33.1, 36.41, 37.6, 38.6, 38.03, 37.53,
                35.31, 34.5, 33.95, 37.35, 41.09, 38.0, 37.92, 37.43, 41.17, 45.29, 42.3, 42.07, 37.86, 36.83, 39.04,
                39.96, 39.16, 38.35, 38.48, 39.93, 38.69, 36.55, 37.06, 36.89, 37.09, 34.61, 33.4, 36.74, 36.69, 36.99,
                36.72, 36.82, 38.17, 37.65, 38.75, 38.02, 36.73, 36.98, 36.97, 38.45, 37.54, 37.52, 38.02, 37.04, 33.39,
                35.5, 35.1, 33.46, 34.33, 34.19, 31.54, 31.03, 33.15, 33.3, 34.36, 33.9, 32.9, 34.01, 37.41, 37.53,
                38.1, 35.9, 36.12, 36.52, 36.08, 35.4, 35.74, 35.81, 35.37, 33.14, 33.22, 32.6, 32.45, 31.68, 33.76,
                33.41, 33.63, 33.29, 34.2, 32.35, 32.03, 32.19, 32.36, 33.3, 32.37, 31.92, 32.18, 31.8, 29.75, 27.98,
                28.23, 26.78, 27.06, 26.52, 27.52, 27.82, 27.8, 26.87, 25.84, 25.36, 24.69, 23.79, 24.36, 23.91, 24.72,
                23.62, 23.63, 22.9, 21.86, 23.15, 22.7, 21.68, 22.24, 21.81, 23.99, 22.62, 20.84, 20.16, 18.89, 19.07,
                18.26, 16.44, 16.76, 16.33, 17.06]

short_window = 12
long_window = 26
mid_window = 9

close_series = pd.Series(close_prices)

dif, dea, macd = MACD(close_series, short_window, long_window, mid_window)

print("DIF:", dif)
print("DEA:", dea)
print("MACD:", macd)
print("len:", len(close_prices), "次")

最终运行代码的效果展示

DIF

在这里插入图片描述

DEA

在这里插入图片描述

MACD

在这里插入图片描述

最近更新

  1. TCP协议是安全的吗?

    2024-02-14 10:46:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-14 10:46:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-14 10:46:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-14 10:46:02       20 阅读

热门阅读

  1. 第一章 文档数据库 (DocDB) 简介

    2024-02-14 10:46:02       30 阅读
  2. Ajax 入门

    2024-02-14 10:46:02       35 阅读
  3. 796. 子矩阵的和

    2024-02-14 10:46:02       35 阅读
  4. λ-矩阵的多项式展开

    2024-02-14 10:46:02       31 阅读
  5. 数据库第三章作业-SQL语言

    2024-02-14 10:46:02       31 阅读
  6. 局部加权回归

    2024-02-14 10:46:02       31 阅读
  7. Day32 贪心算法part02

    2024-02-14 10:46:02       33 阅读
  8. c++ STL系列——(五)map

    2024-02-14 10:46:02       21 阅读
  9. Docker之Oracle-XE版本安装

    2024-02-14 10:46:02       36 阅读