Python利用RSI、MACD和20均线图,分析某公司股票的短期价格趋势

本文选取恒瑞医药(股票代码为 'sh.600276' ) 2023-05-01至2023-07-01的收盘价,利用RSI(相对强弱指标)、MACD(移动平均收敛/发散指标)和20均线图来分析某公司股票收盘价的短期趋势。这些技术指标可以提供有关市场价格走势和动能的重要信息,帮助投资者更好地理解股票价格的波动。

(获取源代码ipynb文件可关注gzh'finance褪黑素'回复对应关键字,更多实证案例和模型可同样获取)

爬取恒瑞医药的股票价格数据

在最开始需要爬取恒瑞医药2023-05-01至2023-07-01的收盘价,Python代码如下:

# 获取股票数据代码
import baostock as bs
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime, date

# 登陆系统
lg = bs.login()
code = 'sh.600276' 
start = '2022-07-01'
end = '2023-07-01'

# 获取指数基金指数历史数据

hs300_price = bs.query_history_k_data_plus(code, "date,code,open,high,low,close,preclose,pctChg",
              start_date=start, end_date=end, frequency="d")
# 整合为DataFrame格式
data_list = []
while (hs300_price.error_code == '0') & hs300_price.next():
    data_list.append(hs300_price.get_row_data())
hs300 = pd.DataFrame(data_list, columns=hs300_price.fields)
hs300.to_csv('600276.csv')

通过df = pd.read_csv('600276.csv')调用查看生成的数据:

1.相对强弱指标(RSI)

1.1 RSI的介绍

RSI是一种平稳价格动量的技术指标,通常在0到100的范围内波动。它用于判断股票或其他资产是否处于超买或超卖状态。

超买(Overbought):当市场价格上涨过快或过多,导致股票或其他资产的价格高于其合理价值时,市场被认为是超买状态。在这种情况下,市场参与者普遍认为该资产的价格偏高,可能面临回调或下跌的风险。超买并不意味着股票价格就一定会立即下跌,但它可能是一个价格反转的潜在信号。

超卖(Oversold):当市场价格下跌过快或过多,导致股票或其他资产的价格低于其合理价值时,市场被认为是超卖状态。在这种情况下,市场参与者普遍认为该资产的价格偏低,可能面临反弹或上涨的机会。超卖并不意味着股票价格就一定会立即上涨,但它可能是一个价格反转的潜在信号。

RSI值70可能表示超买,意味着价格可能会回调。RSI值低于30可能表示超卖,暗示价格可能会反弹。

1.2 RSI的具体计算公式

(1)计算涨幅的平均值(Average Gain,AG):取N天内涨幅的总和,然后除以N,其中N为RSI的计算周期(通常为14)。

AG = (gain1 + gain2 + ... + gainN) / N

计算跌幅的平均值(Average Loss,AL):取N天内跌幅的总和,然后除以N,其中N为RSI的计算周期(通常为14)。

AL = (loss1 + loss2 + ... + lossN) / N

(2)计算RS的值(Relative Strength):RS = AG / AL

(3)RSI = 100 - (100 / (1 + RS))

在RSI计算中,N天是选择当天之前的交易日数据。具体说来,RSI的计算周期为N天,而每一天的RSI值都是基于这N天内的价格变化数据计算出来的。

假设我们有一段时间内的股票价格数据,我们要计算14天的RSI值,那么对于第15天的RSI值,就是基于前14天(第2天到第15天)的价格变化数据来计算的。对于第16天的RSI值,就是基于前15天(第3天到第16天)的价格变化数据来计算的,依此类推。

RSI的计算周期是一个固定的值,通常常用的计算周期有14天、9天或者其他不同的天数,这取决于个人的偏好和分析需求。可以根据自己的需求选择合适的RSI计算周期。

1.3 恒瑞医药一年内的RSI

根据上述计算公式得到恒瑞医药2022-7-1至2023-7-1的RSI为(受篇幅限制只展示部分数据)

这一系列的数据都为RSI值的磁盘。磁盘的长度与输入价格数据的长度相同,每个位置上的值对时期的RSI值。当RSI值超过70时,可能意味着市场超买,当RSI值低于30时,可能意味着市场超卖。这些信号可指导进行买入或卖出出的决策。

price = df["close"]

def calculate_rsi(prices, period=14):
    deltas = np.diff(prices)
    seed = deltas[:period + 1]
    up = seed[seed >= 0].sum() / period
    down = -seed[seed < 0].sum() / period
    rs = up / down
    rsi = np.zeros_like(prices)
    rsi[:period] = 100. - 100. / (1. + rs)

    for i in range(period, len(prices)):
        delta = deltas[i - 1]  # since the diff is 1 shorter
        if delta > 0:
            upval = delta
            downval = 0.
        else:
            upval = 0.
            downval = -delta

        up = (up * (period - 1) + upval) / period
        down = (down * (period - 1) + downval) / period
        rs = up / down
        rsi[i] = 100. - 100. / (1. + rs)

    return rsi

# 示例用法
import numpy as np

# 假设这是你的价格数据,这里使用一个随机生成的示例数据
prices = np.array(price)

rsi_values = calculate_rsi(prices)
print(rsi_values)

 对rsi_values作柱形图,超过70的标红,少于30的部分标绿:

plt.figure(figsize=(12, 6))
plt.bar(range(len(rsi_values)), rsi_values)

# 设置柱形颜色
for i in range(len(rsi_values)):
    if rsi_values[i] > 70:
        plt.gca().get_children()[i].set_facecolor('red')
    elif rsi_values[i] < 30:
        plt.gca().get_children()[i].set_facecolor('green')

plt.xlabel('Days')
plt.ylabel('RSI Values')
plt.title('RSI Values with Red Bars > 70 and Green Bars < 30')
plt.show()

2.移动平均收敛/发散指标(MACD)

2.1 MACD的介绍

MACD是一种趋势跟踪指标,通过计算两条移动平均线(通常是12日和26日指数移动平均线)之间的方差来计算。还包括一条信号线(通常是9日移动平均线)。MACD的正值表示短期均线与长期均线,可能表明股票处于上涨趋势。反之,负值可能表明下跌趋势。

2.2 MACD的计算步骤

(1)计算快速(短期)移动平均线(EMA12)和慢速(长期)移动平均线(EMA26)。EMA是指数移动平均线。

EMA的初始值是取第一个计算周期(12或26)内的价格数据的简单移动平均(SMA)。简单移动平均是取这段时间内所有价格的总和,然后除以计算周期的天数。

接下来,计算每个后续EMA的值时,都会根据上一期EMA值和当前价格数据来计算。计算公式如下:

当前EMA值 = (当前价格 - 上一期EMA值) * 平滑系数 + 上一期EMA值

其中,平滑系数 = 2 / (计算周期 + 1)

(2)计算DIF线,即快EMA和慢速EMA的差值:DIF = EMA12 - EMA26。

(3)计算信号线(DEA),通常为DIF的9日(或其他周期)EMA。

(4)计算MACD柱状线(MACD Histogram),即DIF线与信号线之间的差值:MACD Histogram = DIF - DEA。

2.3 恒瑞医药的MACD图和解析

MACD指标图通常包含价格曲线、DIF线、信号线和MACD柱状图。

DIF线(红色线):快速EMA和慢速EMA的差值。当DIF线在零轴上方时,表示短期均线相对于长期均线的走势较强势,可能会着着价格。上涨反之,当DIF线在零轴下方时,表示短期均线相对于长期均线的走势较为不利,可能会着着价格下跌。

信号线(绿线):通常为DIF线的9日EMA。信号线是DIF线的平滑线,有助于过滤短期的价格波动。当DIF线从下方突破信号线时,可能是买入信号。相反,当DIF线从上方突破信号线时,可能是卖出信号。

MACD柱状图(橙色柱状图):DIF线和信号线的差值。MACD柱状图在零轴上方时,表示快速均线走势强于慢速均线,市场可能呈现上涨趋势。反之,MACD柱状图在零上方轴下方时,表示快速均线走势弱于慢速均线,市场可能呈下跌趋势。

图中需要关注几个部分:

(1)DIF线和信号线的交叉:当DIF线从下方向上突破信号线,可能是买入信号。反之,当DIF线从上方上方突破信号线,可能是卖出信号。

(2)MACD柱状图的形态:观察MACD柱状图的高低,当MACD柱状图逐渐增大,表示快速均线走势强于慢速均线,市场可能呈上涨趋势。反之,当MACD柱状图逐渐缩小,表示快速均线走势弱于慢速均线,市场可能呈下跌趋势。

import numpy as np

def calculate_ema(data, window):
    # 计算指数移动平均线
    weights = np.exp(np.linspace(-1., 0., window))
    weights /= weights.sum()
    ema = np.convolve(data, weights, mode='full')[:len(data)]
    ema[:window] = ema[window]
    return ema

def calculate_macd(prices, short_window=12, long_window=26, signal_window=9):
    # 计算MACD指标
    short_ema = calculate_ema(prices, short_window)
    long_ema = calculate_ema(prices, long_window)

    dif = short_ema - long_ema
    signal_line = calculate_ema(dif, signal_window)

    macd_histogram = dif - signal_line

    return dif, signal_line, macd_histogram

# 示例用法
import matplotlib.pyplot as plt

# 假设这是你的价格数据,这里使用一个随机生成的示例数据
prices = price

dif, signal_line, macd_histogram = calculate_macd(prices)

plt.figure(figsize=(12, 6))
plt.plot(prices, label='Prices', color='blue')
plt.legend()
plt.show()

plt.figure(figsize=(12, 6))
plt.plot(dif, label='DIF', color='red')
plt.plot(signal_line, label='Signal Line', color='green')
plt.bar(range(len(prices)), macd_histogram, label='MACD Histogram', color='orange')
plt.legend()
plt.show()

3.20日简单移动平均线(20均线)

20日简单移动平均线是指过去20个交易日的收盘价的配合。它用于平滑价格数据,并经常启动支撑和制动水平。当价格上涨时并且位于20日均线上方时,可能表明股票呈上涨趋势。相反,当价格下跌且位于20日均线下方时,可能表明股票呈下跌趋势。

使用calculate_moving_average函数计算了20日均线的值。然后使用Matplotlib库来绘制不同的价格曲线和20日均线曲线。上述价格曲线以蓝色显示,20日均线以红色显示。

价格曲线(蓝色线):代表了市场价格的走势。价格曲线的波动和变化反映了资产的价格走势,可以看出价格的涨跌趋势。

20日均线(红色线)代表了20日的移动平均价格。均线的作用是平滑价格波动,它反映了更长期的价格趋势。当价格在20日均线上方时,可能表明市场出现上涨趋势;当价格位于20日均线下方时,可能表明市场呈下跌趋势。

当价格曲线与20日均线之间交叉时,可能会着着价格趋势的变化。当价格曲线从下方向上突破20日均线时,可能是一个买入信号,表示市场可能出现上涨;反之,当价格椭圆形从上方穿过20日均线时,可能是卖出信号,表示市场可能出现下跌。

import numpy as np
import matplotlib.pyplot as plt

def calculate_moving_average(prices, window=20):
    # 计算移动平均线
    return np.convolve(prices, np.ones(window)/window, mode='same')

# 示例用法
# 假设这是你的价格数据,这里使用一个随机生成的示例数据
prices = price

# 计算20日均线
ma_20 = calculate_moving_average(prices, window=20)

# 绘制价格曲线和20日均线曲线
plt.figure(figsize=(12, 6))
plt.plot(prices, label='Prices', color='blue')
plt.plot(ma_20, label='20-day Moving Average', color='red')
plt.legend()
plt.show()

(获取源代码ipynb文件可关注gzh'finance褪黑素'回复对应关键字,更多实证案例和模型可同样获取)

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值