本文选取恒瑞医药(股票代码为 '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')调用查看生成的数据:
RSI是一种平稳价格动量的技术指标,通常在0到100的范围内波动。它用于判断股票或其他资产是否处于超买或超卖状态。
超买(Overbought):当市场价格上涨过快或过多,导致股票或其他资产的价格高于其合理价值时,市场被认为是超买状态。在这种情况下,市场参与者普遍认为该资产的价格偏高,可能面临回调或下跌的风险。超买并不意味着股票价格就一定会立即下跌,但它可能是一个价格反转的潜在信号。
超卖(Oversold):当市场价格下跌过快或过多,导致股票或其他资产的价格低于其合理价值时,市场被认为是超卖状态。在这种情况下,市场参与者普遍认为该资产的价格偏低,可能面临反弹或上涨的机会。超卖并不意味着股票价格就一定会立即上涨,但它可能是一个价格反转的潜在信号。
RSI值70可能表示超买,意味着价格可能会回调。RSI值低于30可能表示超卖,暗示价格可能会反弹。
(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计算周期。
根据上述计算公式得到恒瑞医药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()
MACD是一种趋势跟踪指标,通过计算两条移动平均线(通常是12日和26日指数移动平均线)之间的方差来计算。还包括一条信号线(通常是9日移动平均线)。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。
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()
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褪黑素'回复对应关键字,更多实证案例和模型可同样获取)