MACD(Moving Average Convergence Divergence,指数平滑移动平均线)是技术分析中常用的趋势跟踪动量指标,由Gerald Appel于1970年代提出。其核心由三部分组成:DIF线(12日EMA与26日EMA的差值)、DEA线(DIF线的9日EMA)、MACD柱(DIF与DEA差值的2倍)。
以下是MACD指标的Python实现源码:
方法一:使用pandas手动计算
import pandas as pd
import numpy as np
def calculate_macd(data, fast_period=12, slow_period=26, signal_period=9):
"""计算MACD指标"""
# 计算快慢EMA
data[‘EMA12‘] = data[‘close‘].ewm(span=fast_period, adjust=False).mean()
data[‘EMA26‘] = data[‘close‘].ewm(span=slow_period, adjust=False).mean()
# 计算DIF
data[‘DIF‘] = data[‘EMA12‘] - data[‘EMA26‘]
# 计算DEA(信号线)
data[‘DEA‘] = data[‘DIF‘].ewm(span=signal_period, adjust=False).mean()
# 计算MACD柱状图
data[‘MACD‘] = (data[‘DIF‘] - data[‘DEA‘]) * 2
return data[[‘DIF‘, ‘DEA‘, ‘MACD‘]]
方法二:使用TA-Lib库(更高效)
import talib
import pandas as pd
def calculate_macd_talib(close_prices, fast_period=12, slow_period=26, signal_period=9):
"""使用TA-Lib计算MACD指标"""
macd, macd_signal, macd_hist = talib.MACD(
close_prices,
fastperiod=fast_period,
slowperiod=slow_period,
signalperiod=signal_period
)
return macd, macd_signal, macd_hist
方法三:完整示例(含数据获取和
可视化)
import akshare as ak
import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime, timedelta
def get_stock_data(stock_code="
000001 ", days=180):
"""获取股票历史数据"""
end_date = datetime.now().strftime("%Y%m%d")
start_date = (datetime.now() - timedelta(days=days)).strftime("%Y%m%d")
df = ak.stock_zh_a_daily(
symbol=f"sz{stock_code}",
start_date=start_date,
end_date=end_date,
adjust="qfq"
)
return df[[‘date‘, ‘open‘, ‘high‘, ‘low‘, ‘close‘, ‘volume‘]]
# 获取数据并计算MACD
df = get_stock_data("000001", 180)
macd_result = calculate_macd(df)
# 可视化
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 8))
# 价格图表
ax1.plot(df[‘date‘], df[‘close‘], label=‘收盘价‘, color=‘blue‘)
ax1.set_title(‘股票价格走势‘)
ax1.set_ylabel(‘价格‘)
ax1.legend()
ax1.grid(True)
# MACD图表
ax2.plot(df[‘date‘], macd_result[‘DIF‘], label=‘DIF线‘, color=‘red‘)
ax2.plot(df[‘date‘], macd_result[‘DEA‘], label=‘DEA线‘, color=‘green‘)
ax2.bar(df[‘date‘], macd_result[‘MACD‘], label=‘MACD柱‘, color=‘gray‘, alpha=0.5)
ax2.axhline(y=0, color=‘black‘, linestyle=‘-‘, linewidth=0.5)
ax2.set_title(‘MACD指标‘)
ax2.set_ylabel(‘MACD值‘)
ax2.legend()
ax2.grid(True)
plt.tight_layout()
plt.show()
MACD计算公式详解
1. EMA计算:
◦ EMA12 = 前一日EMA12 × 11/13 + 今日收盘价 × 2/13
◦ EMA26 = 前一日EMA26 × 25/27 + 今日收盘价 × 2/27
2. DIF(差离值):
◦ DIF = EMA12 - EMA26
3. DEA(信号线):
◦ DEA = 前一日DEA × 8/10 + 今日DIF × 2/10
4. MACD柱状图:
◦ MACD = (DIF - DEA) × 2
使用说明
• 默认参数:通常使用12、26、9作为快线、慢线和信号线周期
• 交易信号:
◦ 金叉:DIF由下向上突破DEA,买入信号
◦ 死叉:DIF由上向下跌破DEA,卖出信号
◦ 背离:价格与MACD走势不一致,预示趋势反转
安装依赖
pip install pandas numpy matplotlib
pip install TA-Lib # 需要单独安装,Windows用户可下载预编译版本
pip install akshare # 用于获取股票数据