Python 金融量化 RSI相对强弱指标

本文介绍了如何使用Python计算和绘制股票的相对强弱指数(RSI),包括获取数据、RSI的基本概念、计算函数、绘图函数。还探讨了RSI的超买超卖判断、黄金交叉与死亡交叉等技术分析,并提供了实例代码。通过调整时间跨度,可以优化RSI的信号滞后问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 定义获取数据函数

第一步,我们照常从tushare获取数

import tushare as ts
import pandas as pd
token = 'Your token'   # 输入你的接口密匙,获取方式及相关权限见Tushare官网。这句话不能照抄!
pro = ts.pro_api(token)
def get_data(tscode):
	df = pro.daily(ts_code=tscode)
	df = df.loc[:, ['trade_date', 'open', 'high', 'low', 'close', 'vol']]
	df.rename(
	    columns={
	        'trade_date': 'Date', 'open': 'Open',
	        'high': 'High', 'low': 'Low',
	        'close': 'Close', 'vol': 'Volume'},
	    inplace=True)       # 重定义列名,方便统一规范操作。
	df['Date'] = pd.to_datetime(df['Date'])  # 转换日期列的格式,便于作图
	df.set_index(['Date'], inplace=True)  # 将日期列作为行索引
	df = df.sort_index() # 倒序以便作图
	return df

2. RSI基本概述

RSI即相对强弱指标(Relative Strength Index),是在股票市场上用于衡量证券自身内在强度的指标,用于判断股票买方力量与卖方力量的强弱,进而预测价格走势。
计算公式如下:
R S I = 100 − 100 1 + R S \displaystyle RSI=100-\frac{100}{1+RS} RSI=1001+RS100 R S I = 100 × R S 1 + R S \displaystyle RSI=100×\frac{RS}{1+RS} RSI=100×1+RSRS
其中: R S = U P D O W N \displaystyle RS=\frac{UP}{DOWN} RS=DOWNUP
故上述公式也即 R S I = 100 × U P U P + D O W N \displaystyle RSI=100×\frac{UP}{UP+DOWN} RSI=100×UP+DOWNUP

  • UP表示t期内股价上涨幅度的平均值
  • DOWN表示t期内股价下跌幅度的平均值
  • 该均值使用不同均值类型计算出的结果会有所差异。
  • RSI接近于0的时候,UP≪Down
  • RSI接近于100的时候UP≫Down
  • RSI取值为50时UP=Down

总之

  • RSI大于50越多,表明股票上涨的力量超过下跌的力量越大。
  • RSI小于50越多,表明股票下跌的力量超过上涨的力量越大。

3. python编写Rsi函数

# 默认时间跨度设为6天
import pandas as pd
import numpy as np
def rsi(price, period=6):
    clprcChange = price - price.shift(1)
    clprcChange = clprcChange.dropna()

    indexprc = clprcChange.index
    upPrc = pd.Series(0, index=indexprc)
    upPrc[clprcChange > 0] = clprcChange[clprcChange > 0]

    downPrc = pd.Series(0, index=indexprc)
    downPrc[clprcChange < 0] = -clprcChange[clprcChange < 0]
    risdata = pd.concat([price, clprcChange, upPrc, downPrc], axis=1)
    risdata.columns = ['price', 'PrcChange', 'upPrc', 'downPrc']
    risdata = risdata.dropna()

    SMUP = []
    SMDOWN = []
    for i in range(period, len(upPrc) + 1):
        SMUP.append(np.mean(upPrc.values[(i - period): i], dtype=np.float32))
        SMDOWN.append(np.mean(downPrc.values[(i - period): i], dtype=np.float32))
        rsi = [100 * SMUP[i] / (SMUP[i] + SMDOWN[i]) for i in range(0, len(SMUP))]

    indexRsi = indexprc[(period - 1):]
    rsi = pd.Series(rsi, index=indexRsi)
    return rsi

韦尔斯·威尔德(Wells Wilder)指出,通过运用月周期28天的一半来计算RSI的值进行预测是有效的,他推荐14日为时间跨度。

一些常用的看盘软件设有6日RSI,12日RSI,24日RSI三个RSI指标。

  • 6日近似一周的时间周期
  • 12日近似半个月的时间周期
  • 24日近似一个月的时间周期
  • 此外也有人用RSI1表示6日相对强度指标,RSI2日表示12日相对强度指标,RSI3表示24日相对强度指标。

4. python编写Rsi绘图函数

import matplotlib.pyplot as plt
# 传入rsi_x时要记着切片
def rsi_plot(rsi_x):
	plt.rcParams['font.sans-serif'] = ['SimHei']
	plt.rcParams['axes.unicode_minus'] = False
	fig,ax = plt.subplots()
	plt.xlim(rsi_x.index[0],rsi_x.index[-1])
	plt.ylim(0,100)
	plt.grid(True)
	plt.xlabel('日期')
	plt.ylabel('rsi_values')
	fig.patch.set_facecolor('red')
	fig.patch.set_alpha(0.6)
	ax.patch.set_facecolor('yellow')
	ax.patch.set_alpha(1)
	plt.plot(rsi_x,color='r')
	plt.title('RSI指标图')

5. 调用以上函数

# 以平安银行为例
df = get_data('000001.SZ')
# 计算rsi
rsi6=rsi(df.Close)
# 以2020年全年数据为例绘图
rsi_plot(rsi6['2020'])

图像效果如下:
在这里插入图片描述

6.RSI指标判断股票超买和超卖状态

除了上边说到的0,50,100三个位点的状况,我们还可以刻画超买线,超卖线,和中心线。
RSI取值等于80和20分别为比较常用的“超买线”和“超卖线”。RSI为80表示超买的临界点,RSI为20表示超卖的临界点,RSI取值为50设定为“中心线”,表明买入力量等于卖出力量。

  • RSI大于80时,股票出现超买信号,股票买入力量过大,买入力量未来可能会减小,股票价格可能会下跌;
  • RSI小于20时,股票出现超卖信号,股票卖出力量过大,卖出力量未来可能会回归正常,因此股票价格可能会上涨。
  • 超买线和超卖线的刻画可以有所变化,90和10也是可以的,70和30也已被验证能够有效预测股票走势。具体选择,仁者见仁智者见智。

7. RSI的“黄金交叉”与“死亡交叉”

在股票市场使用RSI指标时,一般会定义不同的时间跨度的RSI值。

  • 当短期RSI向上穿过长期RSI线时,股票近期买入力量较强,价格上涨力量很大,其释放出一个较强的买入信号,这个信号被称为黄金交叉
  • 当短期RSI向下跌破长期RSI的时候,股票近期卖出力量较强,价格下跌力量很大,其释放出一个较强的卖出信号,被称为死亡交叉

用rsi6和rsi24来绘制RSI黄金交叉和死亡交叉
定义为函数形式

import matplotlib.pyplot as plt
def mult_rsi(rsi6,rsi12):
	plt.rcParams['font.sans-serif'] = ['SimHei']
	plt.rcParams['axes.unicode_minus'] = False
	fig,ax = plt.subplots()
	plt.xlim(rsi6.index[0],rsi6.index[-1])
	plt.ylim(0,100)
	plt.grid(True)
	plt.xlabel('日期')
	plt.ylabel('rsi_values')
	fig.patch.set_facecolor('red')
	fig.patch.set_alpha(0.6)
	ax.patch.set_facecolor('yellow')
	ax.patch.set_alpha(1)
	plt.plot(rsi6,color='r',label='RSI6')
	plt.plot(rsi12,color='g',label='RSI12')
	plt.legend()
	plt.title('双RSI线图')

调用并查看结果

rsi6 = rsi(df.Close)
rsi12 = rsi(df.Close, 12)
mult_rsi(rsi6['2020'],rsi12['2020'])

生成图像效果如下:
在这里插入图片描述
(这里选了一年的数据,选择时间较长。如选择更短时间段的数据,方便研究更多细节。)

8. 细节改进

比RSI信号指标释放出买卖点信号滞后3天或数天再执行买卖操作,有时会比滞后一天效果更理想。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

侯小啾

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

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

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

打赏作者

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

抵扣说明:

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

余额充值