如何在Python中不借助arch库实现MLE估计Vasicek模型参数?
Vasicek模型极大似然估计(MLE)的Python实现修正
原代码核心问题
- 似然函数逻辑错误:误将参数
b(params[1])作为正态分布标准差,实际应使用$\sigma$(params[2]) - 数据构造不符合模型定义:
data的计算未正确对应Vasicek模型的残差形式 - 缺失参数约束:Vasicek模型中均值回复系数$a>0$、波动率$\sigma>0$,无约束优化可能得到无意义结果
- 冗余无效代码:手动计算的
mr、dr_mr等未被后续似然函数调用
修正后的实现方案
1. Vasicek模型离散形式说明
Vasicek模型的离散时间表达式为:
$$r_t - r_{t-1} = a(b - r_{t-1}) + \epsilon_t, \quad \epsilon_t \sim \mathcal{N}(0, \sigma^2)$$
其中:
- $a$:均值回复速率(需大于0)
- $b$:利率长期均值
- $\sigma$:波动率(需大于0)
我们需要最大化所有残差$\epsilon_t$的正态对数密度之和,等价于最小化负对数似然函数。
2. 修正后代码
import numpy as np from scipy.stats import norm from scipy.optimize import minimize # 原始利率数据 r = np.array([0.0025, 0.0025, 0.001 , 0.001 , 0.001 , 0.001 , 0.001 , 0.001, 0.001 , 0.001 , 0.001 , 0.001 , 0.001 , 0.001 , 0.001 , 0.001 , 0.001 , 0.001 , 0.001 , 0.001 , 0.001 , 0.001 , 0.001 , 0.001 , 0.001 , 0.001 , 0.0035, 0.0075, 0.0075, 0.0125, 0.02 , 0.02 , 0.0275, 0.0325, 0.0325, 0.0375]) # 构造滞后一期利率和利率差分序列 r_lag = r[:-1] # 对应r_{t-1} dr = r[1:] - r_lag # 对应r_t - r_{t-1} def neg_log_likelihood(params, dr, r_lag): a, b, sigma = params # 计算Vasicek模型残差 epsilon = dr - a * (b - r_lag) # 返回负对数似然(适配minimize求最小值) return -norm.logpdf(epsilon, loc=0, scale=sigma).sum() # 参数初始值(与Excel Solver保持一致) initial_guess = [0.2, 0.2, 0.2] # 添加参数约束:a>0、sigma>0,保证参数经济意义 constraints = ( {'type': 'ineq', 'fun': lambda x: x[0]}, # a ≥ 0 {'type': 'ineq', 'fun': lambda x: x[2]} # sigma ≥ 0 ) # 执行带约束的优化 result = minimize(neg_log_likelihood, initial_guess, args=(dr, r_lag), constraints=constraints, method='SLSQP') # 输出结果 print("优化结果:") print(f"均值回复速率a: {result.x[0]:.4f}") print(f"长期均值b: {result.x[1]:.4f}") print(f"波动率sigma: {result.x[2]:.4f}") print(f"负对数似然值: {result.fun:.4f}") print(f"优化是否成功: {result.success}")
关键优化点
- 简洁数据构造:直接通过切片生成滞后序列和差分序列,避免原代码中繁琐易出错的删除/插入操作
- 精准似然计算:严格按照Vasicek模型定义计算残差,使用参数中的
sigma作为正态分布标准差 - 参数约束:通过
constraints限制$a$和$\sigma$非负,确保参数符合经济逻辑 - 稳定优化方法:选用
SLSQP方法适配带约束的优化场景,比无约束方法更可靠
内容的提问来源于stack exchange,提问作者Roi Polanitzer
相关产品推荐
相关产品推荐

