Autoregressive Moving Average (ARMA): Artificial data

Autoregressive Moving Average (ARMA): Artificial data

Link to Notebook GitHub

In [1]:
1
2
3
4
5
6
<span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">print_function</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="kn">as</span> <span class="nn">np</span>
<span class="kn">import</span> <span class="nn">statsmodels.api</span> <span class="kn">as</span> <span class="nn">sm</span>
<span class="kn">import</span> <span class="nn">pandas</span> <span class="kn">as</span> <span class="nn">pd</span>
<span class="kn">from</span> <span class="nn">statsmodels.tsa.arima_process</span> <span class="kn">import</span> <span class="n">arma_generate_sample</span>
<span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">seed</span><span class="p">(</span><span class="mi">12345</span><span class="p">)</span>

Generate some data from an ARMA process:

In [2]:
1
2
<span class="n">arparams</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="o">.</span><span class="mi">75</span><span class="p">,</span> <span class="o">-.</span><span class="mi">25</span><span class="p">])</span>
<span class="n">maparams</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="o">.</span><span class="mi">65</span><span class="p">,</span> <span class="o">.</span><span class="mi">35</span><span class="p">])</span>

The conventions of the arma_generate function require that we specify a 1 for the zero-lag of the AR and MA parameters and that the AR parameters be negated.

In [3]:
1
2
3
4
<span class="n">arparams</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">r_</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="n">arparams</span><span class="p">]</span>
<span class="n">maparam</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">r_</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="n">maparams</span><span class="p">]</span>
<span class="n">nobs</span> <span class="o">=</span> <span class="mi">250</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">arma_generate_sample</span><span class="p">(</span><span class="n">arparams</span><span class="p">,</span> <span class="n">maparams</span><span class="p">,</span> <span class="n">nobs</span><span class="p">)</span>

Now, optionally, we can add some dates information. For this example, we'll use a pandas time series.

In [4]:
1
2
3
4
<span class="n">dates</span> <span class="o">=</span> <span class="n">sm</span><span class="o">.</span><span class="n">tsa</span><span class="o">.</span><span class="n">datetools</span><span class="o">.</span><span class="n">dates_from_range</span><span class="p">(</span><span class="s">'1980m1'</span><span class="p">,</span> <span class="n">length</span><span class="o">=</span><span class="n">nobs</span><span class="p">)</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">TimeSeries</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">index</span><span class="o">=</span><span class="n">dates</span><span class="p">)</span>
<span class="n">arma_mod</span> <span class="o">=</span> <span class="n">sm</span><span class="o">.</span><span class="n">tsa</span><span class="o">.</span><span class="n">ARMA</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">order</span><span class="o">=</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="mi">2</span><span class="p">))</span>
<span class="n">arma_res</span> <span class="o">=</span> <span class="n">arma_mod</span><span class="o">.</span><span class="n">fit</span><span class="p">(</span><span class="n">trend</span><span class="o">=</span><span class="s">'nc'</span><span class="p">,</span> <span class="n">disp</span><span class="o">=-</span><span class="mi">1</span><span class="p">)</span>
In [5]:
1
<span class="k">print</span><span class="p">(</span><span class="n">arma_res</span><span class="o">.</span><span class="n">summary</span><span class="p">())</span>
                              ARMA Model Results
==============================================================================
Dep. Variable:                      y   No. Observations:                  250
Model:                     ARMA(2, 2)   Log Likelihood                -245.887
Method:                       css-mle   S.D. of innovations              0.645
Date:                Tue, 02 Dec 2014   AIC                            501.773
Time:                        12:52:27   BIC                            519.381
Sample:                    01-31-1980   HQIC                           508.860
                         - 10-31-2000
==============================================================================
                 coef    std err          z      P>|z|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
ar.L1.y        0.8411      0.403      2.089      0.038         0.052     1.630
ar.L2.y       -0.2693      0.247     -1.092      0.276        -0.753     0.214
ma.L1.y        0.5352      0.412      1.299      0.195        -0.273     1.343
ma.L2.y        0.0157      0.306      0.051      0.959        -0.585     0.616
                                    Roots
=============================================================================
                 Real           Imaginary           Modulus         Frequency
-----------------------------------------------------------------------------
AR.1            1.5618           -1.1289j            1.9271           -0.0996
AR.2            1.5618           +1.1289j            1.9271            0.0996
MA.1           -1.9835           +0.0000j            1.9835            0.5000
MA.2          -32.1812           +0.0000j           32.1812            0.5000
-----------------------------------------------------------------------------

In [6]:
1
<span class="n">y</span><span class="o">.</span><span class="n">tail</span><span class="p">()</span>
Out[6]:
2000-06-30    0.050999
2000-07-31   -0.206404
2000-08-31   -0.170874
2000-09-30    0.257949
2000-10-31    0.245237
dtype: float64
In [7]:
1
2
3
4
<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="kn">as</span> <span class="nn">plt</span>
<span class="n">fig</span><span class="p">,</span> <span class="n">ax</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplots</span><span class="p">(</span><span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span><span class="mi">8</span><span class="p">))</span>
<span class="n">fig</span> <span class="o">=</span> <span class="n">arma_res</span><span class="o">.</span><span class="n">plot_predict</span><span class="p">(</span><span class="n">start</span><span class="o">=</span><span class="s">'1999m6'</span><span class="p">,</span> <span class="n">end</span><span class="o">=</span><span class="s">'2001m5'</span><span class="p">,</span> <span class="n">ax</span><span class="o">=</span><span class="n">ax</span><span class="p">)</span>
<span class="n">legend</span> <span class="o">=</span> <span class="n">ax</span><span class="o">.</span><span class="n">legend</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="s">'upper left'</span><span class="p">)</span>
doc_statsmodels
2025-01-10 15:47:30
Comments
Leave a Comment

Please login to continue.