第三章:趋势识别与量化
道氏理论:趋势的原始定义
聊趋势,绕不开道氏理论。这是所有趋势跟踪策略的祖宗。
道氏理论的核心其实就三句话:趋势分三级(主要、次级、小型),趋势需要确认(指数之间要互相验证),趋势会持续直到反转信号出现。听起来简单吧?但我在实盘里见过太多人栽在「确认」这一步上。
举个例子。2018年比特币从2万跌到3000,很多人看到日线反弹就喊「牛市回来了」。结果呢?周线级别明明还在创新低。这就是典型的周期错配——用次级趋势去对抗主要趋势。
核心要点:
- 主要趋势:持续时间超过1年,幅度超过20%
- 次级趋势:持续3周-3个月,幅度为主要趋势的1/3-2/3
- 小型趋势:持续不超过3周,容易被操纵
我个人习惯,做趋势跟踪只关注主要趋势。次级趋势用来找入场点,小型趋势?直接忽略。你想想看,如果连周线级别的方向都没定,盯着15分钟K线做单,那不是给自己找麻烦吗?
移动平均线系统:趋势的量化工具
道氏理论是定性分析,移动平均线就是定量工具。说白了,就是把「趋势」这个模糊概念,变成一条可以计算的线。
我常用的均线系统分三套:
| 系统 | 参数 | 适用场景 |
|---|---|---|
| 短期系统 | MA5, MA10, MA20 | 日内交易、短线波段 |
| 中期系统 | MA20, MA60, MA120 | 趋势跟踪、中线持仓 |
| 长期系统 | MA120, MA250, MA500 | 大周期判断、资产配置 |
这里有个坑,我踩过。均线参数不是越复杂越好。我曾经搞过一套7条均线的系统,看起来很美,实际上一进场就晕——每条线都在交叉,根本不知道信哪条。
我的经验:趋势行情用EMA(指数移动平均),震荡行情用SMA(简单移动平均)。为什么?EMA对价格变化更敏感,趋势里能早一步跟上;SMA更平滑,震荡里不容易被假突破骗线。
代码实现其实很简单。以Python为例:
import pandas as pd
import numpy as np
def calculate_ma(data, window):
"""计算移动平均线"""
return data['close'].rolling(window=window).mean()
def calculate_ema(data, window):
"""计算指数移动平均线"""
return data['close'].ewm(span=window, adjust=False).mean()
# 实战用法:金叉死叉信号
data['MA20'] = calculate_ma(data, 20)
data['MA60'] = calculate_ma(data, 60)
# 金叉:MA20上穿MA60
data['golden_cross'] = (data['MA20'] > data['MA60']) & (data['MA20'].shift(1) <= data['MA60'].shift(1))
# 死叉:MA20下穿MA60
data['death_cross'] = (data['MA20'] < data['MA60']) & (data['MA20'].shift(1) >= data['MA60'].shift(1))
嗯,这里要注意。金叉死叉在震荡行情里就是灾难。我统计过,在横盘区间里,金叉死叉的成功率不到40%。所以千万别无脑用。
ADX趋势强度指标
均线告诉你方向,ADX告诉你这个方向靠不靠谱。
ADX全称是Average Directional Index,平均趋向指数。取值范围0-100,一般这么看:
- ADX < 20:弱趋势,震荡行情
- ADX 20-40:中等趋势,可以操作
- ADX > 40:强趋势,但小心超买超卖
- ADX > 60:极端行情,随时可能反转
我曾经在2020年原油期货上吃过亏。当时ADX飙到70以上,我以为趋势会继续,追了进去。结果第二天直接暴跌20%。后来复盘才明白——ADX太高的时候,趋势已经走到末期了,这时候进场就是接盘侠。
避坑指南:ADX本身不指示方向,只指示强度。很多人只看ADX数值就做单,这是错的。必须配合+DI和-DI来判断方向。我曾经犯过这个错,亏了不少钱。
ADX的计算稍微复杂一点,但核心逻辑很清晰:
def calculate_adx(data, period=14):
"""计算ADX指标"""
high = data['high']
low = data['low']
close = data['close']
# 计算方向变动
up_move = high - high.shift(1)
down_move = low.shift(1) - low
# +DM和-DM
plus_dm = np.where((up_move > down_move) & (up_move > 0), up_move, 0)
minus_dm = np.where((down_move > up_move) & (down_move > 0), down_move, 0)
# 计算TR(真实波幅)
tr = np.maximum(high - low,
np.abs(high - close.shift(1)),
np.abs(low - close.shift(1)))
# 平滑处理
atr = pd.Series(tr).rolling(period).mean()
plus_di = 100 * pd.Series(plus_dm).rolling(period).mean() / atr
minus_di = 100 * pd.Series(minus_dm).rolling(period).mean() / atr
# 计算DX和ADX
dx = 100 * np.abs(plus_di - minus_di) / (plus_di + minus_di)
adx = pd.Series(dx).rolling(period).mean()
return adx, plus_di, minus_di
实战中,我一般这么用ADX:
- ADX从低位(<20)向上突破20,说明趋势正在形成
- ADX在20-40之间,配合+DI/-DI交叉做单
- ADX超过50,开始减仓,准备止盈
- ADX从高位回落,说明趋势可能结束
说白了,ADX就是趋势的「油门表」。油门踩到底的时候,虽然速度快,但也离翻车不远了。
三者的实战组合
单独用任何一个指标,效果都有限。我习惯把三者结合起来:
我的交易框架:
- 第一步:用道氏理论判断主要趋势方向(周线级别)
- 第二步:用均线系统确认当前处于趋势的哪个阶段(日线级别)
- 第三步:用ADX判断趋势强度,决定仓位大小
举个例子。假设周线级别是上升趋势(道氏理论),日线MA20在MA60之上(均线多头排列),ADX在30左右且向上(趋势中等偏强)。这时候我会考虑做多,仓位可以放到正常水平的80%。
反过来,如果周线上升,但日线均线纠缠,ADX低于20。说明大方向向上,但短期没动能。这时候我会等,或者只做小仓位试探。
这套框架我用了好几年,最大的好处是过滤掉了大部分假信号。三个指标同时共振的时候,胜率明显提升。
这张图就是我日常用的框架。从上到下,层层过滤。不符合条件的信号,直接放弃。宁可错过,不要做错——这句话在趋势交易里尤其重要。
最后说一句:任何指标都有滞后性。移动平均线滞后,ADX也滞后。但滞后不是问题,问题是你能不能接受滞后。趋势跟踪本身就是吃「滞后」这碗饭的——我们放弃鱼头鱼尾,只吃鱼身。