GARCH方法——波动率预测与仓位管理
该技能回答了散户从不问、但每家基金每天都会问的问题:投入多少?
它不预测方向。GARCH预测的是波动的幅度——明天的波动有多剧烈,而不是朝哪个方向。向用户展示结果时请务必说明这一点。
三个工具
所有脚本位于 scripts/ 目录下,通过 uv run 运行(依赖通过内联元数据自动解析,无需手动 pip 安装)。
1. garch_forecast.py —— 预测模块
滚动窗口GARCH(1,1),零前瞻偏差(每21天在扩展窗口上重新估计参数;两次重新拟合之间的递归仅使用过去数据进行滚动更新)。
uv run scripts/garch_forecast.py --csv prices.csv --json
uv run scripts/garch_forecast.py --ticker BTC-USD --json
输出:未来1日波动率预测(日度 + 年化)、过去一年波动率百分位数、市场状态(平静 / 正常 / 风暴)。
2. vol_target.py —— 仓位模块
核心思想:仓位 = 目标波动率 / 预测波动率,并在[0.25倍, 2.0倍]区间内截断。
uv run scripts/vol_target.py --csv prices.csv --target-vol 15 --json
输出:仓位乘数。“运行基线策略的0.6倍”——这就是答案。
3. compare.py —— 诚实回测
对同一信号分别运行固定仓位和波动率目标化两种方式,并排显示两条权益曲线及统计指标。内置EMA 9/21交叉示例;可通过 --signals mine.csv 接受任意策略(列:date, signal in {-1,0,1})。
uv run scripts/compare.py --csv prices.csv --target-vol 58 --chart equity.png --json
uv run scripts/compare.py --csv prices.csv --signals mine.csv
输出:两种方式的CAGR、年化波动率、夏普比率、最大回撤、最差月份、最终权益,以及带有风暴区域阴影的权益曲线图。
JSON合约
每个脚本都支持 --json 参数。核心输出结构如下:
{
"as_of": "2026-05-23",
"forecast_vol_annualized_pct": 41.2,
"vol_percentile_1y": 78.0,
"regime": "storm",
"position_size_multiplier": 0.6,
"note": "GARCH forecasts magnitude (volatility), not direction."
}
三种组合模式
A. 仓位覆盖层 —— 嵌入任何现有策略。你的策略决定是否开仓;该技能决定开多少。将策略信号乘以 position_size_multiplier,完成。
B. 风险限速器 —— 独立熔断开关。如果 regime == "storm",则无论信号如何,将所有风险敞口限制在该乘数以内。适用于任何管理仓位的代理。
C. 比较框架 —— 在信任任何策略之前,先通过 compare.py 运行,检查波动率目标化是否改善了该策略的夏普比率/回撤。如果仓位调整没有帮助,则该策略的边际优势可能太弱,无法在实际环境中生存。
与市场方向判断策略(如马尔可夫风格的牛熊分类器)干净组合:它们的输出回答往哪个方向,该技能回答投入多少。两者相乘即可。
默认值与约定
- 加密货币:
--periods-per-year 365(默认)。股票:--periods-per-year 252。 - 目标波动率:15%是合理保守的默认值。为了与无杠杆策略进行风险匹配比较,请设置目标波动率接近该策略本身实现的波动率。
- 数据:yfinance代码(需联网)或任何包含日期和收盘价列的CSV文件——可无缝接入用户已有的任意数据管道。
- 最低历史数据量:首次预测前至少约510个日度观测值。
诚实原则(不可协商)
- 永远不要将GARCH输出呈现为方向预测。
- 报告比较结果时,永远不要隐藏回撤或最差月份数据。
- 如果波动率目标化没有改善用户的策略,请直说——该结果同样有价值。