第八章:风险管理——头寸规模确定与杠杆控制

做交易这么多年,我越来越觉得,风险管理才是量化交易的核心。策略再好,风控一塌糊涂,最后也是白搭。今天咱们聊聊头寸规模、杠杆控制,还有极端行情下怎么保命。

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年镍期货逼仓。这些时候,常规风控根本不管用。

我总结了几条保命措施:

  1. 熔断机制:当价格波动超过一定幅度,暂停交易。比如基差偏离超过3个标准差,自动停止开新仓。
  2. 压力测试:定期模拟极端行情,看看组合能不能扛住。比如假设所有品种同时跌停,你的保证金够不够?
  3. 流动性管理:极端行情下,很多品种会失去流动性。我一般会预留20%的现金,专门应对这种情况。
  4. 止损线:设置硬止损。比如单笔亏损超过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