基于MACD指标的股票涨跌及买卖策略分析

目录

一、数据来源及描述

二、数据处理及指标计算

三、策略分析

3.1 MACD指标的买卖原则和基本用法

3.2 实际应用

四、参考资料


一、数据来源及描述

        本次的数据来源是TuShare提供的股票数据,Tushare是一个免费、开源的 python 财经数据接口包。本文选用A股赛力斯汽车[601127]作为研究对象选取其近100个交易日(2023年7月28日- 2023年12月22日)的数据进行分析和后续的指标计算及策略制定。K线图如下图1所示:

图1  K线图

 备注:

赛力斯汽车成立于2016年1月,是赛力斯集团旗下的新能源汽车品牌 ,专注于新能源电动汽车领域的研发、制造和生产,旗下主要产品包括AITO问界M5、AITO问界M5纯电、AITO问界M7、赛力斯华为智选SF5等车型,赛力斯致力于为全球用户提供高性能的智能电动汽车产品以及愉悦的智能驾驶体验。2023年12月20日,赛力斯荣获“2023国潮创新榜样先锋品牌”。

import pandas as pd
import plotly.subplots as sp
import plotly.graph_objects as go
import matplotlib.pyplot as plt
import tushare as ts
# 获取数据
df = ts.get_hist_data('601127',start='2022-01-01',end='2023-12-23')
df = df.reset_index().sort_values(by = "date").reset_index(drop = True).iloc[:,:6]
df['date'] = pd.to_datetime(df['date'], format='%Y/%m/%d')
df.set_index(['date'], inplace=True)
# 绘制数据的规模scale
scale = 100
df = df[-scale:]

         最终数据格式为dataframe格式,以时间(日期)作为索引列,有以下5个字段:开盘价(open)、最高价(high)、收盘价(close)、最低价(low)以及交易量(volume), 以12月22日为例,赛力斯汽车股票开盘价为83.60,最高价为86.22,收盘价为84.06,最低价为82.66,成交量为50.35万手。经核验,数据不存在缺失值和异常值,真实可信,可以使用。

二、数据处理及指标计算

MACD指标是根据均线的构造原理,对股票价格的收盘价进行平滑处理,求出算术平均值以后再进行计算,是一种趋向类指标。该指标的本质是对股价不同周期的移动平均线的乖离率进行进行计算,通过对趋势的走向及背离的强弱,判断未来股价走势变动的可能性。

以下简述MACD指标的计算过程:

MACD在应用上应先行计算出快速 (一般选12日) 移动平均数值与慢 (一般选26日)移动平均数值.以这两个数值作为测量两者 (快速与慢速线) 间的"差离值"依据所谓"差离值”(DIF) ,即12日EMA数值减去26日EMA数值因此,在持续的涨势中,12日EMA在26日EMA之上.其间的正差离值 (+DIF) 会愈来愈大。反之在跌势中,差离值可能变负 (-DIF) ,也愈来愈大。至于行情开始回转,正或负差离值要缩小到怎样的程度,才真正是行情反转的信号

MACD的反转信号界定为"差离值”的9日移动平均值 (9日EMA)。

在MACD的指数平滑移动平均线计算公式中,都分别加重最近一日的份量权值,以现在流行的参数12和26为例,其公式如下:

12日EMA的计算: EMA12 = 前一日EMA12 X 11/13 + 今日收盘 X 2/1326日EMA的计算: EMA26 = 前一日EMA26 X 25/27 + 今日收盘 X 2/27差离值 (DIF) 的计算: DIF = EMA12 - EMA26然后再根据差离值计算其9日的EMA,即"差离平均值”,"差离平均值"用DEA来表示

DEA = (前一日DEA X 8/10 + 今日DIF X 2/10)计算出的DIF与DEA为正或负值,因而形成在0轴上下移动的两条快速与慢速线为了方便判断,用DIF减去DEA,用以绘制柱状图。

使用python计算的代码如下:

# 指标计算部分
# EMA(Exponential Moving Average), 指数移动平均线
num_periods_fast = 12  # 快速EMA的时间周期, 12
# K:平滑常数,常取2/(n+1)
K_fast = 2 / (num_periods_fast + 1)  # 快速EMA平滑常数
ema_fast = 0
num_periods_slow = 26  # 慢速EMA的时间周期,26
K_slow = 2 / (num_periods_slow + 1)  # 慢速EMA平滑常数
ema_slow = 0
num_periods_macd = 9  # MACD EMA的时间周期,9
K_macd = 2 / (num_periods_macd + 1)  # MACD EMA平滑常数
ema_macd = 0

ema_fast_values = []  
ema_slow_values = []  
macd_values = []  
macd_signal_values = []  
# MACD - MACD-EMA
MACD_hist_values = []  
for close_price in df['close']:
    if ema_fast == 0:  # 第一个值
        ema_fast = close_price
        ema_slow = close_price
    else:
        ema_fast = (close_price - ema_fast) * K_fast + ema_fast
        ema_slow = (close_price - ema_slow) * K_slow + ema_slow

    ema_fast_values.append(ema_fast)
    ema_slow_values.append(ema_slow)

    # MACD is fast_MA - slow_EMA
    macd = ema_fast - ema_slow  
    if ema_macd == 0:
        ema_macd = macd
    else:
        # signal is EMA of MACD values
        ema_macd = (macd - ema_macd) * K_macd + ema_macd  
    macd_values.append(macd)
    macd_signal_values.append(ema_macd)
    MACD_hist_values.append(macd - ema_macd)

df = df.assign(ClosePrice=pd.Series(df['close'], index=df.index))
df = df.assign(FastEMA12d=pd.Series(ema_fast_values, index=df.index))
df = df.assign(SlowEMA26d=pd.Series(ema_slow_values, index=df.index))
df = df.assign(MACD=pd.Series(macd_values, index=df.index))
df = df.assign(EMA_MACD9d=pd.Series(macd_signal_values, index=df.index))
df = df.assign(MACD_hist=pd.Series(MACD_hist_values, index=df.index))

可视化绘图如下:

# 绘图部分

# 第一个图:Close price, FastEMA12d, SlowEMA26d
fig1 = go.Figure()
fig1.add_trace(go.Scatter(x=df.index, y=df['ClosePrice'], name='Close price', line=dict(color='green')))
fig1.add_trace(go.Scatter(x=df.index, y=df['FastEMA12d'], name='FastEMA12d', line=dict(color='blue')))
fig1.add_trace(go.Scatter(x=df.index, y=df['SlowEMA26d'], name='SlowEMA26d', line=dict(color='red')))
fig1.update_layout(title="Close price and EMAs", xaxis=dict(title="Date"), yaxis=dict(title="Close price"))

# 第二个图:MACD, EMA_MACD9d
fig2 = go.Figure()
fig2.add_trace(go.Scatter(x=df.index, y=df['MACD'], name='DIF', line=dict(color='grey')))
fig2.add_trace(go.Scatter(x=df.index, y=df['EMA_MACD9d'], name='DEA', line=dict(color='orange')))
fig2.update_layout(title="DIF and DEA", xaxis=dict(title="Date"), yaxis=dict(title="Value"))

# 第三个图:MACD_hist
bar_color = ['green' if val < 0 else 'red' for val in df['MACD_hist']]
fig3 = go.Figure()
fig3.add_trace(go.Bar(x=df.index, y=df['MACD_hist'], name='MACD_hist', marker=dict(color=bar_color)))
fig3.update_layout(title="MACD_hist", xaxis=dict(title="Date"), yaxis=dict(title="Value"))

# 显示图形
fig1.show()
fig2.show()
fig3.show()

图2 价格图

图3 DIF和DEA图

图4 MACD柱状图

三、策略分析

3.1 MACD指标的买卖原则和基本用法

买卖原则:

(1)DIF、DEA均为正,DIF向上突破DEA,买入信号参考。

(2)DIF、DEA均为负,DIF向下跌破DEA,卖出信号参考。

(3)DIF线与K线发生背离,行情可能出现反转信号。

(4)DIF、DEA的值从正数变成负数,或者从负数变成正数并不是交易信号,因为它们落后于市场。

基本用法:

(1)MACD金叉:DIF由下向上突破DEA,为买入信号。用MACD指标的“二次金叉”,可以寻找短线暴涨股。

(2)MACD死叉:DIF由上向下突破DEA,为卖出信号。

(3)MACD绿转红:MACD值由负变正,市场由空头转为多头。

(4)MACD红转绿:MACD值由正变负,市场由多头转为空头。

(5)DIFF与DEA均为正值,即都在零轴线以上时,大势属多头市场,DIFF向上突破DEA,可作买入信号。

(6)DIFF与DEA均为负值,即都在零轴线以下时,大势属空头市场,DIFF向下跌破DEA,可作卖出信号。

(7)当DEA线与K线趋势发生背离时为反转信号。

(8)DEA在盘整局面时失误率较高,但如果配合RSI及KDJ指标可适当弥补缺点。

3.2 实际应用

以12.12的情形为例,此时DIF为0.1411087,DEA为0.062,符合金叉即DIF由下向上突破DEA为买入信号,符合买卖原则中的DIF、DEA均为正,DIF向上突破DEA,应当买入。

四、参考资料

1.https://baijiahao.baidu.com/s?id=1762418406594680040&wfr=spider&for=pc

2. Tushare数据

3. Python绘制MACD指标图_python macd-CSDN博客

  • 35
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Terry_trans

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值