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: