Python 实现 RSI 指标计算:股票技术分析的利器系列(4)
- 介绍
- 算法解释
- 代码
- rolling函数介绍
- 计算LC
- shift函数
- 语法:
- 参数:
- 返回值:
- 计算涨跌幅
- 函数MAX介绍
- 语法:
- 参数:
- 返回值:
- 示例:
- abs函数介绍
- 语法:
- 参数:
- 返回值:
- 示例:
- 计算移动平均
- 计算RSI
- 计算单个的RSI代码
- 计算3个RSI ,完整代码
介绍
先看看官方介绍:
RSI (相对强弱指标)
用法
1.RSI>80 为超买,RSI<20 为超卖;
2.RSI 以50为中界线,大于50视为多头行情,小于50视为空头行情;
3.RSI 在80以上形成M头或头肩顶形态时,视为向下反转信号;
4.RSI 在20以下形成W底或头肩底形态时,视为向上反转信号;
5.RSI 向上突破其高点连线时,买进;RSI 向下跌破其低点连线时,卖出。
算法解释
LC:=REF(CLOSE,1);
RSI1:SMA(MAX(CLOSE-LC,0),N1,1)/SMA(ABS(CLOSE-LC),N1,1)*100;
RSI2:SMA(MAX(CLOSE-LC,0),N2,1)/SMA(ABS(CLOSE-LC),N2,1)*100;
RSI3:SMA(MAX(CLOSE-LC,0),N3,1)/SMA(ABS(CLOSE-LC),N3,1)*100;
代码
rolling函数介绍
rolling
函数通常与其他函数(如 mean
、sum
、std
等)一起使用,以计算滚动统计量,例如滚动均值、滚动总和等。
以下是 rolling
函数的基本语法:
DataFrame.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None)
window
: 用于计算统计量的窗口大小。min_periods
: 每个窗口最少需要的非空观测值数量。center
: 确定窗口是否居中,默认为False
。win_type
: 窗口类型,例如None
、boxcar
、triang
等,默认为None
。on
: 在数据帧中执行滚动操作的列,默认为None
,表示对整个数据帧执行操作。axis
: 执行滚动操作的轴,默认为0
,表示按列执行操作。closed
: 确定窗口的哪一端是闭合的,默认为None
。
计算LC
# 计算LC
df['LC'] = df['CLOSE'].shift(1)
shift函数
shift()
是 Pandas 中的一个函数,用于将 DataFrame 或 Series 中的数据沿着指定轴向上或向下移动指定数量的位置。这可以用来创建滞后值或领先值,也就是将数据向前或向后移动一定的步数。
语法:
DataFrame.shift(periods=1, freq=None, axis=0, fill_value=None)
参数:
periods
:要移动的位置数目,可以是正数(向下移动)或负数(向上移动)。默认值为 1。freq
:可选,用于时序数据。在时间序列数据中,可以通过设置freq
参数来指定时间频率,例如 “D” 表示日历日,“M” 表示月份,等等。axis
:指定沿着哪个轴进行移动,0 表示行索引,1 表示列索引。默认值为 0。fill_value
:可选,用于填充缺失值的替代值。
返回值:
返回一个移动后的新的 DataFrame 或 Series。
计算涨跌幅
# 计算涨跌幅
df['up_move'] = df['CLOSE'] - df['LC']
df['up'] = df['up_move'].apply(lambda x: max(x, 0))
df['down'] = df['up_move'].apply(lambda x: abs(x))
函数MAX介绍
max()
是 Python 内置函数之一,用于返回给定参数的最大值。
语法:
max(arg1, arg2, *args[, key])
参数:
arg1
,arg2
, …:要比较的对象,可以是数字、字符串、列表、元组等可比较的数据类型。*args
(可选):用于传递多个参数,可以是任意数量的参数。key
(可选):用于指定比较的函数。
返回值:
返回给定参数的最大值。
示例:
print(max(5, 10, 3, 8)) # 输出:10
print(max([3, 8, 2, 10])) # 输出:10
print(max("apple", "banana", "orange")) # 输出:"orange"
在示例中,max()
函数分别返回了传递给它的数字、列表和字符串中的最大值。
abs函数介绍
abs()
是 Python 内置函数之一,用于返回给定参数的绝对值。
语法:
abs(x)
参数:
x
:要求取绝对值的数字或者可转换为数字的对象。
返回值:
返回参数的绝对值。
示例:
print(abs(-5)) # 输出:5
print(abs(3.14)) # 输出:3.14
print(abs(-10.5)) # 输出:10.5
在示例中,abs()
函数分别返回了 -5
、3.14
和 -10.5
的绝对值。
计算移动平均
# 计算移动平均
df['avg_gain'] = df['up'].rolling(window=N).mean()
df['avg_loss'] = df['down'].rolling(window=N).mean()
计算RSI
# 计算RSI
df['RSI'] = df['avg_gain'] / df['avg_loss'] * 100
计算单个的RSI代码
需要数据可以看附件资源 RSI-单个
import pandas as pd
data = {
'CLOSE': 填每日收盘的数据,
}
df = pd.DataFrame(data)
# LC:=REF(CLOSE,1);
# RSI1:SMA(MAX(CLOSE-LC,0),N1,1)/SMA(ABS(CLOSE-LC),N1,1)*100;
def RSI(N):
# 计算LC
df['LC'] = df['CLOSE'].shift(1)
# 计算涨跌幅
df['up_move'] = df['CLOSE'] - df['LC']
df['up'] = df['up_move'].apply(lambda x: max(x, 0))
df['down'] = df['up_move'].apply(lambda x: abs(x))
# 计算移动平均
df['avg_gain'] = df['up'].rolling(window=N).mean()
df['avg_loss'] = df['down'].rolling(window=N).mean()
# 计算RSI
df['RSI'] = df['avg_gain'] / df['avg_loss'] * 100
# 清理中间结果
df.drop(['up_move', 'up', 'down', 'avg_gain', 'avg_loss'], axis=1, inplace=True)
return df
N1 = 6
print(RSI(N1))
计算3个RSI ,完整代码
默认情况下,RSI
通常包括 RSI6
、RSI12
和 RSI24
,它们分别代表了不同的 RSI
计算窗口大小,即 6
天、12
天和 24
天。
需要数据可以看附件资源 RSI
import pandas as pd
data = {
'CLOSE': 填每日收盘的数据,
}
df = pd.DataFrame(data)
# LC:=REF(CLOSE,1);
# RSI1:SMA(MAX(CLOSE-LC,0),N1,1)/SMA(ABS(CLOSE-LC),N1,1)*100;
def RSI(N):
# 计算LC
df['LC'] = df['CLOSE'].shift(1)
# 计算涨跌幅
df['up_move'] = df['CLOSE'] - df['LC']
df['up'] = df['up_move'].apply(lambda x: max(x, 0))
df['down'] = df['up_move'].apply(lambda x: abs(x))
# 计算移动平均
df['avg_gain'] = df['up'].rolling(window=N).mean()
df['avg_loss'] = df['down'].rolling(window=N).mean()
# 计算RSI
rsi_name = 'RSI' + str(N)
df[rsi_name] = df['avg_gain'] / df['avg_loss'] * 100
# 清理中间结果
df.drop(['up_move', 'up', 'down', 'avg_gain', 'avg_loss'], axis=1, inplace=True)
return df
N1 = 6
N2 = 12
N3 = 24
rsi_6 = RSI(N1)
rsi_6_12 = RSI(N2)
rsi_6_12_24 = RSI(N3)
print(rsi_6_12_24)