当前位置: 首页 > 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.lqws.cn/news/506737.html

相关文章:

  • TDengine 技术参数配置大全
  • Docker 报错“x509: certificate signed by unknown authority”的排查与解决实录
  • 什么是 OA 系统?OA 系统要具备什么样的功能?
  • jsoncpp-src-0.5.0编译
  • Python Bug 修复案例分析:编码问题导致程序出现bug 两种修复方法
  • Redis哈希表Rehash全解析:扩容缩容背后的渐进式智慧
  • SpringBoot 自动化部署实战:CI/CD 整合方案与避坑全指南
  • 相较于传统购物,AR 购物在便利性方面体现在哪些维度?​
  • IDC报告AR/VR市场反弹Meta份额超半,谷歌/微美全息精准卡位AR/AI眼镜市场机遇
  • 快速搭建系统原型,UI界面,有哪些高效的AI工具和方法
  • 数智助农 金融兴乡:中和农信双轮驱动农业现代化实践
  • 重医等利用纯生信在iMeta(中科院1区|IF33.2)发表:多组学联合分析西部五省母婴队列数据
  • 【C/C++】C++ 编程规范:101条规则准则与最佳实践
  • (LeetCode 面试经典 150 题 )121. 买卖股票的最佳时机 (遍历)
  • 【Unity】MiniGame编辑器小游戏(四)数独【Sudoku】
  • 战略调整频繁,如何快速重构项目组合
  • Kubernetes生命周期管理:深入理解 Pod 生命周期
  • 【数据结构】_二叉树的遍历与销毁
  • 交易期权先从买方开始
  • 【Linux网络与网络编程】15.DNS与ICMP协议
  • 打包上传到Linux部署并启动
  • 【JS-4.8-type属性】深入理解DOM操作中的type属性及其常见应用
  • Python 猜数字小游戏:Tkinter 实现的互动猜数挑战
  • 国际标准 ISO 8601 详解
  • SpringBoot + MyBatis 事务管理全解析:从 @Transactional 到 JDBC Connection 的旅程
  • NVIDIA GPU架构学习笔记
  • SpringBoot项目快速开发框架JeecgBoot——项目简介及系统架构!
  • WPF CommunityToolkit.Mvvm 信使 (ObservableRecipient)
  • EasyExcel单元格内换行,合并单元格
  • 记录一下小程序城市索引栏开发经历