Python实现MACD指标计算:股票技术分析的利器系列(1)
- 介绍
- 核心代码:EMA
- 核心代码:MACD
- 200 次交易日的收盘价格
- 完整代码
- 最终运行代码的效果展示
- DIF
- DEA
- MACD
介绍
先看看官方介绍:
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的窗口大小,默认为12long
: int,长期EMA的窗口大小,默认为26mid
: 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), "次")