如何使用SciPy的least_squares实现ARCH模型参数估计
问题原因与解决方法
你遇到的报错和逻辑偏差主要来自两个问题,对应修正方案如下:
1. 解决参数传递报错
scipy.optimize.least_squares的残差函数第一个参数为待优化的参数向量,其他固定参数需要通过args关键字传入,格式为元组。同时注意bounds参数的格式需要分别指定每个参数的上下界,为([参数1下界, 参数2下界...], [参数1上界, 参数2上界...])。
2. 修正残差函数逻辑对齐Matlab实现
你给出的公式存在笔误,实际Matlab代码实现的是一阶自回归逻辑:用t-1期的对数收益率预测t期的取值,即logR_t = u + theta_1 * logR_{t-1} + \epsilon_t,你的Python初始残差函数直接用当期值计算预测值,和实际逻辑不符。
完整可运行代码
import numpy as np from scipy.optimize import least_squares def residuals_ARCH(param, logreturns): u = param[0] theta1 = param[1] # 对齐Matlab逻辑:初始化预测值全为0 y_hat = np.zeros_like(logreturns) # 从第2个样本开始,用前一期收益率计算当期预测值 y_hat[1:] = u + theta1 * logreturns[:-1] # 返回残差,least_squares会自动最小化残差的平方和 return logreturns - y_hat # 假设你的对数收益率数据存储在变量logR中 logR = # 替换为你实际的对数收益率数组 guess = [1, 1] # 传入额外参数logR,指定正确的上下界 result = least_squares( residuals_ARCH, x0=guess, args=(logR,), verbose=1, bounds=([-10, -10], [10, 10]) ) # 提取最优参数、残差、误差值,和Matlab输出对齐 ARCH = {} ARCH['param'] = result.x ARCH['Residuals'] = residuals_ARCH(result.x, logR) ARCH['Error'] = np.abs(ARCH['Residuals'])
内容的提问来源于stack exchange,提问作者Angelo Manna
相关产品推荐
相关产品推荐

