Utilização do Modelo GARCH(1,1) na Previsão de Volatilidade

O objetivo deste artigo é trazer um entendimento sobre o que se trata o modelo GARCH e apresentar uma aplicação em python deste modelo para a previsão de volatilidade. Vamos começar compreendendo como o modelo surgiu e como se destaca em comparação às outras formas de estimar a volatilidade. Em seguida, vamos explicar as propriedades do modelo GARCH(1,1) que será utilizado em nossa aplicação. Por fim, iremos demonstrar como montar a aplicação do modelo em python.

 

A motivação para este artigo foi a relevância que a volatilidade possui atualmente para os estudos de previsão de riscos. Um dos momentos de reconhecimento da importância de se mensurar o efeito da volatilidade ao longo do tempo na análise de riscos, ocorreu quando Robert Engle recebeu o Prêmio Nobel de Economia em 2003, por desenvolver um método estatístico para lidar com esta propriedade das séries econômicas. A Academia Real Sueca de Ciências afirmou que:

 

“Os modelos ARCH de Engle se tornaram ferramentas indispensáveis não apenas para pesquisas, mas também para analistas do mercado financeiro, que os utilizam na formação de ativos e na avaliação de risco de portfólio”.

Por que utilizar o Modelo GARCH para modelagem da volatilidade?

Uma mudança na variância ou volatilidade ao longo do tempo pode causar problemas na modelagem de séries temporais com métodos clássicos. Pois, um aspecto de uma série temporal que esses modelos não captam é uma alteração na variância ao longo do tempo, devido ao fato de que nesses modelos as observações recentes receberiam o mesmo peso que observações mais antigas, que claramente podem não possuir o mesmo impacto ao longo do tempo que uma vez tiveram.

 

É por isso que métodos de estimativa de volatilidade evoluíram para modelos que dão mais peso às informações recentes. Desses primeiros modelos se destacam a família de modelos GARCH, inicialmente proposto por Engle (1982), como ARCH, e generalizado por Bollerslev (1986). Esses métodos fornecem uma maneira de modelar uma mudança na variância de uma série temporal dependente do tempo.


A principal diferença entre eles seria o fato de que enquanto o modelo ARCH(q) demonstra que a variância condicional, ou volatilidade, σt2, em um determinado período, depende da magnitude de uma série de retornos ao quadrado (ou erros quadráticos), rt2, em “q” períodos anteriores, o modelo GARCH(p,q) vai além com componente adicional, sendo este a variância condicional em “p” períodos anteriores. A seguir a equação da variância condicional definida pelo modelo ARCH(q):

1

O modelo GARCH (p,q) possui um termo autorregressivo, como em ARCH(q), com a adição de um termo de média móvel. O termo autorregressivo (p) modela a variância condicional dos erros quadráticos ou simplesmente modela a variância condicional da série temporal ao quadrado, já a parte de média móvel (q) modela a variação do processo. A seguir a equação da variância condicional definida pelo modelo GARCH(p,q):

2

Outro motivo relevante para se usar o modelo GARCH, é que ele pode capturar a aglomeração da volatilidade, ou clusters de volatilidade, sofrida por séries financeiras. Os preços dos ativos são caracterizados por esse fenômeno, que se trata de períodos nos quais os preços exibem grandes variações para um longo período seguido por um período de tranquilidade comparativa.

 

Existem hoje muitas variantes do modelo GARCH, a maioria das quais fornece apenas melhorias marginais no modelo original. Entre essas extensões do modelo GARCH, estão o Integrated GARCH, Exponential GARCH ou EGARCH, GJR-GARCH e outras. A família de modelos GARCH é amplamente utilizada na prática para prever a volatilidade e os retornos do mercado financeiro.



O modelo

Para a maioria das séries financeiras, a utilização do modelo GARCH(1,1) já é suficiente para explicar sua volatilidade, desta forma, para a aplicação que será demonstrada mais a frente, utilizaremos este modelo. Para explicar o modelo, inicialmente consideramos rt como uma série de retornos, partindo disso o modelo GARCH(1.1) é definido como:

3

A equação acima demonstra que o modelo contém um termo defasado de retorno ao quadrado, rt-12, como em ARCH(1), mas também um termo defasado da variação condicional, σt-12, para determinar a variação condicional no período t, σt2.


O termo alfa, α, indica quanto o último retorno observado tem de influência sobre a variância condicional hoje, já o termo beta, β, indica quanto a volatilidade do período anterior deve influenciar a volatilidade hoje. Quanto maior o alfa maior o impacto imediato de choques nos dados da série temporal e quanto maior o beta maior a duração do impacto. Para a estimação dos parâmetros, é utilizado o método de máxima verossimilhança.

 

Uma propriedade este modelo é que todos os parâmetros não são negativos, ω, α, β ≥ 0. Para que o modelo seja estacionário, a soma dos parâmetros alfa e beta deve ser menor que um,  α + β < 1.

Ômega, ω, pode ser a visto como seria a variação se as informações sobre variações passadas não estivessem sendo passadas para o modelo. Ômega também é definido como o produto de um termo gama, γ, e da variância incondicional ou variância de longo prazo, σLR. Enquanto ômega, alfa e beta são os parâmetros de volatilidade do modelo, gama pode ser chamado de parâmetro de assimetria do modelo.

4

A equação acima nos mostra que, para existir a variância incondicional de rt2é necessário que α + β < 1, justificando a restrição de estacionariedade do modelo. É utilizada a expressão a seguir para se estimar um valor para a variância condicional em um período t+i, em outras palavras, está é a fórmula para prever a volatilidade dos próximos períodos.

5

Utilizaremos o log-retorno devido a suas propriedades estatísticas, como a estacionariedade, para calcular os retornos da série temporal.

6

A aplicação em Python

A estimação dos parâmetros e o cálculo para prever a volatilidade serão feitos a seguir, utilizaremos o ambiente do Google Colab e a cotação do dólar será o nosso objeto de estudo.

 

Inicialmente temos que instalar e importar os pacotes que iremos utilizar:

 

 

#Instalação e importação dos pacotes para os buscar os dados e as funções do modelo

!pip install quandl

!pip install arch

import quandl as qdl

from arch import arch_model

 

#Importação de bibliotecas matemáticas e de ciência de dados

import numpy as np

import pandas as pd

 

#Pré definição das configuração dos gráficos

import seaborn as sns

sns.set()

import matplotlib as mpl

mpl.rcParams[‘figure.figsize’] = (155)

 

 

 

Utilizamos o pacote quandl para buscar os dados das cotações do dólar.

 

 

#Definição dos dados

dolar = qdl.get(‘BCB/1’, start_date = ‘2000-01-01’)

 

#Visualização do gráfico das cotações

dolar.rename(columns={“Value”“USD”}, inplace=True)

dolar.plot()

 

 

 

 

#Visualização do gráfico dos retornos

dolar_ret = np.log(dolar/dolar.shift(1)).dropna()

dolar_ret.plot()

 

 


Para esta análise será necessário padronizar os retornos, subtraindo-os de sua média esperada e dividindo pelo seu desvio padrão.

 

 

#Padronização dos retornos

dolar_m = dolar_ret.values.mean()

dolar_dp = dolar_ret.values.std()

dolar_ret_p = (dolar_ret – dolar_m)/dolar_dp

 

 

 

Para estimar um modelo do tipo GARCH, selecionamos a função arch_model do pacote arch instalado anteriormente. A função arch_model pode especificar um modelo GARCH em vez do modelo ARCH se informamos o modelo de volatilidade a ser utilizado, especificando o seguinte argumento da função  vol = ‘GARCH’, assim como os argumentos de defasagem p=1 e q=1 para determinar um modelo GARCH(1,1):

 

 

#Aplicação do Modelo GARCH(1,1) aos dados e vizualização dos resultados

garch_model = arch_model(dolar_ret_p, p=1, q=1, vol=‘GARCH’, dist=‘Normal’)

resultados = garch_model.fit(disp=‘off’)

print(resultados.summary())

 


 

 

#Previsão da volatilidade

resultados_forecast = resultados.forecast(horizon=5)

print(resultados_forecast.variance[-1:])


Cada coluna “h.n” da saída da previsão corresponde a n d períodos a frente, neste caso n dias a frente. A saída é alinhada para que a coluna “Date” represente os dados finais usados para gerar a previsão, de modo que “h.1” na linha “2020-05-29” seja a previsão da volatilidade condicional esperada de um dia à frente, feita usando dados até 29 de meio de 2020.

 

O gráfico hedgehog a seguir mostra os métodos de previsão ao longo do período analisado.
As linhas laranja indicam as previsões em diferentes intervalos de tempo.

 

 

#Visualização do gráfico hedgehog

g_previsões = resultados.hedgehog_plot()




Python Guide for Introductory Econometrics for Finance | Ran Tao & Chris Brooks
Value at Risk: Managing Financial Risk | Philippe Jorion
GARCH Models in Python | Chelsea Yang
Forecast volatility with GARH(1,1) https://youtu.be/oDXw0r0Oqmk
Quandl Data to Python | https://www.quandl.com/tools/python

    


Link para visualizar a programação no Google Colab

https://colab.research.google.com/drive/1cDbLT0vHapiaOqT1ACrTnGfWTqb16xm6?usp=sharing


Posted by Andreza Menezes

Estudante de Ciências Econômicas da UDESC e membro do núcleo de riscos e derivativos.

3 comments

Rafael F.V.C. Santos

Olá Andreza. Ótimo artigo!
Você tem utilizado esses modelos nos derivativos de opções sobre ações?

Andreza Menezes

Olá Rafael, Obrigada!
Ainda não utilizei este modelo para derivativos de opções, mas acredito que possa ser aplicado sem problemas. Caso se interesse em testar recomendo a biblioteca GetHFData para contratos de derivativos, mesmo sendo uma biblioteca do R ainda pode ser utilizada no Python, pelo Google Colab seria assim:

!pip install rpy2

from rpy2.robjects.packages import importr
utils = importr(‘utils’)
utils.install_packages(‘GetHFData’)

Ótimo artigo! Vou replicar para estudar. Estava procurando sobre isso a alguns dias.
Será que esse modelo funcionaria bem com dados intradiarios do dolar ?
Abraços

Deixe uma resposta

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.