当前位置: 首页 > news >正文

matplotilb实现对MACD的实战

1. 代码结构

python

复制

下载

import pandas as pd  # 数据处理
import matplotlib.pyplot as plt  # 数据可视化
from unittest import TestCase  # 单元测试框架
  • pandas:用于读取CSV数据并计算指数移动平均(EMA)。

  • matplotlib:用于绘制MACD线(DIF、DEA)和柱状图(BAR)。

  • unittest:用于组织测试用例(这里仅作代码结构管理,实际可直接运行

2. 方法解析

(1) cal_macd():计算MACD指标

python

复制

下载

def cal_macd(self, df, fastperiod=12, slowperiod=26, signalperiod=9):ewma12 = df['close'].ewm(span=fastperiod, adjust=False).mean()  # 12日EMAewma26 = df['close'].ewm(span=slowperiod, adjust=False).mean()  # 26日EMAdf['dif'] = ewma12 - ewma26  # DIF = EMA12 - EMA26df['dea'] = df['dif'].ewm(span=signalperiod, adjust=False).mean()  # DEA = DIF的9日EMAdf['bar'] = (df['dif'] - df['dea']) * 2  # BAR = (DIF - DEA) * 2(柱状图高度)return df

参数说明

  • fastperiod=12:快速EMA周期(默认12日)。

  • slowperiod=26:慢速EMA周期(默认26日)。

  • signalperiod=9:信号线(DEA)周期(默认9日)。

计算逻辑

  1. DIF(差离值) = 12日EMA - 26日EMA
    (反映短期与长期均线的差异)

  2. DEA(信号线) = DIF的9日EMA
    (DIF的平滑曲线,用于生成交易信号)

  3. BAR(柱状图) = (DIF - DEA) × 2
    (红绿柱状图,直观显示多空能量)

ema是什么

EMA(Exponential Moving Average) 是指指数移动平均线,是一种常见的技术分析工具,主要用于平滑价格数据并识别市场趋势。与简单移动平均线(SMA)不同,EMA更注重近期价格,因此对市场变化反应更灵敏。

EMA 的核心特点

  1. 加权计算

    • EMA 给予近期价格更高的权重,而较早的价格权重逐渐衰减。

    • 计算公式:

      EMAtoday=(Pricetoday×α)+(EMAyesterday×(1−α))EMAtoday​=(Pricetoday​×α)+(EMAyesterday​×(1−α))

      其中,α=2N+1α=N+12​(NN 是周期,如 12 日、26 日等)。

  2. 反应迅速

    • 相比 SMA(简单移动平均),EMA 能更快反映价格变化,适合短线交易。

  3. 常见应用

    • 趋势判断:EMA 上升代表上涨趋势,下降代表下跌趋势。

    • 交叉策略:如 12 日 EMA 上穿 26 日 EMA(“金叉”)视为买入信号,反之(“死叉”)为卖出信号。

    • 支撑/阻力:价格回调至 EMA 均线可能获得支撑或遇到阻力。

EMA vs. SMA(简单移动平均)

特性EMASMA
权重近期价格权重更高所有价格权重相同
灵敏度高,适合短线低,适合中长线
滞后性较小较大

常见 EMA 周期

  • 短期:5 日、10 日(适合短线交易)

  • 中期:20 日、50 日(判断趋势)

  • 长期:100 日、200 日(牛熊分界线)

EMA 的局限性

  • 在震荡市中可能产生虚假信号(频繁交叉)。

  • 仍需结合其他指标(如 MACD、RSI)综合判断。

如果你有具体的交易场景或参数问题,可以进一步探讨

MA(Exponential Moving Average,指数移动平均)是一种常用的技术分析指标,与简单移动平均(SMA)不同,EMA 对近期价格赋予更高的权重,因此能更快反映价格变化趋势。


1. EMA 计算公式

EMA 的计算分为两步:

  1. 初始 EMA(首日):

    EMA1=Close1EMA1​=Close1​
  2. 后续 EMA(第 tt 日):

    EMAt=α×Closet+(1−α)×EMAt−1EMAt​=α×Closet​+(1−α)×EMAt−1​
    • αα 是平滑系数(权重),计算公式:

      α=2N+1α=N+12​
    • NN 是 EMA 的周期(如 12、26)。

(2) test_MACD():绘制MACD图表

python

复制

下载

def test_MACD(self):# 1. 读取数据并预处理file_name = "./demo.csv"df = pd.read_csv(file_name)df.columns = ["stock_id", "date", "close", "open", "high", "low", "volume"]df = df[["date", "close", "open", "high", "low", "volume"]]  # 选择需要的列df["date"] = pd.to_datetime(df["date"])  # 转为日期格式# 2. 计算MACD指标df_macd = self.cal_macd(df)print(df_macd)  # 打印数据(可选)# 3. 绘制DIF和DEA线plt.figure()df_macd['dea'].plot(color="red", label='dea')  # DEA线(红色)df_macd['dif'].plot(color="blue", label='dif')  # DIF线(蓝色)plt.legend(loc='best')  # 显示图例# 4. 分离正负BAR(用于红绿柱状图)pos_bar = []  # 正值BAR(红色)pos_index = []  # 对应索引neg_bar = []  # 负值BAR(绿色)neg_index = []  # 对应索引for index, row in df_macd.iterrows():if row['bar'] > 0:pos_bar.append(row['bar'])pos_index.append(index)else:neg_bar.append(row['bar'])neg_index.append(index)# 5. 绘制柱状图plt.bar(pos_index, pos_bar, width=0.5, color='red')  # 正BAR(红色)plt.bar(neg_index, neg_bar, width=0.5, color='green')  # 负BAR(绿色)# 6. 设置X轴标签(日期)major_index = df_macd.index[df_macd.index]major_xtics = df_macd['date'][df_macd.index]plt.xticks(major_index, major_xtics)  # 设置刻度plt.setp(plt.gca().get_xticklabels(), rotation=30)  # 旋转30度# 7. 添加网格和标题plt.grid(linestyle='-.')  # 虚线网格plt.title('000001平安银行MACD图')  # 标题plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置中文字体(黑体)plt.show()

3. 关键步骤说明

(1) 数据预处理

  • 读取 demo.csv,提取 date(日期)、close(收盘价)等列。

  • 将 date 列转为 datetime 格式,便于后续绘图。

MACD对股价进行一个买入卖出的

2) MACD计算

  • 调用 cal_macd() 计算 DIFDEABAR

  • 示例输出:

    text

    复制

    下载

           date   close       dif       dea       bar
    0 2023-01-01  50.00  0.000000  0.000000  0.000000
    1 2023-01-02  51.00  0.123456  0.012345  0.222222
    ...(略)

(3) 图表绘制

  1. DIF(蓝色)和 DEA(红色)线

    • 反映短期和长期趋势的差异与平滑。

  2. BAR柱状图

    • 红色:DIF > DEA(多头信号)。

    • 绿色:DIF < DEA(空头信号)。

  3. X轴日期标签

    • 旋转30度避免重叠。

http://www.lryc.cn/news/574790.html

相关文章:

  • SQL关键字三分钟入门:UPDATE —— 修改数据
  • Camera Sensor接口协议全解析(五)SLVS-EC接口深度解析
  • Stable Diffusion 项目实战落地:打造完美海报的秘密武器 第二篇:边缘柔化、蒙版处理与图生图技术大揭秘!
  • 如何通过nvm切换本地node环境详情教程(已装过node.js更改成nvm)
  • 2025.6.24总结
  • useState为异步,测试一下编码时候是否考虑?
  • Unity反射机制
  • mongoose解析http字段值
  • Spring Boot 的Banner的介绍和设置
  • 中科米堆3D扫描逆向建模方案:汽车轮毂三维扫描抄数建模
  • elk+filebeat收集springboot项目日志
  • iwebsec靶场-文件上传漏洞
  • 串口助手实例
  • lib61850 代码结构与系统架构深度分析
  • 鸿蒙OH南向开发 轻量系统内核(LiteOS-M)【异常调测】
  • 针对基于深度学习的侧信道分析(DLSCA)进行超参数的贝叶斯优化
  • vue 3 计算器
  • Nginx性能优化配置指南
  • 6.24_JAVA_微服务_Elasticsearch搜索
  • vscode + Jlink 一键调试stm32 单片机程序(windows系统版)
  • Git简介和常用命令
  • Windows安装Emscripten‌/emsdk(成功)
  • Python 数据分析与可视化 Day 6 - 可视化整合报告实战
  • Javaweb - 5 事件的绑定
  • 技术伦理之争:OpenAI陷抄袭风波,法院强制下架宣传视频
  • 自然语言处理入门
  • day041-web集群架构搭建
  • 软件设计模式选择、判断解析-1
  • 快速sincos算法,stm32测试
  • 用Rust写平衡三进制加法器