第八章:风险管理——头寸规模确定与杠杆控制
做交易这么多年,我越来越觉得,风险管理才是量化交易的核心。策略再好,风控一塌糊涂,最后也是白搭。今天咱们聊聊头寸规模、杠杆控制,还有极端行情下怎么保命。
8.1 头寸规模确定:凯利公式与风险平价
头寸规模说白了就是「每次下多少注」。这问题看似简单,其实门道很深。我见过太多人,策略回测漂亮得很,实盘一上来就重仓干,结果一次黑天鹅就爆仓了。
8.1.1 凯利公式
凯利公式是个经典工具。它告诉你,在已知胜率和赔率的情况下,最优的下注比例是多少。
公式长这样:
f* = (bp - q) / b
其中:
- f*:最优下注比例
- b:赔率(盈亏比)
- p:胜率
- q:败率(1 - p)
举个例子。假设你的基差交易策略,胜率60%,盈亏比2:1。那么:
f* = (2 * 0.6 - 0.4) / 2 = 0.4
也就是说,每次应该用40%的资金去下注。
⚠️ 注意:凯利公式有个大坑——它假设你每次下注都是独立事件。但金融市场哪有那么多独立事件?我曾在股指期货跨期套利上用过凯利,结果连续几次亏损后,仓位越加越重,差点出事。
💡 我的建议:实际使用时,我一般取凯利公式结果的1/4到1/2。比如算出来40%,我只用10%-20%。这叫「半凯利」或「四分之一凯利」,稳健得多。
8.1.2 风险平价
风险平价是另一种思路。它不追求收益最大化,而是追求风险均衡分配。
核心思想很简单:让每个资产对组合的风险贡献相等。
举个例子。你有两个策略:
- 策略A:波动率20%
- 策略B:波动率10%
如果按风险平价,策略A的仓位应该是策略B的一半。因为波动率高的,少配点;波动率低的,多配点。
代码实现也不复杂:
import numpy as np
def risk_parity_weights(cov_matrix):
"""
计算风险平价权重
cov_matrix: 协方差矩阵
"""
n = cov_matrix.shape[0]
# 初始化权重
w = np.ones(n) / n
# 迭代求解
for _ in range(100):
# 计算边际风险贡献
mrc = cov_matrix @ w
# 计算风险贡献
rc = w * mrc
# 调整权重
target_rc = np.mean(rc)
w = w * (target_rc / rc)
w = w / np.sum(w)
return w
# 示例
cov = np.array([[0.04, 0.01],
[0.01, 0.01]])
weights = risk_parity_weights(cov)
print(f"风险平价权重: {weights}")
我在做跨品种套利时,经常用风险平价来分配不同品种间的资金。比如螺纹钢和热卷,波动率差异大,用风险平价能避免某个品种过度暴露。
8.2 杠杆控制
杠杆是把双刃剑。用好了,收益翻倍;用不好,一夜归零。
我个人习惯,杠杆率控制在3倍以内。为什么?因为回撤30%时,3倍杠杆就是90%亏损,基本就废了。
杠杆控制有几个要点:
- 动态调整:波动率高了,降杠杆;波动率低了,可以适当加一点
- 硬性上限:设定一个绝对上限,比如5倍,到了就强制减仓
- 回撤触发:当回撤超过一定比例(比如15%),自动降杠杆
⚠️ 我曾经犯过的错:2015年股灾时,我有个跨品种套利策略,平时杠杆也就2倍。但当时觉得机会好,加到了4倍。结果连续两天跌停,根本平不了仓。那次教训太深刻了。现在我的系统里,杠杆超过3倍会自动报警,超过4倍直接强平。
8.3 极端行情下的风控措施
极端行情,说白了就是「黑天鹅」。比如2020年原油暴跌、2022年镍期货逼仓。这些时候,常规风控根本不管用。
我总结了几条保命措施:
- 熔断机制:当价格波动超过一定幅度,暂停交易。比如基差偏离超过3个标准差,自动停止开新仓。
- 压力测试:定期模拟极端行情,看看组合能不能扛住。比如假设所有品种同时跌停,你的保证金够不够?
- 流动性管理:极端行情下,很多品种会失去流动性。我一般会预留20%的现金,专门应对这种情况。
- 止损线:设置硬止损。比如单笔亏损超过5%,自动平仓。别犹豫,犹豫就会败北。
💡 避坑指南:我曾经在极端行情下,因为「再等等看」的心态,错过了最佳止损时机。后来我写了个脚本,当波动率超过历史99%分位数时,自动把止损线收紧一半。效果还不错。
8.4 压力测试
压力测试不是走过场,是真刀真枪地检验你的组合。
怎么做?我一般分三步:
- 历史情景:用过去的大事件来测试。比如2008年金融危机、2015年股灾、2020年疫情。
- 假设情景:自己编一些极端情况。比如「所有品种同时波动5%」、「基差瞬间扩大10倍」。
- 蒙特卡洛模拟:随机生成大量路径,看看最坏情况是什么样。
代码示例:
import numpy as np
def stress_test(portfolio, scenarios):
"""
压力测试
portfolio: 组合权重
scenarios: 情景列表,每个情景是收益率向量
"""
results = []
for scenario in scenarios:
pnl = np.dot(portfolio, scenario)
results.append(pnl)
return results
# 示例:假设三个品种
portfolio = np.array([0.4, 0.3, 0.3])
# 极端情景:三个品种同时下跌5%
scenario1 = np.array([-0.05, -0.05, -0.05])
# 基差极端情景:品种1大跌,品种2大涨
scenario2 = np.array([-0.10, 0.08, -0.02])
results = stress_test(portfolio, [scenario1, scenario2])
print(f"情景1亏损: {results[0]*100:.2f}%")
print(f"情景2亏损: {results[1]*100:.2f}%")
压力测试的结果,我会做成一张表,贴在交易室墙上:
| 情景 | 最大亏损 | 是否触发风控 |
|---|---|---|
| 2008年金融危机 | -18.5% | 是 |
| 2015年股灾 | -12.3% | 是 |
| 2020年疫情 | -8.7% | 否 |
| 假设:所有品种跌停 | -25.0% | 是 |
💡 我的习惯:每个月跑一次压力测试,每次跑完都会调整一下仓位。如果某个情景的亏损超过20%,我就减仓。别等到真出事再后悔。
8.5 本章知识体系
下面这张图,把本章的核心逻辑串起来了:
嗯,风险管理这块,说白了就是「先想好怎么死,再想怎么活」。凯利公式、风险平价、杠杆控制、压力测试,这些工具都是帮你活得更久的。别嫌麻烦,真到极端行情那天,你会感谢今天认真做风控的自己。
公众号:蓝海资料掘金营,微信deep3321