下面是一个使用Python实现股票MACD指标计算的完整示例代码。我们将使用pandas
和numpy
库来处理数据和计算:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import yfinance as yf # 用于获取股票数据,需要安装:pip install yfinance
def calculate_macd(data, fast_period=12, slow_period=26, signal_period=9):
"""
计算MACD指标
参数:
data: 包含收盘价的DataFrame,需要有'Close'列
fast_period: 快速EMA周期 (默认12)
slow_period: 慢速EMA周期 (默认26)
signal_period: 信号线周期 (默认9)
返回:
添加了MACD列的原始DataFrame
"""
# 计算快速EMA和慢速EMA
data['EMA_fast'] = data['Close'].ewm(span=fast_period, adjust=False).mean()
data['EMA_slow'] = data['Close'].ewm(span=slow_period, adjust=False).mean()
# 计算DIF线 (差离值)
data['DIF'] = data['EMA_fast'] - data['EMA_slow']
# 计算DEA线 (信号线)
data['DEA'] = data['DIF'].ewm(span=signal_period, adjust=False).mean()
# 计算MACD柱状图
data['MACD'] = (data['DIF'] - data['DEA']) * 2
return data
def plot_macd(data, title="MACD指标"):
"""
绘制价格走势和MACD指标图
"""
plt.figure(figsize=(14, 10))
# 价格走势图
plt.subplot(2, 1, 1)
plt.plot(data['Close'], label='收盘价', color='black')
plt.plot(data['EMA_fast'], label=f'EMA{fast_period}', alpha=0.7)
plt.plot(data['EMA_slow'], label=f'EMA{slow_period}', alpha=0.7)
plt.title(title)
plt.legend()
plt.grid(True)
# MACD指标图
plt.subplot(2, 1, 2)
plt.bar(data.index, data['MACD'], color=np.where(data['MACD'] > 0, 'red', 'green'), alpha=0.7)
plt.plot(data['DIF'], label='DIF', color='blue')
plt.plot(data['DEA'], label='DEA', color='orange')
plt.axhline(0, color='gray', linestyle='--', alpha=0.5)
plt.title('MACD指标')
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()
# 示例用法
if __name__ == "__main__":
# 获取股票数据 (这里使用腾讯控股0700.HK示例)
ticker = "0700.HK"
start_date = "2023-01-01"
end_date = "2024-01-01"
stock_data = yf.download(ticker, start=start_date, end=end_date)
# 设置MACD参数
fast_period = 12
slow_period = 26
signal_period = 9
# 计算MACD指标
macd_data = calculate_macd(stock_data, fast_period, slow_period, signal_period)
# 显示最后几行数据
print("MACD计算结果:")
print(macd_data[['Close', 'EMA_fast', 'EMA_slow', 'DIF', 'DEA', 'MACD']].tail())
# 绘制图表
plot_macd(macd_data, title=f"{ticker} 股票价格与MACD指标")
# 找出金叉和死叉点
macd_data['Signal'] = 0
macd_data['Signal'] = np.where((macd_data['DIF'] > macd_data['DEA']) &
(macd_data['DIF'].shift(1) <= macd_data['DEA'].shift(1)), 1, macd_data['Signal'])
macd_data['Signal'] = np.where((macd_data['DIF'] < macd_data['DEA']) &
(macd_data['DIF'].shift(1) >= macd_data['DEA'].shift(1)), -1, macd_data['Signal'])
# 打印交易信号
print("\n交易信号 (金叉/死叉):")
print(macd_data[macd_data['Signal'] != 0][['Close', 'DIF', 'DEA', 'Signal']])
代码说明:
-
核心函数
calculate_macd()
:- 使用指数移动平均(EMA)计算快速EMA和慢速EMA
- DIF = 快速EMA - 慢速EMA
- DEA = DIF的EMA(信号线)
- MACD柱 = (DIF - DEA) × 2
-
数据获取:
- 使用
yfinance
库获取股票历史数据(需要安装:pip install yfinance
) - 可以替换为其他数据源(如本地CSV文件)
- 使用
-
可视化功能:
- 绘制价格走势和EMA线
- 绘制MACD指标(DIF线、DEA线和柱状图)
- 零轴参考线
-
交易信号识别:
- 自动识别金叉(DIF上穿DEA)和死叉(DIF下穿DEA)
- 在结果中标记为1(买入)和-1(卖出)
使用说明:
-
安装依赖库:
pip install pandas numpy matplotlib yfinance
-
修改参数:
- 更改
ticker
变量获取不同股票 - 调整时间范围
start_date
和end_date
- 修改MACD参数(12, 26, 9)
- 更改
-
运行结果:
- 控制台输出最后几天的MACD计算结果
- 显示交易信号(金叉/死叉)
- 生成包含两个子图的图表:
- 上方:价格走势和EMA线
- 下方:MACD指标(DIF线、DEA线和柱状图)
输出示例:
MACD计算结果:
Close EMA_fast EMA_slow DIF DEA MACD
Date
2023-12-22 312.200012 317.383641 316.348228 1.035413 0.579998 0.910830
2023-12-27 315.000000 317.567184 316.703304 0.863880 0.624049 0.479662
2023-12-28 315.200012 317.649775 316.891895 0.757880 0.644271 0.227218
2023-12-29 313.000000 317.071647 316.703304 0.368343 0.598553 -0.460420
2024-01-01 313.000000 317.071647 316.703304 0.368343 0.581048 -0.425410
交易信号 (金叉/死叉):
Close DIF DEA Signal
Date
2023-02-01 378.000000 6.788103 5.397010 1
2023-02-20 365.000000 5.010690 5.083866 -1
2023-03-24 366.000000 3.951544 3.871139 1
...
注意事项:
- EMA计算使用
adjust=False
参数保持与传统交易软件一致 - MACD柱乘以2是常见做法(放大视觉效果),也可省略
- 金叉/死叉信号仅基于技术指标,实际交易需结合其他因素
- 对于不同的数据源,可能需要调整日期格式和列名
此代码提供了完整的MACD计算和可视化实现,可直接运行或集成到更大的量化交易系统中。