如何使用 scipy 的 least_squares
How to use scipy's least_squares
我正在尝试在 Python 中实现一个简单的模型估计。
我有一个 ARCH 模型:
logR_t = u + theta_1 * logR_t + \epsilon_t
其中 logR_t 是我的 log-returns 向量,u 和 theta_1 是要估计的两个参数,而 \epsilon_t 是我的残差。
在 Matlab 中,我有以下行来调用函数 Error_ARCH 上的优化器。参数的初始猜测为 1,它们的下限为 -10,上限为 10。
ARCH.param = lsqnonlin( @(param) Error_ARCH(param, logR), [1 1], [-10 -10], [10 10]);
[ARCH.Error, ARCH.Residuals] = Error_ARCH( ARCH.param, logR);
要最小化的误差为:
function [error, residuals] = Error_ARCH(param, logreturns)
% Initialisation
y_hat = zeros(length(logreturns), 1 );
% Parameters
u = param(1);
theta1 = param(2);
% Define model
ARCH =@(z) u + theta1.*z;
for i = 2:length(logreturns)
y_hat(i) = ARCH( logreturns(i-1) );
end
error = abs( logreturns - y_hat );
residuals = logreturns - y_hat;
end
我想在 Python 中做类似的事情,但我卡住了,因为我不知道在哪里指定 SciPy 中 least_squares 函数的参数。到目前为止我有:
from scipy.optimize import least_squares
def model(param, z):
"""This is the model we try to estimate equation"""
u = param[0]
theta1 = param[1]
return u + theta1*z
def residuals_ARCH(param, z):
return z - model(param, z)
当我调用 lsq 优化器时,出现错误:
residuals_ARCH() 缺少 1 个必需的位置参数:'z'
guess = [1, 1]
result = least_squares(residuals_ARCH, x0=guess, verbose=1, bounds=(-10, 10))
感谢大家的帮助
least_squares
方法需要一个带有签名 fun(x, *args, **kwargs)
的函数。因此,您可以使用类似于 Matlab 函数句柄的 lambda 表达式:
# logR = your log-returns vector
result = least_squares(lambda param: residuals_ARCH(param, logR), x0=guess, verbose=1, bounds=(-10, 10))
我正在尝试在 Python 中实现一个简单的模型估计。 我有一个 ARCH 模型:
logR_t = u + theta_1 * logR_t + \epsilon_t
其中 logR_t 是我的 log-returns 向量,u 和 theta_1 是要估计的两个参数,而 \epsilon_t 是我的残差。
在 Matlab 中,我有以下行来调用函数 Error_ARCH 上的优化器。参数的初始猜测为 1,它们的下限为 -10,上限为 10。
ARCH.param = lsqnonlin( @(param) Error_ARCH(param, logR), [1 1], [-10 -10], [10 10]);
[ARCH.Error, ARCH.Residuals] = Error_ARCH( ARCH.param, logR);
要最小化的误差为:
function [error, residuals] = Error_ARCH(param, logreturns)
% Initialisation
y_hat = zeros(length(logreturns), 1 );
% Parameters
u = param(1);
theta1 = param(2);
% Define model
ARCH =@(z) u + theta1.*z;
for i = 2:length(logreturns)
y_hat(i) = ARCH( logreturns(i-1) );
end
error = abs( logreturns - y_hat );
residuals = logreturns - y_hat;
end
我想在 Python 中做类似的事情,但我卡住了,因为我不知道在哪里指定 SciPy 中 least_squares 函数的参数。到目前为止我有:
from scipy.optimize import least_squares
def model(param, z):
"""This is the model we try to estimate equation"""
u = param[0]
theta1 = param[1]
return u + theta1*z
def residuals_ARCH(param, z):
return z - model(param, z)
当我调用 lsq 优化器时,出现错误: residuals_ARCH() 缺少 1 个必需的位置参数:'z'
guess = [1, 1]
result = least_squares(residuals_ARCH, x0=guess, verbose=1, bounds=(-10, 10))
感谢大家的帮助
least_squares
方法需要一个带有签名 fun(x, *args, **kwargs)
的函数。因此,您可以使用类似于 Matlab 函数句柄的 lambda 表达式:
# logR = your log-returns vector
result = least_squares(lambda param: residuals_ARCH(param, logR), x0=guess, verbose=1, bounds=(-10, 10))