使用Python实现股票MACD指标计算

下面是一个使用Python实现股票MACD指标计算的完整示例代码。我们将使用pandasnumpy库来处理数据和计算:

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']])

代码说明:

  1. 核心函数 calculate_macd()

    • 使用指数移动平均(EMA)计算快速EMA和慢速EMA
    • DIF = 快速EMA - 慢速EMA
    • DEA = DIF的EMA(信号线)
    • MACD柱 = (DIF - DEA) × 2
  2. 数据获取

    • 使用yfinance库获取股票历史数据(需要安装:pip install yfinance
    • 可以替换为其他数据源(如本地CSV文件)
  3. 可视化功能

    • 绘制价格走势和EMA线
    • 绘制MACD指标(DIF线、DEA线和柱状图)
    • 零轴参考线
  4. 交易信号识别

    • 自动识别金叉(DIF上穿DEA)和死叉(DIF下穿DEA)
    • 在结果中标记为1(买入)和-1(卖出)

使用说明:

  1. 安装依赖库:

    pip install pandas numpy matplotlib yfinance
    
  2. 修改参数:

    • 更改ticker变量获取不同股票
    • 调整时间范围start_dateend_date
    • 修改MACD参数(12, 26, 9)
  3. 运行结果:

    • 控制台输出最后几天的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
...

注意事项:

  1. EMA计算使用adjust=False参数保持与传统交易软件一致
  2. MACD柱乘以2是常见做法(放大视觉效果),也可省略
  3. 金叉/死叉信号仅基于技术指标,实际交易需结合其他因素
  4. 对于不同的数据源,可能需要调整日期格式和列名

此代码提供了完整的MACD计算和可视化实现,可直接运行或集成到更大的量化交易系统中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值