{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 移动平均(MA)模型" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 原理讲解" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 模型介绍\n", "\n", "另一类时间序列模型为“移动平均过程”(Moving Average Process,简记 MA)。记一阶移动平均过程为 MA(1):\n", "\n", "$$y_{t}=\\mu+\\varepsilon_{t}+\\theta \\varepsilon_{t-1}\\tag{1}$$\n", "\n", "其中,{$\\varepsilon_{t}$} 为白噪声,而 $\\varepsilon_{t}$ 的系数被标准化为1。由于 $y_t$ 可以被看成是白噪声的移动平均,故得名。考虑使用条件 MLE 估计。为此,假设 {$\\varepsilon_{t}$} 为独立同分布且服从正态分布 $N\\left(0, \\sigma_{\\varepsilon}^{2}\\right)$。如果已经知道 {$\\varepsilon_{t-1}$} ,则\n", "\n", "$$y_{t} | \\varepsilon_{t-1} \\sim N\\left(\\mu+\\theta \\varepsilon_{t-1}, \\sigma_{\\varepsilon}^{2}\\right)\\tag{2}$$\n", "\n", "假设 $\\varepsilon_0=0$,则可以知道 $\\varepsilon_{1}=y_{1}-\\mu$。给定 $\\varepsilon_{1}$,则可以知道 $\\varepsilon_{2}=y_{2}-\\mu-\\theta \\varepsilon_{1}$。以此类推,则可以使用递推公式“$\\varepsilon_{t}=y_{t}-\\mu-\\theta \\varepsilon_{t-1}$”计算出全部 $\\left\\{\\varepsilon_{1}, \\varepsilon_{2}, \\cdots, \\varepsilon_{T}\\right\\}$。这样,在给定 $\\varepsilon_0=0$ 的条件下,就可以写下样本数据 $\\left\\{y_{1}, y_{2}, \\cdots, y_{T}\\right\\}$ 的似然函数,然后使用数值方法求解其最大化问题。\n", "\n", "更一般地,对于 $q$ 阶移动平均过程,记为 MA$(q)$:\n", "\n", "$y_{t}=\\mu+\\varepsilon_{t}+\\theta_{1} \\varepsilon_{t-1}+\\theta_{2} \\varepsilon_{t-2}+\\cdots+\\theta_{q} \\varepsilon_{t-q}\\tag{3}$\n", "\n", "也可以进行条件 MLE 估计,即在给定“$\\varepsilon_{0}=\\varepsilon_{-1}=\\cdots=\\varepsilon_{-q+1}=0$”的条件下,最大化样本数据的似然函数。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### MA(1) 模型最大似然函数推导\n", "\n", "$y_t=μ+ε_t+θε_{t-1}$ \n", "\n", "$y_1=μ+ε_1+θε_0=μ+ε_1 ⇒ε_1=y_1-μ ⇒y_1∼N(μ,σ_ε^2)$ \n", "\n", "$y_2=μ+ε_2+θε_1=(1-θ)μ+θy_1+ε_2 ⇒ε_2= y_2-θy_1-(1-θ)μ ⇒y_2∼N((1-θ)μ+θy_1,σ_ε^2)$ \n", "\n", "以此类推:$y_3∼N((1-θ+θ^2)μ+θy_2-θ^2 y_1,σ_ε^2)$ \n", "\n", "因此:\n", "\n", "$$f\\left(y_{1}\\right)=\\frac{1}{\\sqrt{2 \\pi \\sigma_{\\varepsilon}^{2}}} e^{-\\frac{\\left(y_{1}-\\mu\\right)^{2}}{2 \\sigma_{\\varepsilon}^{2}}}, f_{y_{2} | y_{1}}\\left(y_{2} | y_{1}\\right)=\\frac{1}{\\sqrt{2 \\pi \\sigma_{\\varepsilon}^{2}}} e^{-\\frac{\\left(y_{2}-(1-\\theta) \\mu-\\theta_{1}\\right)^{2}}{2 \\sigma_{\\varepsilon}^{2}}}\\tag{4}$$ \n", "\n", "$$\\ln L=-\\frac{1}{2} \\ln 2 \\pi-\\frac{1}{2} \\ln \\sigma_{\\varepsilon}^{2}-\\frac{\\left(y_{1}-\\mu\\right)^{2}}{2 \\sigma_{\\varepsilon}^{2}}-\\frac{T-1}{2} \\ln 2 \\pi-\\frac{T-1}{2} \\ln \\sigma_{\\varepsilon}^{2}-\\sum_{t=2}^{T} \\frac{\\left(y_{t}-c_{1} \\mu-c_{2}\\right)}{2 \\sigma_{\\varepsilon}^{2}}\\tag{5}$$ \n", "\n", "其中:$c_1=1-θ+θ^2-θ^3+......; c_2=θy_(t-1)-θ^2 y_(t-2)+θ^3 y_(t-3)+......$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## statsmodels 库实现\n", "详情请参考:[ARMA 模型](https://www.statsmodels.org/stable/generated/statsmodels.tsa.arima_model.ARMA.html#statsmodels.tsa.arima_model.ARMA)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/html": [ "<table class=\"simpletable\">\n", "<caption>ARMA Model Results</caption>\n", "<tr>\n", " <th>Dep. Variable:</th> <td>sz</td> <th> No. Observations: </th> <td>460</td> \n", "</tr>\n", "<tr>\n", " <th>Model:</th> <td>ARMA(0, 1)</td> <th> Log Likelihood </th> <td>-2897.310</td>\n", "</tr>\n", "<tr>\n", " <th>Method:</th> <td>css-mle</td> <th> S.D. of innovations</th> <td>131.267</td> \n", "</tr>\n", "<tr>\n", " <th>Date:</th> <td>Fri, 29 May 2020</td> <th> AIC </th> <td>5800.620</td> \n", "</tr>\n", "<tr>\n", " <th>Time:</th> <td>19:15:02</td> <th> BIC </th> <td>5813.013</td> \n", "</tr>\n", "<tr>\n", " <th>Sample:</th> <td>0</td> <th> HQIC </th> <td>5805.500</td> \n", "</tr>\n", "<tr>\n", " <th></th> <td> </td> <th> </th> <td> </td> \n", "</tr>\n", "</table>\n", "<table class=\"simpletable\">\n", "<tr>\n", " <td></td> <th>coef</th> <th>std err</th> <th>z</th> <th>P>|z|</th> <th>[0.025</th> <th>0.975]</th> \n", "</tr>\n", "<tr>\n", " <th>const</th> <td> 2930.6519</td> <td> 11.858</td> <td> 247.141</td> <td> 0.000</td> <td> 2907.410</td> <td> 2953.894</td>\n", "</tr>\n", "<tr>\n", " <th>ma.L1.sz</th> <td> 0.9396</td> <td> 0.013</td> <td> 73.789</td> <td> 0.000</td> <td> 0.915</td> <td> 0.965</td>\n", "</tr>\n", "</table>\n", "<table class=\"simpletable\">\n", "<caption>Roots</caption>\n", "<tr>\n", " <td></td> <th> Real</th> <th> Imaginary</th> <th> Modulus</th> <th> Frequency</th>\n", "</tr>\n", "<tr>\n", " <th>MA.1</th> <td> -1.0643</td> <td> +0.0000j</td> <td> 1.0643</td> <td> 0.5000</td>\n", "</tr>\n", "</table>" ], "text/plain": [ "<class 'statsmodels.iolib.summary.Summary'>\n", "\"\"\"\n", " ARMA Model Results \n", "==============================================================================\n", "Dep. Variable: sz No. Observations: 460\n", "Model: ARMA(0, 1) Log Likelihood -2897.310\n", "Method: css-mle S.D. of innovations 131.267\n", "Date: Fri, 29 May 2020 AIC 5800.620\n", "Time: 19:15:02 BIC 5813.013\n", "Sample: 0 HQIC 5805.500\n", " \n", "==============================================================================\n", " coef std err z P>|z| [0.025 0.975]\n", "------------------------------------------------------------------------------\n", "const 2930.6519 11.858 247.141 0.000 2907.410 2953.894\n", "ma.L1.sz 0.9396 0.013 73.789 0.000 0.915 0.965\n", " Roots \n", "=============================================================================\n", " Real Imaginary Modulus Frequency\n", "-----------------------------------------------------------------------------\n", "MA.1 -1.0643 +0.0000j 1.0643 0.5000\n", "-----------------------------------------------------------------------------\n", "\"\"\"" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from statsmodels.tsa.arima_model import ARMA\n", "import pandas as pd\n", "\n", "data = pd.read_excel('../数据/上证指数与沪深300.xlsx')\n", "res = ARMA(data['sz'], order=(0,1)).fit()\n", "res.summary()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## matlab实现\n", "\n", "MAlnL.m" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```matlab\n", "function lnL = MAlnL(Beta,Y)\n", "%Beta(1) = u ;Beta(2) = sita;Beta(3) = sigma2;\n", "T = length(Y);\n", "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);\n", "for i = 2:T\n", " for j = 1:i\n", " c11(j) = (-Beta(2))^(j-1);\n", " end\n", " c1 = sum(c11)*Beta(1);\n", " for j = 1:i-1\n", " c22(j) = Y(i-j)*(Beta(2)^j)*(-1)^(j+1);\n", " end\n", " c2 = sum(c22);\n", " lnL2(i) = (Y(i)- c1 - c2)^2;\n", "end\n", "lnL = lnL1-0.5*sum(lnL2)/Beta(3)^2;\n", "lnL = -lnL;\n", "\n", "% %导入数据\n", "% data = xlsread('../数据/上证指数与沪深300.xlsx');\n", "% f1 = data(:,1); f2 = data(:,2);\n", "% \n", "% % 2.初始参数设定\n", "% maxsize = 2000; % 生成均匀随机数的个数(用于赋初值)\n", "% REP\t\t\t = 100; % 若发散则继续进行迭代的次数\n", "% nInitialVectors = [maxsize, 3]; % 生成随机数向量\n", "% MaxFunEvals = 5000; % 函数评价的最大次数\n", "% MaxIter = 5000; % 允许迭代的最大次数\n", "% options = optimset('LargeScale', 'off','HessUpdate', 'dfp','MaxFunEvals', ...\n", "% MaxFunEvals, 'display', 'on', 'MaxIter', MaxIter, 'TolFun', 1e-6, 'TolX', 1e-6,'TolCon',10^-12);\n", "% \n", "% % 3.寻找最优初值\n", "% initialTargetVectors = unifrnd(0,10, nInitialVectors);\n", "% RQfval = zeros(nInitialVectors(1), 1);\n", "% for i = 1:nInitialVectors(1)\n", "% RQfval(i) = MAlnL (initialTargetVectors(i,:), f1);\n", "% end\n", "% Results = [RQfval, initialTargetVectors];\n", "% SortedResults = sortrows(Results,1);\n", "% BestInitialCond = SortedResults(1,2: size(Results,2)); \n", "% \n", "% % 4.迭代求出最优估计值Beta\n", "% [Beta, fval exitflag] = fminsearch(' MAlnL ', BestInitialCond,options,f1);\n", "% for it = 1:REP\n", "% if exitflag == 1, break, end\n", "% [Beta, fval exitflag] = fminsearch(' MAlnL ', BestInitialCond,options,f1);\n", "% end\n", "% if exitflag~=1, warning('警告:迭代并没有完成'), end\n", "\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Eviews 估计\n", "估计方程 `y c ma(p)`\n", "<div align=center><img src=\"https://gitee.com/lei940324/picture/raw/master/img/2020/0529/172923.png\" width=\"428\" ></div>" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.7" } }, "nbformat": 4, "nbformat_minor": 4 }