点赞、关注,养成良好习惯
Life is short, U need Python
量化投资实战系列,不断更新中
1. RSI基本概念
相对强弱指标( Relative Strength Index,RSI)最早被用于期货交易中,后来人们发现用该指标来指导股票市场投资效果也十分不错,并对该指标的特点不断进行归纳和总结。现在,RSI已经成为被投资者应用最广泛的技术指标之一。
投资的一般原理认为,投资者的买卖行为是各种因素综合结果的反映,行情的变化最终取决于供求关系,而RSI指标正是根据供求平衡的原理,通过测量某一个期间内股价上涨总幅度占股价变化总幅度平均值的百分比,来评估多空力量的强弱程度,进而提示具体操作的。RSI的应用法则表面上比较复杂,包括了交叉、数值、形态和背离等多方面的判断原则。
在股票市场上,买方和卖方力量的消长会影响股票的价格。如果股票的买入力量大于卖出力量,则股票的价格会上涨;如果股票的卖出力量大于买入力量,则股票的价格会下跌。如何运用一种巧妙的方法来判断股票的买入力量与卖出力量的强弱?这个问题早在20世纪70年代被一位投资者提出并最终找到一个解决方案。韦尔斯·威尔德(Wells Wilder)于1978年6月在Commodities(现称为Future杂志)月刊上发表了一种衡量证券自身内在相对强度的指标,即 “RSI”指标,RSI是用一种特定公式计算出来的值,投资者可以通过RSI的取值来判断股票的买入和卖出情况,进而预测未来股票的价格走势。
2. RSI计算公式
R
S
I
=
U
P
U
P
+
D
O
W
N
∗
100
RSI = \frac{UP}{UP+DOWN} * 100
RSI=UP+DOWNUP∗100
其中,
U
P
UP
UP表示
t
t
t期内股票上涨幅度的平均值,
D
O
W
N
DOWN
DOWN表示
t
t
t期内股票下跌幅度的平均值。
在计算 UP 和 DOWN 的值时,需要求出上涨幅度的平均值和下跌幅度的平均值,一般使用 算术平均值 来求 UP和DOWN。事实上,均值可分为简单移动平均值(SMA)、加权移动平均值(WMA)和指数移动平均值(EMA)。在计算上涨幅度和下跌幅度的平均值时,使用不同的均值计算方式求得的平均值大小有差异,最终会使RSI的取值不同。
从RSI的计算公式可知:RSI的取值范围是 0 ∼ 100 0 \sim 100 0∼100。
-
当RSI值接近于0时,由公式可知 U P ≪ D o w n UP\ll Down UP≪Down ,即上涨幅度远小于下跌幅度。也就是说,在时间跨度 t t t内,股票价格下跌的力量远大于上涨的力量。
-
当RSI值接近于100时,由公式可知 U P ≪ D o w n UP\ll Down UP≪Down ,即上涨幅度远大于下跌幅度。也就是说,在时间跨度 t t t内,股票价格上涨的力量远大于下跌的力量。
-
当RSI值接近于50时,由公式可知 U P = D o w n UP = Down UP=Down ,即上涨的幅度等于下跌的幅度。
3. RSI参数差异
根据 RSI的计算过程,可以看出时间跨度t是RSI取值的一个重要影响因素。韦尔斯-威尔德(Wells Wilder)指出,通过运用月周期28日的一半来计算 RSI的值进行预测是有效的,他推荐RSI的时间跨度默认值为14日。一些常用的看盘软件设有6日RSI、12日RSI和 24日RSI这三个RSI指标。6日近似一周的时间周期,12日可以看作半个月的时间跨度,而 24日约为一个月的时间跨度。此外,也有人用RSI1来代指6日相对强度指标RSI2 表示 12日相对强度指标,RSI3 表示24日相对强度指标。
RSI时间跨度的设定不是一成不变的,它可以根据股价情况来进行相应调整,也可以根据研究分析的需要来设定,不同时间跨度计算出来的RSI值自然会有所不同。例如,可以将RSI时间跨度设定为10日、25日、30日、60日等:如果股价数据是月数据,可以把 RSI计算的时间跨度设定为1个月、9个月、12个月、24个月等。短期RSI分析可以用日数据、周数据,长期RSI分析可以选择月数据。在投资分析中,投资者可以参考短期 RSI和长期RSI进行投资决策。短期RSI对于价格的变化情况反应比较灵敏,RSI的值波动较大;长期RSI值反应相对迟钝,其波动相对较小。
4. RSI识别超买和超卖
从RSI计算公式可知,RSI值的大小可用于表明股票超买和超卖状态:
-
当RSI取值为50时,UP 和 DOWN 的取值相同,股票的买入力量等于股票的卖出力量;
-
RSI取值越大,说明 UP 的取值超过 DOWN 取值的程度越大,股票的买入热度大于卖出热度的程度越大;
-
RSI取值越小,可以推出说明 DOWN 的取值超过 UP 取值的程度越大,股票的卖出热度大于买入热度的程度越大。
超买线、超卖线和中心线
- RSI取值等于80或20分别为较常用的“超买线”和“超卖线”的刻画。RSI为80是股票超买的临界点,RSI为20是股票超卖的临界点,RSI取值为50设定为“中心线”,该线表明股票的买入力量等于卖出力量。
- 当RSI大于80时,股票出现超买信号。股票买入力量过大,买入力量在未来可能会减小,所以股票未来价格可能会下跌,此时卖出股票,未来下跌后再买入股票,从而赚取价差。
- 当RSI小于20时,股票出现超卖信号。股票卖出力量过大,卖出力量在未来终归回到正常,因此股票未来价格可能会上涨,投资者此时可以做多股票,未来价格上涨后再卖出。
- RSI值为90和10也可以作为股票超买线和超卖线的制定标准。此外,RSI值为70和30的超卖线和超买线已被验证能有效预测未来股价的走势,并为投资者和学者广泛使用。
5. RSI“黄金交叉”和“死亡交叉”
在股票市场使用RSI指标时,一般会定义不同时间跨度的RSI值。
- 当短期RSI线向上穿过长期 RSI线时,股票近期买入的力量较强,价格上涨的力量很大,其释放出一个较强的买入信号,这个信号被称为“黄金交叉”。
- 当短期RSI线向下跌破长期RSI线时,股票近期卖出的力量较强,价格下跌的力量很大,其释放出一个较强的卖出信号,被称为“死亡交叉”。
6. RSI之Python交易实测
以“贵州茅台”股票为例,用Python编写代码计算出RSI值,并运用RSI值制定交易策略。编写代码的主要思路如下:
- 数据准备:获取交通银行股票数据,提取出收盘价数据。
- 捕捉买卖点:计算RSI_6和RSI_24的值,当 RSI_6 > 80 或者 RSI_6 向下穿过 RSI_24 时,为卖出信号。当 RSI_6 < 20 或者 RSI_6 向上穿过 RSI_24 时,为买入信号。
- 交易策略执行:按照 RSI 的买卖点买入或者卖出股票。
- 交易策略回测:对交易策略进行投资评价。
6.1 数据准备
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
# 获取贵州茅台股票交易数据
maotai = pd.read_csv('600519.csv',index_col='date')
maotai.index = pd.to_datetime(maotai.index)
maotai.head()
# 提取贵州茅台收盘价
maotai_Close = maotai.close
# 计算贵州茅台收盘价变化
maotai_Change = (maotai_Close - maotai_Close.shift(1)).dropna()
# 建立价格上升(下降)量
UP = pd.Series(0,index=maotai_Change.index)
DOWN = pd.Series(0,index=maotai_Change.index)
# 寻找上升(下降)值
UP[maotai_Change>0] = maotai_Change[maotai_Change>0]
DOWN[maotai_Change<0] = -maotai_Change[maotai_Change<0]
# 合并上述四个Series
RSI = pd.concat([maotai_Close,maotai_Change,UP,DOWN],axis=1).dropna()
RSI.columns = ['Close','PrcChange','upPrc','downPrc']
RSI.head()
# 利用简单平均数计算6日上涨力度和下跌力度,然后计算6日RSI的值
SM_UP = [] # 初始值
SM_DOWN = [] # 初始值
for i in range(6,len(UP)+1):
SM_UP.append(np.mean(UP.values[(i-6):i],dtype=np.float64))
SM_DOWN.append(np.mean(DOWN.values[(i-6):i],dtype=np.float64))
RSI6 = [100 * SM_UP[i] / (SM_UP[i] + SM_DOWN[i]) for i in range(0,len(SM_UP))]
RSI6 = pd.Series(RSI6,index=RSI.index[5:])
- RSI指标可视化
plt.figure(figsize=(10,8))
plt.subplot(411)
plt.plot(maotai_Close,color='k')
plt.xlabel('date')
plt.ylabel('Close')
plt.title('RSI相关指标',loc='center')
plt.subplot(412)
plt.plot(UP,'b')
plt.ylabel('UP')
plt.subplot(413)
plt.plot(DOWN,'y')
plt.ylabel('DOWN')
plt.subplot(414)
plt.plot(DOWN,'g')
plt.xlabel('date')
plt.ylabel('RSI6')
plt.show()
- 超买状态与超卖状态可视化
代码详见资源包!
- “黄金交叉”与“死亡交叉”可视化
代码详见资源包!
6.2 捕捉买卖点
- 以贵州茅台RSI指标交易实测为例
代码详见资源包!
6.3 策略执行
代码详见资源包!
6.4 策略回测
代码详见资源包!
7. 小结
(1)未修正的RSI策略远远跑输股票本身交易策略;
(2)修正RSI策略也远低于股票本身交易策略;
(3)修正RSI策略远优越于未修正的RSI策略!
(4)下一步:选取其他时间段的交易数据进行Python实战测试!
(5)原因分析:此时间段是大盘股的牛市,拿住大盘股股票不动会获得超额收益!所以,频繁交易会错失交易机会!!
8. 参考资料
- 蔡立耑. 量化投资以Python为工具[M]. 北京:电子工业出版社,2017.
- PyQuant. 量化投资基础[M]. 北京:科学出版社,2024.
9. 资源包下载
- 链接:https://pan.baidu.com/s/1lbAfzPTR-NYZWy3O3Z_UKQ
- 提取码:1234
- 写作不易,切勿白剽
- 点赞关注,最大鼓励
- 持续更新,未完待续…