SKDJ (Stochastic KDJ) - 慢速随机指标
1 公式
LOWV:=LLV(LOW,N);
HIGHV:=HHV(HIGH,N);
RSV:=EMA((CLOSE-LOWV)/(HIGHV-LOWV)*100,M);
K:EMA(RSV,M);
D:MA(K,M);
2 数据准备
我们以科创50指数 000688 为例,指数开始日期为2019-12-31,数据格式如下:
3 计算过程
def calculate_skdj(df: pd.DataFrame, N=9, M=3) -> pd.DataFrame:
'''
计算 Stochastic K-D (SKDJ) 指标。
参数:
df (pd.DataFrame): 包含至少 'high', 'low', 'close' 列的 DataFrame,
分别代表每日最高价、最低价和收盘价。
N (int): 用于计算 RSV 的时间窗口大小,默认为9。
M (int): 用于计算 K 和 D 值的指数加权移动平均 (EWMA) 和简单移动平均 (SMA) 的平滑因子,默认为3。
返回:
pd.DataFrame: 包含 Stochastic K (k) 和 Stochastic D (d) 的 DataFrame。
'''
# 创建一个df的副本以避免修改原始数据
data = df.copy()
# 使用rolling方法计算N周期内的最低价
ln = data['low'].rolling(N, min_periods=1).min()
# 使用rolling方法计算N周期内的最高价
hn = data['high'].rolling(N, min_periods=1).max()
# 计算 RSV (Relative Strength Value)
# 公式为:(Close - Lowest Low) / (Highest High - Lowest Low) * 100
# 使用指数加权移动平均 (EWMA) 对 RSV 进行平滑处理
rsv = ((data['close'] - ln) / (hn - ln) * 100).ewm(span=M, adjust=False).mean()
# 计算 K 值,使用指数加权移动平均 (EWMA)
k = rsv.ewm(span=M, adjust=False).mean()
# 计算 D 值,使用简单移动平均 (SMA)
d = k.rolling(M).mean()
# 将计算出的 Stochastic K (k) 和 Stochastic D (d) 添加到 DataFrame
data['k'] = k
data['d'] = d
# 返回包含所有计算出指标的 DataFrame
return data
4 注意事项
参数N=9,M=3时,计算结果与东方财富软件中一致
雪球无此指标
与通信达一致