4、波动率自适应仓位:ATR指标计算、基于ATR的仓位调整、波动率锥与动态缩放
各位,咱们今天聊点硬核的——波动率自适应仓位。
做交易这么多年,我最大的体会就是:市场不是一成不变的。有时候它像一潭死水,有时候又像脱缰的野马。你用同样的仓位去应对,结果往往很惨。我见过太多人,在低波动行情里重仓,结果一个脉冲就被打爆;或者在剧烈波动时轻仓,白白浪费了大行情。
那怎么办?答案就是:让仓位跟着波动率走。波动率大的时候,我们缩仓位;波动率小的时候,我们放仓位。这样,你的风险敞口就能保持相对稳定。
今天,我就把这一整套方法拆开揉碎了讲给你听。
4.1 ATR指标:波动率的“体温计”
要衡量波动率,我们得有个工具。我个人最常用的,就是ATR——平均真实波幅。
ATR是J. Welles Wilder Jr.在1978年提出的。别看它老,但非常实用。它不像标准差那样依赖正态分布假设,而是直接测量价格的实际波动范围。
ATR的计算分三步:
- 计算真实波幅(TR):取以下三个值的最大值
- 当前最高价 - 当前最低价
- |当前最高价 - 前一日收盘价|
- |当前最低价 - 前一日收盘价|
- 计算初始ATR:取前N个TR的简单平均值(通常N=14)
- 计算后续ATR:使用平滑公式:
ATR_t = ( (N-1) * ATR_{t-1} + TR_t ) / N
说白了,ATR就是告诉你:最近这根K线,平均能跑多远。
核心理解:ATR不是方向指标,它只告诉你“振幅有多大”,不告诉你“往哪边振”。这一点非常重要,千万别搞混。
我习惯用14日ATR。为什么是14?其实没有绝对标准。Wilder老爷子当年用14,大家就跟着用了。你完全可以根据自己的交易周期调整——短线用7,中线用14,长线用21或28。
4.2 基于ATR的仓位调整:让风险“标准化”
好,现在我们有ATR了。怎么用它来调整仓位?
核心思路是:让每笔交易的风险金额固定。
举个例子。假设你的账户是10万,你规定每笔交易最多亏2%,也就是2000块。那么,你的仓位大小就取决于“每单位持仓的潜在亏损”。
这个“每单位持仓的潜在亏损”,我们用ATR来衡量。比如,你设置止损为2倍ATR。那么,每买入1手,如果触发止损,你会亏掉2倍ATR的金额。
公式很简单:
仓位(手) = 账户风险金额 / (ATR × 止损倍数 × 每点价值)
其中:
- 账户风险金额:账户总资金 × 单笔风险比例(比如2%)
- ATR:当前标的的14日ATR值
- 止损倍数:你设定的止损宽度(比如2倍ATR)
- 每点价值:价格变动一个点,你的盈亏金额(比如股指期货是300元/点)
你看,当ATR变大时,分母变大,仓位自然就变小了。当ATR变小时,分母变小,仓位就变大。这就是“波动率自适应”的精髓。
我的经验:止损倍数不要设得太小。我曾经试过1倍ATR止损,结果频繁被噪音扫出去。后来改成2倍ATR,效果好了很多。当然,这取决于你的交易周期和标的特性。
4.3 波动率锥:看清“相对位置”
ATR的绝对值有意义,但更有意义的是它的相对位置。
什么意思?就是当前ATR处于历史波动率的什么水平。是偏高?偏低?还是正常?
这就需要用到波动率锥。
波动率锥,说白了就是把不同时间周期的波动率放在一起,画成一个“锥形”的图。横轴是时间周期(比如5日、10日、20日、60日),纵轴是波动率(通常用年化ATR或标准差表示)。
我们来看一个典型的波动率锥结构:
| 周期 | 25分位 | 50分位(中位数) | 75分位 |
|---|---|---|---|
| 5日 | 12% | 18% | 28% |
| 10日 | 14% | 20% | 30% |
| 20日 | 16% | 22% | 32% |
| 60日 | 18% | 24% | 34% |
这个锥形图告诉我们:
- 短期波动率(5日)的分布更分散,范围更宽
- 长期波动率(60日)的分布更集中,范围更窄
- 中位数(50分位)代表“正常”水平
怎么用?很简单。把当前的ATR年化后,放到这个锥形图里,看它落在哪个位置。
- 如果当前ATR处于75分位以上 → 波动率偏高 → 缩仓位
- 如果当前ATR处于25分位以下 → 波动率偏低 → 放仓位
- 如果处于中间 → 正常仓位
注意:波动率锥需要定期更新。我一般每个月重新计算一次。市场结构会变,历史分位数也会变。别拿三年前的锥来套今天的行情,那会出大问题。
4.4 动态缩放:让仓位“活”起来
有了ATR和波动率锥,我们就可以做动态缩放了。
动态缩放的核心逻辑是:根据波动率的相对位置,对基础仓位进行乘数调整。
我常用的缩放规则是这样的:
| 波动率位置 | 缩放系数 | 说明 |
|---|---|---|
| 低于25分位 | 1.5 | 波动率极低,适当放大仓位 |
| 25-50分位 | 1.2 | 波动率偏低,略微放大 |
| 50-75分位 | 1.0 | 正常波动,标准仓位 |
| 75-90分位 | 0.7 | 波动率偏高,适当缩小 |
| 高于90分位 | 0.4 | 波动率极高,大幅缩小 |
最终仓位 = 基础仓位 × 缩放系数
举个例子。假设你的基础仓位是10手,当前ATR处于80分位(偏高),那么缩放系数取0.7,最终仓位就是7手。
你可能会问:这些系数是怎么来的?说实话,没有标准答案。我一开始用的是1.0、0.8、0.6这种等差序列,后来回测发现效果不好,才改成现在这套。你可以根据自己的风险偏好和回测结果来调整。
关键点:动态缩放不是让你频繁调仓。我一般每天收盘后检查一次ATR的分位位置,如果变化不大,就不动。只有跨过阈值时,才调整仓位。别搞成高频交易了。
4.5 完整流程:从计算到执行
好了,我们把所有东西串起来,看看完整的流程是什么样的。
下面这张图,是我自己画的流程图,展示了整个波动率自适应仓位的决策链路:
整个流程,从数据获取到最终仓位计算,一气呵成。你把它写成代码,每天跑一遍,就能自动得到当天的目标仓位。
4.6 代码实现:Python版
光说不练假把式。我给你们写个简单的Python实现,你们可以直接拿去用。
import pandas as pd
import numpy as np
def calculate_atr(df, period=14):
"""计算ATR"""
high = df['high']
low = df['low']
close = df['close']
# 计算TR
tr1 = high - low
tr2 = abs(high - close.shift(1))
tr3 = abs(low - close.shift(1))
tr = pd.concat([tr1, tr2, tr3], axis=1).max(axis=1)
# 计算ATR
atr = tr.rolling(window=period).mean()
return atr
def get_volatility_cone(df, atr, periods=[5, 10, 20, 60]):
"""构建波动率锥"""
cone = {}
for p in periods:
# 年化ATR(假设252个交易日)
annualized_atr = atr.rolling(p).mean() * np.sqrt(252)
cone[p] = {
'25%': annualized_atr.quantile(0.25),
'50%': annualized_atr.quantile(0.50),
'75%': annualized_atr.quantile(0.75)
}
return cone
def get_scaling_factor(current_atr, cone, period=14):
"""根据波动率锥确定缩放系数"""
annualized_atr = current_atr * np.sqrt(252)
if annualized_atr <= cone[period]['25%']:
return 1.5
elif annualized_atr <= cone[period]['50%']:
return 1.2
elif annualized_atr <= cone[period]['75%']:
return 1.0
elif annualized_atr <= cone[period]['90%']:
return 0.7
else:
return 0.4
def calculate_position(account_value, risk_percent, atr, stop_loss_multiple, point_value, scaling_factor):
"""计算最终仓位"""
risk_amount = account_value * risk_percent
base_position = risk_amount / (atr * stop_loss_multiple * point_value)
final_position = base_position * scaling_factor
return final_position
这段代码,你直接复制到你的策略框架里就能用。注意,point_value要根据你的交易品种来设置。
避坑指南:我曾经犯过一个错误——直接用ATR的绝对值来对比波动率锥,没有做年化处理。结果短期和长期的ATR数值差异巨大,根本没法比较。后来才意识到,必须年化后才能放在同一个坐标系里。嗯,这个坑我替你们踩过了。
4.7 实战中的注意事项
最后,说几点实战中的体会:
- ATR不是万能的。它只反映历史波动,不能预测未来。遇到突发黑天鹅,ATR会滞后。所以,我一般会结合VIX指数或期权隐含波动率来做辅助判断。
- 波动率锥要定期更新。市场结构会变,历史分位数也会变。我建议至少每季度重新计算一次。
- 别过度优化。缩放系数、分位阈值这些参数,差不多就行。追求极致精确,反而容易过拟合。记住,交易是艺术,不是科学。
- 心理层面:波动率高的时候缩仓位,很多人会不甘心——明明行情大,却只能小仓位。但你要想明白,高波动意味着高风险,活着比赚钱更重要。
好了,关于波动率自适应仓位,我就讲这么多。这套方法,我用了好几年,效果稳定。希望你们也能从中受益。
公众号:蓝海资料掘金营,微信deep3321