目录
MACD指标
简介
MACD又称为异同移动平均线,用来度量不同频率移动平均线的变化情况。MACD指标主要包括3根线,分别为DIF、DEA和MACD。
计算方法
12 日 E M A : E M A ( 12 ) = 2 12 + 1 ∗ 今 日 收 盘 价 ( 12 ) + 11 12 + 1 ∗ 昨 日 E M A ( 12 ) 12日EMA:EMA(12) = \frac{2}{12+1} * 今日收盘价(12) + \frac{11}{12+1} * 昨日EMA(12) 12日EMA:EMA(12)=12+12∗今日收盘价(12)+12+111∗昨日EMA(12)
26 日 E M A : E M A ( 26 ) = 2 26 + 1 ∗ 今 日 收 盘 价 ( 26 ) + 25 26 + 1 ∗ 昨 日 E M A ( 26 ) 26日EMA:EMA(26) = \frac{2}{26+1} * 今日收盘价(26) + \frac{25}{26+1} * 昨日EMA(26) 26日EMA:EMA(26)=26+12∗今日收盘价(26)+26+125∗昨日EMA(26)
D I F F : D I F F = E M A ( 12 ) − E M A ( 26 ) DIFF:DIFF=EMA(12) - EMA(26) DIFF:DIFF=EMA(12)−EMA(26)
D E A : D E A = 2 9 + 1 ∗ 今 日 D I F F + 8 9 + 1 ∗ 昨 日 D E A DEA: DEA = \frac{2}{9+1} * 今日DIFF + \frac{8}{9+1} * 昨日DEA DEA:DEA=9+12∗今日DIFF+9+18∗昨日DEA
M A C D : M A C D = 2 ∗ ( D I F F − D E A ) MACD:MACD = 2 * (DIFF-DEA ) MACD:MACD=2∗(DIFF−DEA)
指标含义
DIFF表示长周期均线和短周期均线的差值,DIFF > 0则表示短周期均线处于长周期均线上方,DIFF < 0则表示短周期均线处于长周期均线下方。DEA是DIFF的简单移动平均线,MACD是移动平均线和移动平均线的移动平均线的差值。
在应用过程中,常用其中的MACD指标或其中多个组合进行判断。
同时使用DIFF和DEA进行判断
当DIFF>0时,说明短周期均线处于长周期均线上方,近期价格呈现上涨趋势;当DEA>0时,说明短周期均线在近几期一直处于长周期均线的上方。如果DIFF上穿DEA,表示DIFF近期也处于上涨趋势,这两者叠加,说明该标的近期价格已经处于一个很高的价位。
若单独使用MACD指标
和同时使用DIFF和DEA相差不大,MACD是将DIFF和DEA差值以数值的形式表现出来。MACD有绿柱和红柱,柱体越长,说明近期价格上涨或下跌的程度越强,可以视作上涨或下跌力量的强弱。
python代码实现
在python中可以利用第三方库talib计算MACD指标,但发现怎么都无法和通达信等行情软件对上,所以自己按照原理写了一个。
由于原始数据难以获得,所以以下代码基于掘金量化平台的sdk查询标的原始数据。如果本地有数据或有其他的数据来源,只需要将data数据集变成输入参数,将函数中获取data的部分删除即可。
这里用到pandas库里面特别好用的两个函数:rolling/expanding和ewm,前者是滚动窗口,后者是求加权平均。rolling(N)可以实现每N个求一次平均,expanding(N)可以实现从N个窗口开始,求逐渐扩大窗口的平均。
# coding=utf-8
from __future__ import print_function, absolute_import
from gm.api import *
import pandas as pd
import numpy as np
def MACD(symbol, start_time, end_time):
'''计算MACD指标
输入参数:symbol <- str 标的代码 (2005年以前上市的不可用)
start_time <- str 起始时间
end_time <- str 结束时间
输出数据:
macd <- dataframe macd指标,包括DIFF、DEA、MACD
'''
# 取历史数据,取到上市首日
data = history(symbol=symbol, frequency='1d', start_time='2005-01-01', end_time=end_time, fields='symbol,bob,close',
df=True)
# 将数据转化为dataframe格式
data['bob'] = data['bob'].apply(lambda x: x.strftime('%Y-%m-%d')).tolist()
# 计算EMA(12)和EMA(16)
data['EMA12'] = data['close'].ewm(alpha=2 / 13, adjust=False).mean()
data['EMA26']