Gestão de Risco

 UNIVERSIDADE FEDERAL DA PARAÍBA

Autor

Natan Henrique Alves

Data de Publicação

14 de junho de 2024

Código
remove(list=ls())
par(mfrow=c(1,1))
options(scipen=999)
options(max.print = 100000)
require(fPortfolio)
library(tseries)
library(fBasics)
library(whitestrap)
library(tidyverse) 
library(knitr)
library(xts)
library(MASS)
library(kableExtra)
library(gridExtra)

Intervalo Temporal Utilizado

2024/03/07 a 2024/07/17

Código
# Intervalo de Tempo dos dados
dataini <- "2024-04-24"
datafim <- "2024-07-22"

Criação dos Indicadores

Retorno, média dos Retornos, Desvio Padrão, Coeficiente de Variação e Beta Mercado.

Código
# Lista de Empresas que serão Requeridas
empresas <- list(
  ibov = "^BVSP",
  vivo = "vivt3.sa", 
  totvs = "tots3.sa", 
  weg = "wege3.sa", 
  tim = "tims3.sa", 
  localiza = "rent3.sa", 
  transmissao_paulista = "trpl3.sa", 
  cemig = "cmig3.sa",
  engie = "egie3.sa", 
  taesa = "taee3.sa", 
  cpfl = "cpfe3.sa", 
  cyrela = "cyre3.sa", 
  aliansce = "alos3.sa", 
  ccr = "ccro3.sa", 
  multiplan = "mult3.sa", 
  eztc = "eztc3.sa", 
  suzano = "suzb3.sa", 
  vibra = "vbbr3.sa", 
  klabin = "klbn3.sa", 
  csn_mineracao = "cmin3.sa", 
  gerdau = "ggbr3.sa",
  slc = "slce3.sa",
  fleury = "flry3.sa",
  hypera = "hype3.sa",
  minerva = "beef3.sa",
  arezo = "arzz3.sa"
)

# Loop de busca para obter os dados e calcular os retornos
retornos <- lapply(empresas, function(ticker) {
  data <- na.omit(get.hist.quote(instrument = ticker, quote = "Close", start = dataini, end = datafim))
  diff(log(data))
})
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
Código
# Checar o tamanho da amostra para 'vivo'
length(retornos$vivo)
[1] 60
Código
# Calcular indicadores de desempenho
calcular_indicadores <- function(retorno) {
  risco <- sd(retorno) / mean(retorno)
  retorno_medio <- mean(retorno) * 100
  volatilidade <- (sd(retorno) * 100) * sqrt(252)
  list(risco = risco, retorno_medio = retorno_medio, volatilidade = volatilidade)
}

# Calcular indicadores para todas as empresas
indicadores <- lapply(retornos, calcular_indicadores)

# Criar data frame final com os resultados
df2 <- data.frame(
  Empresas = c("Ibov", "Vivo", "Totvs", "Weg", "Tim", "Localiza", 
               "Transmissão Paulista", "Cemig", "Engie", "Taesa", "CPFL", "Cyrela", 
               "Aliansce", "CCR", "Multiplan", "EZTec", "Suzano", 
               "Vibra Energia", "Klabin", "CSN Mineração", "Gerdau", "Slc", "Fleury",
               "Hypera", "Minerva", "Arezo"),
  Retorno = sapply(indicadores, `[[`, "retorno_medio"),
  Risco = sapply(indicadores, `[[`, "risco")
#  Volatilidade = sapply(indicadores, `[[`, "volatilidade")
)

# Usar kable para criar a tabela e kableExtra para formatá-la
kable(df2[,-1], format = "html") |> 
  kable_styling(bootstrap_options = c("striped", "hover", "condensed")) |> 
  row_spec(0, background = "#2166AC") |>   # Cabeçalho da tabela em azul
  row_spec(2:6, background = "#C7EAE5") |>  # Linhas em diferentes tons de azul
  row_spec(7:11, background = "#92C5DE") |> 
  row_spec(12:16, background = "#D1E5F0") |> 
  row_spec(17:21, background = "#E7D4E8") |> 
  row_spec(22:26, background = "#FFAABB")
Retorno Risco
ibov 0.0379769 18.214420
vivo 0.0388613 42.230186
totvs -0.0029673 -503.682618
weg 0.3544639 3.167515
tim -0.0499303 -33.052475
localiza -0.2194780 -8.653851
transmissao_paulista -0.0460049 -30.983748
cemig 0.1968771 8.337587
engie 0.2263159 5.286272
taesa -0.0622991 -14.191695
cpfl -0.0993705 -14.953551
cyrela -0.1018746 -19.862232
aliansce 0.0070475 241.499458
ccr 0.0148388 93.363825
multiplan 0.0550332 30.767545
eztc 0.0791515 29.385511
suzano -0.2034760 -13.574925
vibra 0.0438815 40.975063
klabin 0.0000000 Inf
csn_mineracao 0.0229436 100.080600
gerdau 0.0469226 29.728891
slc 0.0409822 38.199974
fleury 0.1194938 10.966891
hypera -0.0239141 -82.878390
minerva 0.1323446 18.689462
arezo 0.0015944 942.785491
Código
# Definir as empresas e seus tickers
empresas2 <- c(
  ibov = "^BVSP",
  vivo = "vivt3.sa", 
  totvs = "tots3.sa", 
  weg = "wege3.sa", 
  tim = "tims3.sa", 
  localiza = "rent3.sa", 
  transmissao_paulista = "trpl3.sa", 
  cemig = "cmig3.sa",
  engie = "egie3.sa", 
  taesa = "taee3.sa", 
  cpfl = "cpfe3.sa", 
  cyrela = "cyre3.sa", 
  aliansce = "alos3.sa", 
  ccr = "ccro3.sa", 
  multiplan = "mult3.sa", 
  eztc = "eztc3.sa", 
  suzano = "suzb3.sa", 
  vibra = "vbbr3.sa", 
  klabin = "klbn3.sa", 
  csn_mineracao = "cmin3.sa", 
  gerdau = "ggbr3.sa",
  slc = "slce3.sa",
  fleury = "flry3.sa",
  hypera = "hype3.sa",
  minerva = "beef3.sa",
  arezo = "arzz3.sa"
)

# Função para calcular beta e p-valor para uma empresa específica
calcular_beta <- function(ticker, index_ticker, dataini, datafim) {
  # Obter dados de fechamento para a empresa e o índice
  preco_empresa <- na.omit(get.hist.quote(instrument = ticker, quote = "Close", start = dataini, end = datafim, retclass = "zoo"))
  preco_indice <- na.omit(get.hist.quote(instrument = index_ticker, quote = "Close", start = dataini, end = datafim, retclass = "zoo"))
  
  # Calcular retornos diários
  retorno_empresa <- diff(log(preco_empresa))
  retorno_indice <- diff(log(preco_indice))
  
  # Ajustar comprimentos se necessário
  n <- min(length(retorno_empresa), length(retorno_indice))
  retorno_empresa <- retorno_empresa[1:n]
  retorno_indice <- retorno_indice[1:n]
  
  # Calcular beta e p-valor usando regressão linear simples
  modelo <- lm(retorno_empresa ~ retorno_indice)
  beta <- coef(modelo)[2]
  pvalor <- summary(modelo)$coefficients[2, 4]
  
  list(beta = beta, pvalor = pvalor)
}

# Calcular beta e p-valor para cada empresa em relação ao índice Bovespa
resultados <- lapply(empresas2[-1], function(ticker) {
  calcular_beta(ticker, empresas2["ibov"], dataini, datafim)
})
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
time series ends   2024-07-19
Código
# Criar data frame com os resultados
df_resultados <- data.frame(
  Empresa = names(resultados),
  Beta = sapply(resultados, function(res) res$beta),
  P_valor = sapply(resultados, function(res) res$pvalor)
) %>%
  arrange(desc(Beta))  # Ordenar por beta decrescente

# Exibir a tabela de resultados com kable
kable(df_resultados[,-1], caption = "Beta Mercado", format = "html") |> 
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"))
Beta Mercado
Beta P_valor
eztc.retorno_indice 2.0432259 0.0000003
cyrela.retorno_indice 1.8756348 0.0000000
localiza.retorno_indice 1.7458951 0.0000000
multiplan.retorno_indice 1.6489462 0.0000000
csn_mineracao.retorno_indice 1.5730156 0.0001311
minerva.retorno_indice 1.5138134 0.0007508
vibra.retorno_indice 1.4081974 0.0000078
hypera.retorno_indice 1.3559927 0.0001341
ccr.retorno_indice 1.0950261 0.0000062
fleury.retorno_indice 1.0354156 0.0000063
vivo.retorno_indice 0.9462028 0.0015976
gerdau.retorno_indice 0.9109368 0.0002914
tim.retorno_indice 0.8951672 0.0031374
cemig.retorno_indice 0.8416580 0.0054265
cpfl.retorno_indice 0.7892085 0.0038814
arezo.retorno_indice 0.7745893 0.0051837
totvs.retorno_indice 0.7389855 0.0074777
engie.retorno_indice 0.6797449 0.0018942
suzano.retorno_indice 0.6077161 0.2457088
aliansce.retorno_indice 0.6034199 0.0589438
taesa.retorno_indice 0.5920593 0.0001938
klabin.retorno_indice 0.5254745 0.0119201
slc.retorno_indice 0.4423381 0.1345073
weg.retorno_indice 0.2655299 0.2116855
transmissao_paulista.retorno_indice 0.2169622 0.4233427

Histogramas dos Retornos das Empresas

Código
# Função para criar histogramas usando 'hist' do R base
criar_histograma <- function(retorno, nome) {
  hist(retorno, breaks = 30, main = nome, xlab = "Retorno", ylab = "Frequência", col = "#006860", border = "#40A8A0")
}

# Definir layout para exibir múltiplos histogramas
par(mfrow = c(3, 2))

# Criar histogramas para todas as empresas, agrupando em conjuntos de 5 empresas mais o IBOV
for (i in seq(1, length(empresas) - 1, by = 5)) {
  criar_histograma(retornos[[1]], "IBOV")
  for (j in i:min(i+4, length(empresas) - 1)) {
    criar_histograma(retornos[[j + 1]], names(empresas)[j + 1])
  }
  # Esperar antes de mostrar o próximo conjunto
  if (i + 5 < length(empresas)) {
    readline(prompt="Conjunto de 5 Empresas + IBOV")
  }
}

Conjunto de 5 Empresas + IBOV

Conjunto de 5 Empresas + IBOV

Conjunto de 5 Empresas + IBOV

Conjunto de 5 Empresas + IBOV

Normalidade dos Retornos