4. 技术指标因子(下):布林带、KDJ、OBV

好,咱们接着聊技术指标因子。上一节讲了均线和MACD,这一节我把剩下的三个常用指标——布林带、KDJ和OBV——一次性讲透。

这三个指标各有各的脾气。布林带告诉你价格是否“出轨”,KDJ帮你抓短期拐点,OBV则反映资金的态度。我个人习惯把它们组合起来用,效果比单打独斗好得多。

4.1 布林带(Bollinger Bands)

布林带这东西,说白了就是给价格画了个“通道”。中间是一条均线,上下两条线是均线加减两倍标准差。价格在通道里晃悠,一旦冲出上下轨,往往意味着行情要变。

核心逻辑:布林带收窄时,说明市场在蓄力;布林带张口时,趋势可能加速。

我在项目中遇到过这样的情况:某只股票布林带收得特别窄,像被压紧的弹簧。我当时判断可能要变盘,结果第二天直接跳空高开,布林带瞬间张开。嗯,这就是典型的“缩口-张口”形态。

4.1.1 布林带的Python实现

import pandas as pd
import numpy as np

def bollinger_bands(df, window=20, num_std=2):
    """
    计算布林带
    df: 包含'close'列的DataFrame
    window: 均线周期,默认20
    num_std: 标准差倍数,默认2
    """
    df = df.copy()
    df['MA'] = df['close'].rolling(window=window).mean()
    df['STD'] = df['close'].rolling(window=window).std()
    df['Upper'] = df['MA'] + num_std * df['STD']
    df['Lower'] = df['MA'] - num_std * df['STD']
    df['Bandwidth'] = (df['Upper'] - df['Lower']) / df['MA']  # 带宽指标
    return df

# 示例用法
# df = bollinger_bands(data)
# 当收盘价突破上轨,可能是超买信号
# 当收盘价跌破下轨,可能是超卖信号

我的小技巧:布林带的带宽(Bandwidth)是个被很多人忽略的好指标。带宽小于0.1时,往往意味着变盘在即。我曾经用这个指标提前捕捉到过几次大行情。

4.2 随机指标(KDJ)

KDJ,也叫随机指标。它跟RSI有点像,都是判断超买超卖的。但KDJ更灵敏,尤其适合震荡行情。

KDJ有三条线:K线、D线和J线。K线是快线,D线是慢线,J线是K线和D线的差值放大版。你想想看,当J线冲到100以上,基本就是超买区了;跌到0以下,那就是超卖区。

4.2.1 KDJ的计算步骤

  1. 计算RSV值(未成熟随机值)
  2. 用RSV计算K值(K = 2/3 * 前K + 1/3 * RSV)
  3. 用K值计算D值(D = 2/3 * 前D + 1/3 * K)
  4. 计算J值(J = 3 * K - 2 * D)
def kdj(df, n=9, m1=3, m2=3):
    """
    计算KDJ指标
    n: RSV计算周期,默认9
    m1: K值平滑参数,默认3
    m2: D值平滑参数,默认3
    """
    df = df.copy()
    low_n = df['low'].rolling(window=n).min()
    high_n = df['high'].rolling(window=n).max()
    
    # RSV = (收盘价 - 最低价) / (最高价 - 最低价) * 100
    rsv = (df['close'] - low_n) / (high_n - low_n) * 100
    
    # 初始化K、D值
    k = pd.Series(50.0, index=df.index)
    d = pd.Series(50.0, index=df.index)
    
    for i in range(n, len(df)):
        k.iloc[i] = (2/3) * k.iloc[i-1] + (1/3) * rsv.iloc[i]
        d.iloc[i] = (2/3) * d.iloc[i-1] + (1/3) * k.iloc[i]
    
    df['K'] = k
    df['D'] = d
    df['J'] = 3 * k - 2 * d
    return df

# 使用建议:
# K线向上突破D线 → 金叉,买入信号
# K线向下跌破D线 → 死叉,卖出信号

避坑指南:我曾经在单边上涨行情里死磕KDJ的金叉死叉,结果被反复打脸。记住,KDJ在震荡市里好用,但在强趋势行情里容易失效。别问我怎么知道的...

4.3 成交量指标(OBV)

OBV,全称是On-Balance Volume,中文叫能量潮。它把成交量和价格结合起来,看资金到底是在流入还是流出。

逻辑很简单:如果今天收盘价比昨天高,就把今天的成交量加到OBV上;如果跌了,就减掉。OBV上升,说明资金在流入;OBV下降,说明资金在流出。

4.3.1 OBV的Python实现

def obv(df):
    """
    计算OBV指标
    df: 包含'close'和'volume'列的DataFrame
    """
    df = df.copy()
    df['OBV'] = 0
    
    # 第一天OBV设为0
    obv_values = [0]
    
    for i in range(1, len(df)):
        if df['close'].iloc[i] > df['close'].iloc[i-1]:
            obv_values.append(obv_values[-1] + df['volume'].iloc[i])
        elif df['close'].iloc[i] < df['close'].iloc[i-1]:
            obv_values.append(obv_values[-1] - df['volume'].iloc[i])
        else:
            obv_values.append(obv_values[-1])
    
    df['OBV'] = obv_values
    # 计算OBV的移动平均线,用于判断趋势
    df['OBV_MA'] = df['OBV'].rolling(window=20).mean()
    return df

# 实战用法:
# OBV创新高,但价格没创新高 → 量价背离,可能上涨
# OBV创新低,但价格没创新低 → 量价背离,可能下跌

我的经验:OBV最妙的地方在于判断“量价背离”。我记得有一次,某只股票价格横盘不动,但OBV却在悄悄往上走。我当时就觉得不对劲,果然一周后股价开始拉升。说白了,OBV就是资金的“脚印”。

4.4 三个指标的组合使用

单独用任何一个指标,都容易出错。我习惯把布林带、KDJ和OBV组合起来看,形成一套完整的判断体系。

指标组合 买入信号 卖出信号
布林带 + KDJ 价格触及下轨 + KDJ金叉 价格触及上轨 + KDJ死叉
布林带 + OBV 价格在下轨 + OBV上升 价格在上轨 + OBV下降
KDJ + OBV KDJ金叉 + OBV创新高 KDJ死叉 + OBV创新低

你想想看,当布林带下轨、KDJ金叉和OBV上升三个信号同时出现时,胜率是不是高了很多?这就是多因子择时的核心思想——用多个维度去验证同一个判断。

4.5 本章知识体系

下面这张图,是我自己梳理的本章知识结构。你看一眼,就能明白这三个指标之间的关系。

技术指标因子(下)知识体系 布林带 (Bollinger) 随机指标 (KDJ) 能量潮 (OBV) 上轨/下轨 带宽指标 缩口→变盘 K线/D线 J线 金叉/死叉 超买/超卖判断 资金流向 量价背离 OBV趋势线 组合使用:多维度验证,提高胜率 布林带判断位置 + KDJ判断拐点 + OBV判断资金 三个指标各有侧重,组合使用才能发挥最大威力 💡 实战建议:震荡市用KDJ,趋势市用布林带,资金面看OBV

好了,技术指标因子这部分就讲完了。布林带、KDJ和OBV这三个指标,你可以在自己的策略里试试看。记住,没有万能的指标,只有合理的组合。多试试,多总结,慢慢就能找到适合自己的那套打法。

专注资料整理