GoForum🌐 V2EX

量化系列:投资组合里的风险控制

matters · 2026-07-02 14:53 · 0 次点赞 · 0 条回复

依旧是量化系列,之前分享过:

小频率动量策略

量化回测优化

今天分享下做组合时的风险控制。

为什么不能满仓?

一个常见想法时:我都觉得它会涨了,为什么不满仓?

这种思路最大的拦路虎是未来的不确定性,因为任何模型都会错、任何判断都有概率。即使胜率有 70%,也意味着还有 30% 的时间会踩坑。

举个例子:

假设你只有一只股票:

  • 涨 20%
  • 或跌 20%

如果你满仓:

100000
↓
80000

要回到 10 万,需要上涨:

100000 / 80000 - 1 = 25%

亏损越大,恢复需要的收益越高。

所以,仓位的本质是在控制未来的不确定性。

回撤比收益更重要

很多人喜欢晒收益曲线。其实另一个指标更值得关注:

最大回撤( Maximum Drawdown )

举个例子:

组合 A

年化收益:25%
最大回撤:-45%

组合 B

年化收益:18%
最大回撤:-8%

如果长期持有,B 反而更有优势。因为:

  • 更容易坚持
  • 更容易加仓
  • 心态不会崩

很多时候,收益决定你赚多少,而回撤决定你还能不能继续玩,后者更基础。所以现在我的组合页面,第一个要点不是收益,而是:

累计收益
↓
最大回撤
↓
波动率

简化的仓位 Demo

我给自己的组合加了一套非常简单的仓位控制,例如:

波动率 最大仓位
<15% 20%
15~25% 12%
>25% 8%

波动越大的资产,占比越小。波动率可以通过历史行情来计算。例如获取某只股票最近一段时间的 K 线:

import requests
import pandas as pd
import numpy as np

API_KEY = "YOUR_API_KEY"

url = "https://quote.alltick.co/quote-b-api/kline"

params = {
    "token": API_KEY,
    "symbol": "AAPL.US",
    "period": "1d",
    "count": 60
}

resp = requests.get(url, params=params)
data = resp.json()["data"]

df = pd.DataFrame(data)

# 收盘价
close = df["close"].astype(float)

# 日收益率
returns = close.pct_change().dropna()

# 年化波动率
volatility = returns.std() * np.sqrt(252)

print(f"Annual Volatility: {volatility:.2%}")

有了波动率之后,就可以动态决定仓位:

def calc_position(volatility):
    if volatility < 0.15:
        return 0.20
    elif volatility < 0.25:
        return 0.12
    else:
        return 0.08

position = calc_position(volatility)

print(f"建议仓位:{position:.0%}")

这当然不是最优算法,但已经比按理所当然的心态靠谱很多。

止损不是认输

止损不是预测未来,而是控制风险。比如我会设定:

单只股票亏损超过 8%

重新评估

注意,是重新评估,而不是机械卖掉。如果基本面没变、只是市场波动,可能继续持有。如果逻辑已经失效,风险越来越大,那就接受亏损,腾出资金寻找更好的机会。

投资最大的成本是,资金一直被错误的仓位占着。

给每一笔投资分配风险预算

我很喜欢一个词:风险预算

以前分配的是资金:

A:30%
B:20%
C:50%

现在更愿意分配的是:允许亏多少钱。比如整个组合最大允许亏损是:2%。那么:

  • 高波动股票仓位自然会更低
  • 低波动 ETF 可以拿更多

这样整个组合不会因为一只股票出现黑天鹅而受到致命影响。

很多量化策略、CTA 、风险平价组合,本质上都是围绕”风险预算”而不是”资金预算”来设计的。

分享到这里,期待和大家多多交流。

0 条回复
添加回复
你还需要 登录 后发表回复

登录后可发帖和回复

登录 注册
主题信息
作者: matters
发布: 2026-07-02
点赞: 0
回复: 0