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.
1 2 3 4 5 6 | library (tidyverse) library (tidyquant) library (timetk) library (stargazer) library (ggrepel) library (patchwork) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | # 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.
1 2 3 4 5 6 7 8 | # 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | # 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.
________________________