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: