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)
em que é o retorno do ativo,
é o retorno em excesso,
é o coeficiente que mede a sensibilidade do ativo em relação ao índice e
é 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")
# 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')
# 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.
________________________


