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

matters 2026-07-02 14:49 1

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


小频率动量策略


量化回测优化


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


为什么不能满仓?


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


这种思路最大的拦路虎是未来的不确定性,因为任何模型都会错、任何判断都有概率。即使胜率有 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)
    没有回复
* 帖子来源V2EX
返回