Tag

regressão com R Archives - Análise Macro

Modelo de Mercado e Regressão Móvel

By | mercado financeiro

No post de hoje iremos mostrar como criar o modelo de precificação conhecido como Market Model. O propósito do modelo segue o mesmo caminho que outros modelos de fatores, em que é escolhido uma proxy de risco para explicar a variação do retorno de um ativo. Mostraremos também como criar uma regressão móvel para o modelo.

No caso do Market Model, pode ser considerado um dos modelos mais simples dentro da literatura e do mundo real de finanças, em que é necessário somente os dados de um índice de mercado que queira ser acompanhado, diferente de outros modelos, que se estendem na utilização de proxys para portfolios de mercado ou o efeito do tamanho das empresas sobre o ativo, podendo ou não serem modelos multi-fatores.

O Market Model não pressupõe a preocupação de se utilizar o verdadeiro portfolio de mercado, apenas um índice, portanto não é necessário que seja utilizado a taxa de juros livre de risco para realizar seu cálculo. Sua equação é definida como:

(1)    \begin{equation*}R_i = \alpha + \beta r_m\end{equation*}

em que $r_i$ é o retorno do ativo, $\alpha$ é o retorno em excesso, $\beta$ é o coeficiente que mede a sensibilidade do ativo em relação ao índice e $r_m$ é o retorno do índice.

Feito a especificação do nosso modelo, podemos coletar e tratar nossos dados. Iremos coletar os preços de quatro ações para montar um Equally Weighted Portfolio. Como estamos utilizando ações que estão na B3, iremos utilizar o Índice Bovespa como índice de mercado. Iremos utilizar dados mensais (realizando a transformação de diário para mensal) começando a partir de 2013.

library(tidyverse)
library(tidyquant)
library(timetk)
library(stargazer)
library(ggrepel)
library(patchwork)

# Define os ativos que irão ser coletados

tickers <- c("PETR4.SA", "ITUB4.SA", "ABEV3.SA", "JBSS3.SA")

# Define a data de início da coleta

start <- "2012-12-01"

# Realiza a coleta dos preços diários

prices <- getSymbols(tickers,
auto.assign = TRUE,
warnings = FALSE,
from = start,
src = "yahoo") %>%
map(~Cl(get(.))) %>%
reduce(merge) %>%
`colnames<-`(tickers)

# Transfroma os preços diários em mensais

prices_monthly <- to.monthly(prices,
indexAt = "lastof",
OHLC = FALSE)

# Calcula os retornos mensais

asset_returns <- Return.calculate(prices_monthly,
method = "log") %>%
na.omit()

# Calcula o portfolio com pesos iguais

portfolio_returns <- Return.portfolio(asset_returns)

# Coleta os dados do ibovespa

getSymbols("^BVSP",
warnings = FALSE,
from = start,
src = "yahoo")

# Calcula os retornos mensais

bvsp_returns <- Ad(BVSP) %>%
to.monthly(indexAt = "lastof",
OHLC = FALSE) %>%
Return.calculate(method = "log") %>%
na.omit() %>%
`colnames<-`("ibovespa")

# Junta os dados

all_returns <- merge.xts(portfolio_returns, bvsp_returns)

Com os nossos dados em mãos, podemos realizar nossa Regressão via MQO.


# Cálcula a regressão "estática"

market_model <- lm(formula = portfolio.returns ~ ibovespa,
data = all_returns)

# Cria uma tabela com os resultados da regressão

stargazer(market_model, header = FALSE, align = TRUE)

 


Vemos que tivemos um resultado no qual nosso Beta é menor do 1, significando que nosso portfólio varia menos que o proporcional do mercado.

Por fim, sabemos que esse resultado não pode ser o  mesmo em todos os horizontes de tempo, para tanto, podemos criar uma Regressão Móvel para saber em quais período de tempo nosso Beta está acima ou abaixo que o proporcional do mercado.


# Aplica a função para criar a regressão móvel

coef <- rollapply(all_returns,
width = 24, # Janela
FUN = function(x) # Cria uma função da regressão para utilizar com a função
{
roll_reg = lm(portfolio.returns ~ ibovespa,
data = as.data.frame(x))
return(roll_reg$coef)
},
by.column = FALSE)

# Limpa e transforma o objeto em tibble

coef_tbl <- coef %>%
na.omit() %>%
tk_tbl(preserve_index = TRUE,
rename_index = "date") %>%
rename(alpha = "X.Intercept.", beta = "ibovespa")

&nbsp;

# Cria um gráfico do Alpha móvel

alpha <- ggplot(coef_tbl, aes(x = date, y = alpha))+
geom_line(size = .8, colour = "darkblue")+
theme_minimal()+
labs(title = "Alpha",
x = "",
y = "")+
geom_hline(yintercept = 0, linetype = "dashed", colour = "red")+
geom_label_repel(label = round(tail(coef_tbl$alpha, 1), 4),
nudge_y = 0.002,
nudge_x = -1,
data = tail(coef_tbl, 1),
color = 'black',
fill = 'lightblue')

# Cria um gráfico do Beta móvel

beta <- ggplot(coef_tbl, aes(x = date, y = beta))+
geom_line(size = .8, colour = "darkblue")+
theme_minimal()+
labs(title = "Beta",
x = "",
y = "")+
geom_label_repel(label = round(tail(coef_tbl$beta, 1), 3),
nudge_y = 0.2,
nudge_x = -1,
data = tail(coef_tbl, 1),
color = 'black',
fill = 'lightblue')

&nbsp;

# Junta os gráficos

alpha / beta +
plot_annotation(title = "Regressão Móvel do Modelo de Mercado",
subtitle = "Portfólio x Ibovespa",
caption = "Elaborado por analisemacro.com.br com dados do Yahoo Finance.")

 

________________________

(*) Para entender mais sobre Mercado Financeiro e medidas de risco, confira nosso curso de R para o Mercado Financeiro.
________________________

"Rolling regression" no R

By | Macroeconometria

Nós economistas, pelo menos grande parte, estamos sempre discutindo a relação entre duas ou mais variáveis e muitas vezes nos perguntamos se esta relação ainda vale ou se ela mudou ao longo do tempo. A dúvida se traduz, basicamente, em tentar descobrir se o coeficiente numa dada equação se manteve constante ao longo do tempo.

Aproveitando o post anterior (e também grande parte do script), onde assumimos o seguinte modelo para o IPCA

     \[ IPCA_t = \alpha + \rho IPCA_{t-1} + \gamma \varepsilon_{t-1} + \varepsilon_t. \]

Podemos tentar inferir sobre a evolução do coeficiente \rho, \; \gamma \text{ e } \alpha. Obviamente existem testes formais de estabilidade de coeficientes de uma regressão (o pacote strucchange para o R, por exemplo, implementa alguns deles), porém seguindo a maneira exposta abaixo podemos ter uma intuição melhor sobre a evolução dos parâmetros (especialmente quando comparado com uma simples estatística de teste).

A idéia é então estimar o modelo proposto acima para uma dada janela, ou intervalo, de tempo, guardar os coeficientes estimados e seus respectivos desvios padrão para, em seguida, “andar” com a janela 1 mês e repetir o processo. Assim estaremos sempre utilizando o mesmo número de observações para estimar o modelo, ao mesmo tempo que fazemos uma transição lenta ao longo do tempo.

Para este exercício usarei somente o pacote lmtest (somente para simplificar a extração de informações sobre os coeficientes que eu quero) e irei ampliar a amostra do IPCA (comparado com o post anterior) para desde janeiro de 1990. Abaixo o gráfico da série utilizada e seu respectivo código de R.

plot(ipca,
     ylab = 'IPCA (%a.m.)', xlab = 'Ano',
     col = 'darkblue', lwd=2,
     bty='l')

grid(col='darkgrey', lwd=2)
IPCA (% a.m.) desde janeiro de 1990.

IPCA (% a.m.) desde janeiro de 1990.

Para este exercício eu escolhi sempre utilizar uma amostra de 60 observações, isto é, 5 anos de IPCA. Em seguida eu desenvolvo um loop que faça justamente os passos expostos acima, isto é:

1. Começar com uma janela de 60 meses (em janeiro de 1990);
2. Estimar o modelo ARMA(1,1);
3. Salvar os coeficientes (e seus desvios);
4. Andar com a janela de amostra um mês para frente (isto é, começando em fevereiro de 1990);
5. Repetir os passos 1-4 até o final da amostra.

Abaixo o loop de modo a por em prática este processo.

N <- 5
inicio <- 5*freq
comp.beta <- length(ipca[inicio:length(ipca)])

k <- 3 # Numero de coeficientes

coefs <- matrix(NA, ncol=k, nrow=comp.beta)
dp <- matrix(NA, ncol=k, nrow=comp.beta)

colnames(coefs) <- c('AR','MA','Intercepto')
colnames(dp) <- c('AR','MA','Intercepto')

for (i in 1:comp.beta){

  modelo <- arima(ipca[(1+i-1):(inicio+i-1)],
                  order = c(1,0,1))

  coefs[i,] <- coef(modelo)

  dp[i,] <- coeftest(modelo)[,2] 

}

Em seguida podemos fazer um gráfico com nossas estimativas e, desta forma, ver o desenvolvimento do coeficiente de interesse (neste caso irei somente olhar para o parâmetro \rho. Notem que no gráfico eu incluo o intervalo de confiança da última estimativa, desta forma podemos ver em quais momentos o coeficiente foi estatisticamente diferente da estimativa final, ou seja, do coeficiente hoje.

plot(coefs[,'AR'],
     ylab = expression(hat(rho)), xlab = 'Ano',
     col = 'darkblue', lwd=2,
     ylim=c(-1.3,1.3),
     bty='l')

lines(coefs[,'AR']+1.96*dp[,'AR'],
      col='red',
      lty=2)

lines(coefs[,'AR']-1.96*dp[,'AR'],
      col='red',
      lty=2)

abline(h=coefs[nrow(coefs),'AR']+1.96*dp[nrow(coefs),'AR'],
      col='darkgreen',
      lty=1, lwd=1)

abline(h=coefs[nrow(coefs),'AR']-1.96*dp[nrow(coefs),'AR'],
       col='darkgreen',
       lty=1, lwd=1)

legend('bottomright',
       c('Coeficiente','Intervalo 95%','Intervalo 95% final'),
       lty=c(1,2,1),
       col=c('darkblue','red','darkgreen'),
       bty='n')

Evolução do coeficiente AR(1) ao longo do tempo (janela de 5 anos).

Evolução do coeficiente AR(1) ao longo do tempo (janela de 5 anos).

Receba diretamente em seu e-mail gratuitamente nossas promoções especiais
e conteúdos exclusivos sobre Análise de Dados!

Assinar Gratuitamente