【问题标题】:How to use scipy's least_squares如何使用 scipy 最小平方
【发布时间】:2021-09-13 16:19:33
【问题描述】:

我正在尝试在 Python 中实现一个简单的模型估计。 我有一个 ARCH 模型:

logR_t = u + theta_1 * logR_t + \epsilon_t

logR_t 是我的对数返回向量,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 中的 minimum_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))

感谢大家的帮助

【问题讨论】:

    标签: python-3.x least-squares scipy-optimize


    【解决方案1】:

    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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-04
      • 2020-12-17
      • 2012-10-07
      • 2018-01-30
      • 2015-02-18
      • 1970-01-01
      • 2021-03-31
      相关资源
      最近更新 更多