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的计算步骤
- 计算RSV值(未成熟随机值)
- 用RSV计算K值(K = 2/3 * 前K + 1/3 * RSV)
- 用K值计算D值(D = 2/3 * 前D + 1/3 * K)
- 计算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 本章知识体系
下面这张图,是我自己梳理的本章知识结构。你看一眼,就能明白这三个指标之间的关系。
好了,技术指标因子这部分就讲完了。布林带、KDJ和OBV这三个指标,你可以在自己的策略里试试看。记住,没有万能的指标,只有合理的组合。多试试,多总结,慢慢就能找到适合自己的那套打法。