依旧是量化系列,之前分享过:
今天分享下做组合时的风险控制。
为什么不能满仓?
一个常见想法时:我都觉得它会涨了,为什么不满仓?
这种思路最大的拦路虎是未来的不确定性,因为任何模型都会错、任何判断都有概率。即使胜率有 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 、风险平价组合,本质上都是围绕"风险预算"而不是"资金预算"来设计的。
分享到这里,期待和大家多多交流。