statsmodels¶Objetivo
Área abrangente que envolve:
Exemplos:
%matplotlib inline
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = (16.0, 8.0)
import statsmodels.api as sm
import statsmodels.tsa as tsa
x = np.random.randn(500)
plt.figure(figsize=(16,8))
plt.subplot(221)
plt.plot(x)
plt.title('Série estacionária')
plt.subplot(222)
plt.plot(np.cumsum(x * 0.2))
plt.title('Série não-estacionária');
$$ x_t - \mu = \phi_1 (x_{t-1} - \mu) + ... + \phi_p (x_{t-p} - \mu) + e_t $$
ar1 = tsa.arima_process.ArmaProcess([1, -0.75], [1])
rs_ar1 = ar1.generate_sample(500)
fig = plt.figure(figsize=(16,6))
ax = fig.add_subplot(111)
ax.plot(rs_ar1);
acf) e Autocorrelação Parcial (pacf)¶def acf_pacf(x):
    fig = plt.figure(figsize=(16,10))
    ax1 = fig.add_subplot(221)
    fig = sm.graphics.tsa.plot_acf(x, lags=40, ax=ax1)
    ax2 = fig.add_subplot(222)
    fig = sm.graphics.tsa.plot_pacf(x, lags=40, ax=ax2)
acf_pacf(rs_ar1)
statsmodels — acf e pacf¶$$ x_t = 0.75 x_{t-1} - 0.5 x_{t-2} + e_t $$
ar2 = tsa.arima_process.ArmaProcess([1, -0.75, 0.5], [1])
rs_ar2 = ar2.generate_sample(500)
acf_pacf(rs_ar2)
ma1 = tsa.arima_process.ArmaProcess([1], [1, -0.75])
rs_ma1 = ma1.generate_sample(500)
fig = plt.figure(figsize=(16,6))
ax = fig.add_subplot(111)
ax.plot(rs_ma1);
acf e pacf¶acf_pacf(rs_ma1)
Juntando os processos Autoregressivos AR(p) e os de Médias Móveis MA(q) obtemos os processos ARMA(p,q).
$$ x_t = c + \phi_1 x_{t-1} + ... + \phi_p x_{t-p} + e_t + \theta_1 e_{t-1} + ... + \theta_q e_{t-q} $$
Série da cotação do Dólar Americano em Reais
import quandl
df = quandl.get('BCB/1', start_date = '2000-01-01')
fig = plt.figure(figsize=(16,6))
ax = fig.add_subplot(111)
ax.plot(df);
acf  e pacf da série de Dólar Americano em Reais¶acf_pacf(df)
Retornos logarítimicos de séries de preço.
$$ r_t = \log \left( \frac{x_t}{x_{t-1}} \right) $$
fig = plt.figure(figsize=(16,6))
ax = fig.add_subplot(111)
ax.plot(np.log(df).diff().dropna());
acf  e pacf da série de retornos do Dólar Americano em Reais¶acf_pacf(np.log(df).diff().dropna())
acf  e pacf da série de retornos quadráticos do Dólar Americano em Reais¶acf_pacf(np.log(df).diff().dropna() ** 2)
Os retornos quadráticos apresentam tanto características de AR(p) como de MA(q), caracterizando um processo ARMA(p,q).
model = sm.tsa.ARMA(1000 * (np.log(df).diff().dropna() ** 2), (1,1)).fit()
print(model.summary())
                              ARMA Model Results                              
==============================================================================
Dep. Variable:                  Value   No. Observations:                 4301
Model:                     ARMA(1, 1)   Log Likelihood                -688.706
Method:                       css-mle   S.D. of innovations              0.284
Date:                Sun, 12 Feb 2017   AIC                           1385.411
Time:                        23:03:35   BIC                           1410.878
Sample:                    01-04-2000   HQIC                          1394.405
                         - 02-10-2017                                         
===============================================================================
                  coef    std err          z      P>|z|      [95.0% Conf. Int.]
-------------------------------------------------------------------------------
const           0.0942      0.015      6.078      0.000         0.064     0.125
ar.L1.Value     0.9097      0.010     87.461      0.000         0.889     0.930
ma.L1.Value    -0.6763      0.018    -36.629      0.000        -0.713    -0.640
                                    Roots                                    
=============================================================================
                 Real           Imaginary           Modulus         Frequency
-----------------------------------------------------------------------------
AR.1            1.0992           +0.0000j            1.0992            0.0000
MA.1            1.4786           +0.0000j            1.4786            0.0000
-----------------------------------------------------------------------------
model.resid.plot();
onde
$z_t$ é variável aleatória i.i.d. com uma distribuição especificada a priori.
A variância do processo é um processo autoregressivo.
from arch import arch_model
am = arch_model(np.log(df).diff().dropna() * 100)
res = am.fit(disp = 'off')
print(res.summary())
                     Constant Mean - GARCH Model Results                      
==============================================================================
Dep. Variable:                  Value   R-squared:                      -0.002
Mean Model:             Constant Mean   Adj. R-squared:                 -0.002
Vol Model:                      GARCH   Log-Likelihood:               -5005.29
Distribution:                  Normal   AIC:                           10018.6
Method:            Maximum Likelihood   BIC:                           10044.0
                                        No. Observations:                 4301
Date:                Sun, Feb 12 2017   Df Residuals:                     4297
Time:                        23:03:39   Df Model:                            4
                                  Mean Model                                  
==============================================================================
                 coef    std err          t      P>|t|        95.0% Conf. Int.
------------------------------------------------------------------------------
mu            -0.0249  1.002e-02     -2.486  1.292e-02 [-4.454e-02,-5.269e-03]
                               Volatility Model                               
==============================================================================
                 coef    std err          t      P>|t|        95.0% Conf. Int.
------------------------------------------------------------------------------
omega          0.0109  3.023e-03      3.592  3.277e-04   [4.934e-03,1.678e-02]
alpha[1]       0.1542  1.877e-02      8.219  2.055e-16       [  0.117,  0.191]
beta[1]        0.8434  1.746e-02     48.304      0.000       [  0.809,  0.878]
==============================================================================
Covariance estimator: robust
res.plot();
returns = np.log(df).diff().dropna() * 100
plt.plot(returns['Value'].tolist(), '-k')
plt.plot(res._volatility * 2.32, '-r')
plt.plot(- res._volatility * 2.32, '-r');
Aqui vimos um breve exemplo de como realizar Modelagem de Séries Temporais com Python.
A Modelagem de Séries Temporais é fundamental para a compreensão da dinâmica das séries temporais, particularmente utilizada para modelar séries financeiras.
A modelagem de séries temporais financeiras é utilizada para: