风险度量基础:波动率、最大回撤、VaR
各位同学,咱们今天聊点实在的。
做量化交易,说白了就是在跟风险打交道。你策略再牛,回测曲线再漂亮,如果不懂怎么度量风险,那就像闭着眼开车——早晚要出事。我见过太多人,策略跑得好好的,突然一波回撤直接爆仓。嗯,这里面的核心问题,就是没把风险度量清楚。
今天这一章,咱们就扎扎实实地把三个最基础、最核心的风险度量指标讲透:波动率、最大回撤、VaR(在险价值)。这三个东西,你搞懂了,资金管理就算入门了。
核心观点:风险度量不是用来吓唬自己的,而是用来指导仓位和止损的。没有度量,就没有管理。
一、波动率:市场的脾气有多大
波动率,说白了就是资产价格上下跳动的剧烈程度。你想想看,一只股票一天涨跌1%,另一只一天涨跌5%,哪个风险大?显然是后者。波动率就是量化这个「脾气」的指标。
我个人习惯用年化波动率来做横向比较。怎么算?其实很简单:
import numpy as np
import pandas as pd
# 假设你有一串日收益率数据
returns = pd.Series([0.01, -0.005, 0.02, -0.01, 0.015])
# 日波动率 = 收益率的标准差
daily_vol = returns.std()
# 年化波动率(假设252个交易日)
annual_vol = daily_vol * np.sqrt(252)
print(f"日波动率: {daily_vol:.4f}")
print(f"年化波动率: {annual_vol:.4f}")
小提示:年化时乘以根号252,这是金融行业的惯例。但如果你做的是加密货币,一年365天都在交易,那就用根号365。别搞混了。
我在项目中遇到过一件事:有个策略回测时年化波动率只有15%,看起来挺稳。结果实盘一跑,波动率飙到40%。后来一查,原来是回测数据里漏掉了几个黑天鹅事件。嗯,这里要注意——历史波动率永远无法完全代表未来。
波动率还有一个重要特性叫波动率聚类。什么意思?就是大波动后面往往跟着大波动,小波动后面跟着小波动。市场就是这样,要么一直风平浪静,要么突然狂风暴雨。做仓位管理时,这个特性一定要考虑进去。
二、最大回撤:你能扛住多大的坑
最大回撤,这个词听起来有点吓人。它衡量的是:从历史最高点跌到最低点,你最多亏了多少。
举个例子。你账户净值从100万涨到200万,然后跌到120万,又涨到180万。这个过程中,从200万跌到120万,回撤了40%。这就是最大回撤。
计算起来也不复杂:
def max_drawdown(equity_curve):
"""
计算最大回撤
equity_curve: 净值序列
"""
# 计算历史最高点
rolling_max = equity_curve.cummax()
# 计算回撤
drawdown = (equity_curve - rolling_max) / rolling_max
# 最大回撤
max_dd = drawdown.min()
return max_dd, drawdown
# 示例
equity = pd.Series([100, 110, 105, 120, 115, 130, 125, 110, 140])
max_dd, dd_series = max_drawdown(equity)
print(f"最大回撤: {max_dd:.2%}")
避坑指南:我曾经见过有人把最大回撤算成正值,然后到处吹嘘「我的策略最大回撤只有5%」。结果一看代码,他忘了取负号。最大回撤永远是负数或零,代表亏损幅度。正的回撤?那叫收益。
最大回撤这个指标,我个人觉得比波动率更「接地气」。为什么?因为波动率是数学上的标准差,普通人不太有感觉。但最大回撤直接告诉你:你最多会亏多少钱。这才是真金白银的痛感。
不过要注意,最大回撤有一个致命缺陷——它只取一个点。就是历史上最惨的那一次。如果策略跑了10年,最大回撤发生在第1年,后面9年都很稳,那这个指标其实有点「过时」了。所以很多专业机构会同时看回撤持续时间和Calmar比率(年化收益除以最大回撤绝对值)。
三、VaR(在险价值):今天最多亏多少?
VaR,全称Value at Risk,中文叫在险价值。这玩意儿是银行和金融机构最常用的风险指标之一。
它的定义很直白:在给定的置信水平下,未来一段时间内可能的最大损失。
举个例子:95%置信水平下,日VaR为2%。意思是:有95%的把握,明天亏损不会超过2%。那剩下的5%呢?嗯,那就是「黑天鹅」区域,VaR管不了。
计算VaR有三种主流方法:
| 方法 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| 参数法(方差-协方差法) | 假设收益率服从正态分布 | 计算快,简单 | 金融数据往往厚尾,正态假设不成立 |
| 历史模拟法 | 直接用历史数据的分位数 | 无需假设分布 | 依赖历史数据,无法预测新情况 |
| 蒙特卡洛模拟 | 随机生成大量路径 | 灵活,可处理复杂情况 | 计算量大,模型风险 |
来看看代码实现:
# 历史模拟法计算VaR
def historical_var(returns, confidence_level=0.95):
"""
历史模拟法计算VaR
"""
# 按收益率从小到大排序
sorted_returns = returns.sort_values()
# 找到对应分位数的值
var = sorted_returns.quantile(1 - confidence_level)
return var
# 参数法计算VaR
def parametric_var(returns, confidence_level=0.95):
"""
参数法计算VaR(假设正态分布)
"""
from scipy.stats import norm
mu = returns.mean()
sigma = returns.std()
# 正态分布的分位数
z = norm.ppf(1 - confidence_level)
var = mu + z * sigma
return var
# 示例
daily_returns = pd.Series(np.random.randn(1000) * 0.02)
var_hist = historical_var(daily_returns, 0.95)
var_param = parametric_var(daily_returns, 0.95)
print(f"历史模拟法VaR(95%): {var_hist:.4f}")
print(f"参数法VaR(95%): {var_param:.4f}")
个人经验:我一般会用历史模拟法作为基准,然后用参数法做个对比。如果两者差异很大,说明收益率分布可能不是正态的,这时候就要小心了。另外,VaR的置信水平不要选99.9%这种极端值,数据量不够的话,那个分位数估计会很不稳定。
VaR有个很大的问题——它只告诉你「最多亏这么多」,但不告诉你「亏超过这个数的时候,到底会亏多少」。比如95% VaR是2%,那剩下的5%里,可能亏2.1%,也可能亏20%。这个缺口,后来有人用CVaR(条件在险价值)来补,咱们后面章节会讲到。
四、三个指标怎么配合使用?
好了,三个指标都讲完了。你可能会问:那我到底该用哪个?
我的答案是:全都要。
- 波动率告诉你市场的「日常脾气」,用来做仓位大小的参考。
- 最大回撤告诉你最坏情况下的「历史坑深」,用来设止损和心理准备。
- VaR告诉你「明天大概率亏多少」,用来做每日风险预算。
这三个指标放在一起,才能拼出一个完整的风险画像。单看任何一个,都容易出问题。
我记得有一次帮一个私募做风控体系,他们之前只看最大回撤,结果波动率突然放大,VaR飙升,但最大回撤还没创出新高。等回撤创出新高的时候,已经亏了20%了。这就是典型的「指标滞后」问题。后来我把三个指标做成一个仪表盘,每天监控,情况就好多了。
核心总结:波动率看日常波动,最大回撤看历史极限,VaR看概率损失。三者互补,缺一不可。
好了,这一章的内容就到这里。代码部分我建议你亲自跑一遍,把数据换成自己的策略回测结果,看看这三个指标分别是多少。只有亲手算过,才能真正理解它们的含义。