Pharos
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)

参数

参数名类型必选默认值说明
highany-最高价数组
lowany-最低价数组
closeany-收盘价数组
fastk_periodany-FastK 周期,默认 5
slowk_periodany-SlowK 平滑周期,默认 3
slowk_matypeany-SlowK 移动平均类型,默认 0 (SMA)
slowd_periodany-SlowD 周期,默认 3
slowd_matypeany-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超卖 + 布林下轨,强支撑")

注意事项

⚠️ 重要提醒

  1. 钝化现象: 强趋势中 KDJ 会钝化,不要盲目逆势
  2. 假信号多: 震荡市场中信号较可靠,趋势市场易失效
  3. J 值波动: J 值比 K、D 更敏感,但也更容易假突破
  4. 周期选择: 短周期信号多但噪音大,长周期滞后但稳定
  5. 配合趋势: 最好在趋势背景下使用 KDJ 的超买超卖信号

相关指标

返回目录

← 返回动量指标目录