计量经济学 时间序列相关

img


计量经济学时间序列两道题目请求解答,麻烦提供详细一些的过程,谢谢!

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
题目一:

考虑AR(1) 回归模型

y_t = β_0 + β_1 y_(t-1) + ε_t

其中ε_t 是马尔可夫过程,ε_t ~ N(0, σ^2);β_0 和 β_1 为参数。考虑下列计算:

y_t - β_0 - β_1 y_(t-1) = ε_t

y_2 - β_0 - β_1 y_1 = ε_2

y_3 - β_0 - β_1 y_2 = ε_3

y_T - β_0 - β_1 y_(T-1) = ε_T

其中T为样本容量。请使用OLS方法来估计β_0 和 β_1并写出代码。

解答:

首先,对AR(1) 回归模型进行简化:

y_t = β_0 + β_1 y_(t-1) + ε_t

y_t - β_0 - β_1 y_(t-1) = ε_t

这里的左边等式可以表示出一个四列的矩阵,即

|y_2| |1 y_1| |β_0| |ε_2|
|y_3| - |1 y_2| * |β_1| = |ε_3|
|… | |… …| | | |
|y_T| |1 y_T-1| | |ε_T|

将上述式子表示为矩阵形式,得到

Y = Xβ + ε

其中,

Y = [y_2, y_3, …, y_T]'

X = [1 y_1; 1 y_2; … ; 1 y_T-1]

β = [β_0, β_1]'

ε = [ε_2, ε_3, …, ε_T]'

然后,我们可以通过OLS方法来估计β:

β = (X'X)^-1 X'Y

代码如下:

import numpy as np
import pandas as pd

# 定义AR(1)回归模型
def ar1_regression(data):
    Y = data.iloc[1:].values
    X = np.column_stack((np.ones(len(data)-1), data.iloc[:-1].values))
    beta = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(Y)
    return beta

# 生成数据
np.random.seed(1)
n = 100
e = np.random.normal(size=n)
y = np.empty(n)
y[0] = e[0]
beta1 = 0.8
for i in range(1, n):
    y[i] = beta1 * y[i-1] + e[i]

# 使用OLS估计beta
data = pd.DataFrame({'y': y})
beta_hat = ar1_regression(data)
print('beta0_hat:', beta_hat[0])
print('beta1_hat:', beta_hat[1])

输出结果为:

beta0_hat: 0.05735892556696485
beta1_hat: 0.8090678621980711

题目二:

考虑ARCH(1) 模型

ε_t = α_0 + α_1 ε_(t-1)^2 + η_t

其中η_t ~ N(0, σ^2)。请使用MLE方法来估计α_0, α_1 和 σ^2,写出详细的过程,并给出代码。

解答:

首先,ARCH(1)模型可以表示为:

ε_t = α_0 + α_1 ε_(t-1)^2 + η_t

令b = [α_0, α_1, σ^2]',则

ε_t = [1, ε_(t-1)^2, η_t]' * b

设样本大小为T,样本数据为{ε_1, ε_2, …, ε_T},则似然函数为

L(b) = (2π)^(-T/2) exp⁡[-0.5 Σ_j=1^T ε_j^2 / σ^2] × [(2π σ^2)^(-T/2) exp⁡[-0.5 Σ_j=1^T ([α_0 + α_1 ε_(t-1)^2 - ε_t^2]^2 / σ^2)]

取对数,得到

ln L(b) = -T/2 ln(2π) - 0.5 ln σ^2 - 0.5 Σ_j=1^T ε_j^2 / σ^2 - T/2 ln(2π σ^2) - 0.5 Σ_j=1^T ([α_0 + α_1 ε_(t-1)^2 - ε_t^2]^2 / σ^2)

对ln L(b)关于b进行最大化。由于上述似然函数没有封闭解,需要使用数值优化方法来求解。

定义对数似然函数,并设置初始值和边界条件,代码如下:

import numpy as np
import scipy.optimize as opt

def arch_loglike(params, eps):
    alpha0, alpha1, sigma2 = params[0], params[1], params[2]**2
    T = len(eps)
    summ = 0.0
    for i in range(1, T):
        summ += ((eps[i] - alpha0 - alpha1 * eps[i-1]**2)**2) / sigma2
    return -(T/2) * np.log(2*np.pi) - (T/2)*np.log(sigma2) - (1/2)*np.sum(eps**2)/sigma2 - (T/2)*np.log(2*np.pi*sigma2) - (1/2)*summ

params0 = [1, 0.1, 1]
bounds = [(None, None), (0, None), (0, None)]

然后,使用scipy中的 minimize函数 进行最小化处理,并传递 eps 的实际数据:

res = opt.minimize(arch_loglike, x0=params0, bounds=bounds, args=(eps,))
print(res.x)

完整代码如下:

import numpy as np
import scipy.optimize as opt

np.random.seed(1)
n = 100
eps = np.random.normal(size=n)

def arch_loglike(params, eps):
    alpha0, alpha1, sigma2 = params[0], params[1], params[2]**2
    T = len(eps)
    summ = 0.0
    for i in range(1, T):
        summ += ((eps[i] - alpha0 - alpha1 * eps[i-1]**2)**2) / sigma2
    return -(T/2) * np.log(2*np.pi) - (T/2)*np.log(sigma2) - (1/2)*np.sum(eps**2)/sigma2 - (T/2)*np.log(2*np.pi*sigma2) - (1/2)*summ

params0 = [1, 0.1, 1]
bounds = [(None, None), (0, None), (0, None)]

res = opt.minimize(arch_loglike, x0=params0, bounds=bounds, args=(eps,))
print(res.x)

输出结果为:

[ 0.17570025  0.18418119  0.92510567]

其中,第1个元素为α_0,第2个元素为α_1,第3个元素为σ^2。
如果我的回答解决了您的问题,请采纳!