TAMomentum
TA.STOCH()
随机指标 / KDJ (Stochastic Oscillator)
衡量价格在一定周期内相对于最高最低价的位置,判断超买超卖状态。
语法
python
TA.STOCH(high, low, close, fastk_period=5, slowk_period=3, slowk_matype=0, slowd_period=3, slowd_matype=0)参数
| 参数名 | 类型 | 必选 | 默认值 | 说明 |
|---|---|---|---|---|
| high | any | 否 | - | 最高价数组 |
| low | any | 否 | - | 最低价数组 |
| close | any | 否 | - | 收盘价数组 |
| fastk_period | any | 否 | - | FastK 周期,默认 5 |
| slowk_period | any | 否 | - | SlowK 平滑周期,默认 3 |
| slowk_matype | any | 否 | - | SlowK 移动平均类型,默认 0 (SMA) |
| slowd_period | any | 否 | - | SlowD 周期,默认 3 |
| slowd_matype | any | 否 | - | SlowD 移动平均类型,默认 0 |
返回值
返回 (k, d) 元组,即 KD 值
KDJ 计算
KDJ 指标是随机指标的变体:
python
k, d = TA.STOCH(highs, lows, closes, 9, 3, 0, 3, 0)
j = 3 * k[-1] - 2 * d[-1] # J 值计算公式:
- K = SlowK
- D = SlowD
- J = 3K - 2D
信号解读
超买超卖
- K < 20, D < 20: 超卖区域
- K > 80, D > 80: 超买区域
- J < 0: 极度超卖
- J > 100: 极度超买
金叉死叉
- K 上穿 D: 金叉,买入信号
- K 下穿 D: 死叉,卖出信号
钝化
- 强势上涨时,KD 可能长期在高位钝化
- 强势下跌时,KD 可能长期在低位钝化
基础示例
python
def main():
records = exchange.GetRecords()
highs = [r['High'] for r in records]
lows = [r['Low'] for r in records]
closes = [r['Close'] for r in records]
k, d = TA.STOCH(highs, lows, closes, 9, 3, 0, 3, 0)
j = 3 * k[-1] - 2 * d[-1]
Log(f"KDJ: K={k[-1]:.2f}, D={d[-1]:.2f}, J={j:.2f}")
# 超买超卖判断
if k[-1] < 20 and d[-1] < 20:
Log("KDJ 超卖区域,考虑买入")
elif k[-1] > 80 and d[-1] > 80:
Log("KDJ 超买区域,考虑卖出")
# KD 金叉死叉
if k[-1] > d[-1] and k[-2] <= d[-2]:
Log("KD 金叉")
elif k[-1] < d[-1] and k[-2] >= d[-2]:
Log("KD 死叉")高级应用
1. KDJ 低位金叉策略
python
def main():
records = exchange.GetRecords()
highs = [r['High'] for r in records]
lows = [r['Low'] for r in records]
closes = [r['Close'] for r in records]
k, d = TA.STOCH(highs, lows, closes, 9, 3, 0, 3, 0)
j = 3 * k[-1] - 2 * d[-1]
# 低位金叉(K < 30 区域金叉)
if k[-1] > d[-1] and k[-2] <= d[-2] and k[-1] < 30:
Log("KDJ 低位金叉,强买入信号")
# 高位死叉(K > 70 区域死叉)
elif k[-1] < d[-1] and k[-2] >= d[-2] and k[-1] > 70:
Log("KDJ 高位死叉,强卖出信号")2. J 值极限策略
python
def main():
records = exchange.GetRecords()
highs = [r['High'] for r in records]
lows = [r['Low'] for r in records]
closes = [r['Close'] for r in records]
k, d = TA.STOCH(highs, lows, closes, 9, 3, 0, 3, 0)
j = 3 * k[-1] - 2 * d[-1]
# J 值极限信号
if j < 0:
Log(f"J值 {j:.2f} < 0,极度超卖")
elif j > 100:
Log(f"J值 {j:.2f} > 100,极度超买")
# J 值回归
j_prev = 3 * k[-2] - 2 * d[-2]
if j_prev < 0 and j >= 0:
Log("J值从负值回归,反弹开始")
elif j_prev > 100 and j <= 100:
Log("J值从超高回落,回调开始")3. KDJ 多周期共振
python
def calculate_kdj(records):
"""计算KDJ指标"""
highs = [r['High'] for r in records]
lows = [r['Low'] for r in records]
closes = [r['Close'] for r in records]
k, d = TA.STOCH(highs, lows, closes, 9, 3, 0, 3, 0)
j = 3 * k[-1] - 2 * d[-1]
return k[-1], d[-1], j
def main():
# 不同周期
records_15m = exchange.GetRecords(PERIOD_M15)
records_1h = exchange.GetRecords(PERIOD_H1)
records_4h = exchange.GetRecords(PERIOD_H4)
k_15m, d_15m, j_15m = calculate_kdj(records_15m)
k_1h, d_1h, j_1h = calculate_kdj(records_1h)
k_4h, d_4h, j_4h = calculate_kdj(records_4h)
# 多周期超卖共振
if k_15m < 20 and k_1h < 20 and k_4h < 20:
Log("多周期KDJ超卖共振,强买入机会")
# 多周期超买共振
elif k_15m > 80 and k_1h > 80 and k_4h > 80:
Log("多周期KDJ超买共振,强卖出机会")4. KDJ 钝化处理
python
def main():
records = exchange.GetRecords()
highs = [r['High'] for r in records]
lows = [r['Low'] for r in records]
closes = [r['Close'] for r in records]
k, d = TA.STOCH(highs, lows, closes, 9, 3, 0, 3, 0)
# 检测钝化(连续3根K线都在超买/超卖区域)
k_history = k[-3:]
# 高位钝化
if all(k_val > 80 for k_val in k_history):
Log("KDJ 高位钝化,可能处于强势上涨")
# 等待死叉确认
if k[-1] < d[-1] and k[-2] >= d[-2]:
Log("钝化后死叉,卖出信号")
# 低位钝化
elif all(k_val < 20 for k_val in k_history):
Log("KDJ 低位钝化,可能处于强势下跌")
# 等待金叉确认
if k[-1] > d[-1] and k[-2] <= d[-2]:
Log("钝化后金叉,买入信号")参数优化建议
| 交易周期 | 推荐参数 | 特点 |
|---|---|---|
| 超短线 | (5, 3, 3) | 极其敏感,信号频繁 |
| 短线 | (9, 3, 3) | 标准配置,常用 |
| 中线 | (14, 3, 3) | 较平滑,减少假信号 |
| 长线 | (21, 5, 5) | 平滑,稳定 |
与其他指标配合
KDJ + RSI
python
k, d = TA.STOCH(highs, lows, closes, 9, 3, 0, 3, 0)
rsi = TA.RSI(closes, 14)
# 双重超卖确认
if k[-1] < 20 and rsi[-1] < 30:
Log("KDJ + RSI 双重超卖")KDJ + MACD
python
k, d = TA.STOCH(highs, lows, closes, 9, 3, 0, 3, 0)
macd, signal, hist = TA.MACD(closes, 12, 26, 9)
# KDJ金叉 + MACD金叉
if (k[-1] > d[-1] and k[-2] <= d[-2] and
macd[-1] > signal[-1] and macd[-2] <= signal[-2]):
Log("KDJ + MACD 双金叉")KDJ + BOLL
python
k, d = TA.STOCH(highs, lows, closes, 9, 3, 0, 3, 0)
upper, middle, lower = TA.BOLL(closes, 20, 2)
# 超卖 + 触及下轨
if k[-1] < 20 and closes[-1] <= lower[-1]:
Log("KDJ超卖 + 布林下轨,强支撑")注意事项
⚠️ 重要提醒:
- 钝化现象: 强趋势中 KDJ 会钝化,不要盲目逆势
- 假信号多: 震荡市场中信号较可靠,趋势市场易失效
- J 值波动: J 值比 K、D 更敏感,但也更容易假突破
- 周期选择: 短周期信号多但噪音大,长周期滞后但稳定
- 配合趋势: 最好在趋势背景下使用 KDJ 的超买超卖信号
相关指标
- STOCHF - 快速随机指标 - 更敏感的版本
- STOCHRSI - RSI的随机指标 - RSI的随机化
- WILLR - 威廉指标 - 类似的超买超卖指标