另一类时间序列模型为“移动平均过程”(Moving Average Process,简记 MA)。记一阶移动平均过程为 MA(1):
yt=μ+εt+θεt−1其中,{εt} 为白噪声,而 εt 的系数被标准化为1。由于 yt 可以被看成是白噪声的移动平均,故得名。考虑使用条件 MLE 估计。为此,假设 {εt} 为独立同分布且服从正态分布 N(0,σ2ε)。如果已经知道 {εt−1} ,则
yt|εt−1∼N(μ+θεt−1,σ2ε)假设 ε0=0,则可以知道 ε1=y1−μ。给定 ε1,则可以知道 ε2=y2−μ−θε1。以此类推,则可以使用递推公式“εt=yt−μ−θεt−1”计算出全部 {ε1,ε2,⋯,εT}。这样,在给定 ε0=0 的条件下,就可以写下样本数据 {y1,y2,⋯,yT} 的似然函数,然后使用数值方法求解其最大化问题。
更一般地,对于 q 阶移动平均过程,记为 MA(q):
yt=μ+εt+θ1εt−1+θ2εt−2+⋯+θqεt−q
也可以进行条件 MLE 估计,即在给定“ε0=ε−1=⋯=ε−q+1=0”的条件下,最大化样本数据的似然函数。
yt=μ+εt+θεt−1
y1=μ+ε1+θε0=μ+ε1 ⇒ε1=y1−μ ⇒y1∼N(μ,σ2ε)
y2=μ+ε2+θε1=(1−θ)μ+θy1+ε2 ⇒ε2= y2−θy1−(1−θ)μ ⇒y2∼N((1−θ)μ+θy1,σ2ε)
以此类推:y3∼N((1−θ+θ2)μ+θy2−θ2y1,σ2ε)
因此:
f(y1)=1√2πσ2εe−(y1−μ)22σ2ε,fy2|y1(y2|y1)=1√2πσ2εe−(y2−(1−θ)μ−θ1)22σ2ε其中:c1=1−θ+θ2−θ3+......; c2=θy(t−1)−θ2y(t−2)+θ3y(t−3)+......
from statsmodels.tsa.arima_model import ARMA
import pandas as pd
data = pd.read_excel('../数据/上证指数与沪深300.xlsx')
res = ARMA(data['sz'], order=(0,1)).fit()
res.summary()
Dep. Variable: | sz | No. Observations: | 460 |
---|---|---|---|
Model: | ARMA(0, 1) | Log Likelihood | -2897.310 |
Method: | css-mle | S.D. of innovations | 131.267 |
Date: | Fri, 29 May 2020 | AIC | 5800.620 |
Time: | 19:15:02 | BIC | 5813.013 |
Sample: | 0 | HQIC | 5805.500 |
coef | std err | z | P>|z| | [0.025 | 0.975] | |
---|---|---|---|---|---|---|
const | 2930.6519 | 11.858 | 247.141 | 0.000 | 2907.410 | 2953.894 |
ma.L1.sz | 0.9396 | 0.013 | 73.789 | 0.000 | 0.915 | 0.965 |
Real | Imaginary | Modulus | Frequency | |
---|---|---|---|---|
MA.1 | -1.0643 | +0.0000j | 1.0643 | 0.5000 |
MAlnL.m
function lnL = MAlnL(Beta,Y)
%Beta(1) = u ;Beta(2) = sita;Beta(3) = sigma2;
T = length(Y);
lnL1 = -0.5*log(2*pi)-0.5*log(Beta(3)^2)-(Y(1)-Beta(1))^2/(2*Beta(3)^2)-0.5*log(2*pi)*(T-1)-0.5*(T-1)*log(Beta(3)^2);
for i = 2:T
for j = 1:i
c11(j) = (-Beta(2))^(j-1);
end
c1 = sum(c11)*Beta(1);
for j = 1:i-1
c22(j) = Y(i-j)*(Beta(2)^j)*(-1)^(j+1);
end
c2 = sum(c22);
lnL2(i) = (Y(i)- c1 - c2)^2;
end
lnL = lnL1-0.5*sum(lnL2)/Beta(3)^2;
lnL = -lnL;
% %导入数据
% data = xlsread('../数据/上证指数与沪深300.xlsx');
% f1 = data(:,1); f2 = data(:,2);
%
% % 2.初始参数设定
% maxsize = 2000; % 生成均匀随机数的个数(用于赋初值)
% REP = 100; % 若发散则继续进行迭代的次数
% nInitialVectors = [maxsize, 3]; % 生成随机数向量
% MaxFunEvals = 5000; % 函数评价的最大次数
% MaxIter = 5000; % 允许迭代的最大次数
% options = optimset('LargeScale', 'off','HessUpdate', 'dfp','MaxFunEvals', ...
% MaxFunEvals, 'display', 'on', 'MaxIter', MaxIter, 'TolFun', 1e-6, 'TolX', 1e-6,'TolCon',10^-12);
%
% % 3.寻找最优初值
% initialTargetVectors = unifrnd(0,10, nInitialVectors);
% RQfval = zeros(nInitialVectors(1), 1);
% for i = 1:nInitialVectors(1)
% RQfval(i) = MAlnL (initialTargetVectors(i,:), f1);
% end
% Results = [RQfval, initialTargetVectors];
% SortedResults = sortrows(Results,1);
% BestInitialCond = SortedResults(1,2: size(Results,2));
%
% % 4.迭代求出最优估计值Beta
% [Beta, fval exitflag] = fminsearch(' MAlnL ', BestInitialCond,options,f1);
% for it = 1:REP
% if exitflag == 1, break, end
% [Beta, fval exitflag] = fminsearch(' MAlnL ', BestInitialCond,options,f1);
% end
% if exitflag~=1, warning('警告:迭代并没有完成'), end