← 返回编程题库
coding-garch-1-1-multistep-variance-forecast中等免费版2000ms未尝试

GARCH(1,1) 多期方差预测

GARCH(1,1) Multi-Step Variance Forecast

开始编码

某市场风险团队在桌台日 PnL 残差上估了一个 GARCH(1,1) 波动率模型,用来给多期 VaR 引擎、期权定价重校准任务以及季度压力投影提供输入。模型为

σt+12=ω+αεt2+βσt2 \sigma^2_{t+1} = \omega + \alpha\,\varepsilon_t^2 + \beta\,\sigma_t^2

其中 omega >= 0alpha >= 0beta >= 0,eps_t 是 t 期实现残差,sigma2_t 是 t 期条件方差。参数估完、观测到当日残差和当日方差后,需要把方差向未来投影 H 步,作为下游多期 VaR 缩放器的输入。

实现 solution(last_variance: float, last_residual: float, omega: float, alpha_garch: float, beta_garch: float, horizon: int) -> list[float],顺序返回 H 个预测 [sigma2_{t+1}, sigma2_{t+2}, ..., sigma2_{t+H}]

递推分两阶段。对一步预测 (h = 1) 平方残差*已观测*,所以

σt+12=ω+αεt2+βσt2. \sigma^2_{t+1} = \omega + \alpha\,\varepsilon_t^2 + \beta\,\sigma_t^2.

h >= 2,未来的平方残差 eps_{t+h-1}^2 不可观测,但其在 GARCH 模型下的条件期望等于已预测方差 sigma2_{t+h-1}。代入后

σt+h2=ω+(α+β)σt+h12,h2. \sigma^2_{t+h} = \omega + (\alpha + \beta)\,\sigma^2_{t+h-1}, \qquad h \ge 2.

persistence 常数 (alpha + beta) 控制向长期无条件方差 omega / (1 - alpha - beta) 的衰减(当 alpha + beta < 1 时)。当 alpha + beta >= 1 时预测发散;递推保持不变,把(非平稳的)结果原样返回——不要插入平稳性检查。

例如,solution(0.04, 0.1, 0.00001, 0.05, 0.9, 3) 返回 [0.03651, 0.0346945, 0.0329697...]。第 1 步使用观测平方残差 0.01:sigma2_{t+1} = 0.00001 + 0.05*0.01 + 0.9*0.04 = 0.03651。第 2 步换成 (alpha+beta)=0.95 的衰减:sigma2_{t+2} = 0.00001 + 0.95 * 0.03651 = 0.0346945。第 3 步:sigma2_{t+3} = 0.00001 + 0.95 * 0.0346945 ≈ 0.0329697。整个序列几何收敛到长期方差 0.00001 / (1 - 0.95) = 0.0002。再如 solution(0.5, 0.0, 0.1, 0.0, 0.0, 4) 返回 [0.1, 0.1, 0.1, 0.1]——alpha 与 beta 都为 0 时,从第一步起公式直接退化成常数 omega。又 solution(0.04, 0.1, 0.00001, 0.05, 0.9, 0) 返回 []——空 horizon。

三大正确性陷阱。(a) 两阶段公式:eps_t^2 用在每一步(不在 h=2 起切换为 sigma2_{t+h-1})会得到一个仅依赖今日残差的非因果预测——(alpha+beta) 衰减通道完全缺失。(b) 要平方: eps^2 = eps * eps。直接把带符号 eps 代入会得到依赖符号的预测,这与任何 GARCH 变体都不一致(模型由冲击的*幅度*驱动,不是方向)。(c) persistence 系数: 多步递推用 alpha + beta,不是 alpha * beta,也不是单独的 alphabeta。这个几何衰减率才是长 horizon GARCH 预测向长期方差均值回复的关键。

实践背景

GARCH(1,1) 是金融领域最经典的波动率模型:它是教科书式的条件方差递推、外汇/股票波动率建模的默认起点,也是许多多期风险应用的输入层。h=1 预测喂明天的 VaR;完整的 [sigma2_{t+1}, ..., sigma2_{t+H}] 序列喂多期 VaR 缩放、远期格点上的期权定价重校准,以及监管期上的资本投影(例如交易账簿 Basel 的 10 天、月度资本的 21 天)。两阶段公式是生产中最常见的实现 bug:把 omega + alpha*eps^2 + beta*sigma^2 原样塞进循环、没在 h=2 起把 eps^2 替换为 sigma^2,得到的预测会病态地仅依赖一个残差。本题要的就是干净版:一个 O(H) 紧致循环,正确地做条件期望替换。

约束条件

  • 0.0 <= last_variance <= 1.0(当前期条件方差 sigma2_t)
  • -1.0 <= last_residual <= 1.0(当前期残差 eps_t,带符号,但只有平方进入公式)
  • 0.0 <= omega <= 1.0(GARCH 常数;非负保证方差为正)
  • 0.0 <= alpha_garch <= 1.0(eps^2 上的 ARCH 系数)
  • 0.0 <= beta_garch <= 1.0(sigma^2 上的 GARCH 系数)
  • 0 <= horizon <= 60(预测步数 H)
  • 输出为长度恰为 `horizon` 的 `list[float]`,各元素非负方差。
  • alpha_garch + beta_garch 可超过 1(非平稳 GARCH);递推保持不变,预测发散——按原值返回即可。
  • 浮点比较容差:`rel_tol = 1e-9`,`abs_tol = 1e-9`。

样例

Case 1 · statement-example: 3-step decay toward long-run variance

输入: [0.04,0.1,0.00001,0.05,0.9,3]

期望: [0.03651000000000001,0.03469450000000001,0.032969775000000014]

第 1 步用观测平方残差 0.01:0.00001+0.05*0.01+0.9*0.04=0.03651;第 2、3 步用 (alpha+beta)=0.95 衰减,几何收敛到长期方差 0.0002。

Case 2 · statement-example: alpha=beta=0 collapses to constant omega

输入: [0.5,0,0.1,0,0,4]

期望: [0.1,0.1,0.1,0.1]

alpha=beta=0 时第 1 步 eps^2 与 sigma^2 项都为 0,公式直接退化为常数 omega=0.1。

Case 3 · statement-example: empty horizon returns empty list

输入: [0.04,0.1,0.00001,0.05,0.9,0]

期望: []

horizon=0 时不输出任何预测,返回空 list []。

最近提交

还没有提交记录。

编码区

实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。

加载编辑器...
计时0:00

默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。

Case 1 · statement-example: 3-step decay toward long-run variance

输入: [0.04,0.1,0.00001,0.05,0.9,3]

期望: [0.03651000000000001,0.03469450000000001,0.032969775000000014]

第 1 步用观测平方残差 0.01:0.00001+0.05*0.01+0.9*0.04=0.03651;第 2、3 步用 (alpha+beta)=0.95 衰减,几何收敛到长期方差 0.0002。

Case 2 · statement-example: alpha=beta=0 collapses to constant omega

输入: [0.5,0,0.1,0,0,4]

期望: [0.1,0.1,0.1,0.1]

alpha=beta=0 时第 1 步 eps^2 与 sigma^2 项都为 0,公式直接退化为常数 omega=0.1。

Case 3 · statement-example: empty horizon returns empty list

输入: [0.04,0.1,0.00001,0.05,0.9,0]

期望: []

horizon=0 时不输出任何预测,返回空 list []。