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(tidyverse)
library(fBasics)
library(knitr)
library(xts)
library(kableExtra)
library(gridExtra)

Intervalo Tempora Utilizado

2024/03/07 a 2024/07/17

Código
# Intervalo de Tempo dos dados
dataini <- "2024-03-07"
datafim <- "2024-07-17"

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-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
Código
# Checar o tamanho da amostra para 'vivo'
length(retornos$vivo)
[1] 90
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 = "#4393C3") |>  # 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 Volatilidade
ibov 0.0066464 105.189337 11.09835
vivo -0.0765681 -19.536172 23.74586
totvs -0.0576149 -27.977062 25.58803
weg 0.2612269 4.254763 17.64386
tim -0.1120233 -14.489860 25.76753
localiza -0.1643344 -11.318074 29.52578
transmissao_paulista -0.0034041 -420.217698 22.70783
cemig 0.1736197 9.308681 25.65591
engie 0.1427441 8.682088 19.67355
taesa -0.0199521 -38.835584 12.30038
cpfl -0.0311073 -43.726992 21.59294
cyrela -0.1617305 -12.859589 33.01560
aliansce -0.0951991 -15.712669 23.74559
ccr -0.0763152 -17.551065 21.26253
multiplan -0.0489248 -31.329678 24.33241
eztc -0.0728741 -32.775507 37.91601
suzano -0.0917103 -25.558031 37.20882
vibra -0.0550685 -30.824057 26.94592
klabin 0.0602318 20.871957 19.95673
csn_mineracao -0.1221805 -19.074082 36.99525
gerdau 0.0299727 49.456179 23.53132
slc 0.0115442 128.714347 23.58791
fleury 0.0035442 379.010682 21.32425
hypera -0.1385065 -14.161193 31.13654
minerva 0.0378357 62.457441 37.51340
arezo -0.1059380 -18.091487 30.42471
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-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
time series ends   2024-07-16
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 1.8275034 0.0000001
cyrela.retorno_indice 1.8060515 0.0000000
csn_mineracao.retorno_indice 1.7060948 0.0000003
localiza.retorno_indice 1.7050493 0.0000000
multiplan.retorno_indice 1.4409926 0.0000000
arezo.retorno_indice 1.2941934 0.0000026
hypera.retorno_indice 1.2075721 0.0000229
minerva.retorno_indice 1.1340228 0.0012267
ccr.retorno_indice 1.0532425 0.0000000
vibra.retorno_indice 1.0340264 0.0000285
fleury.retorno_indice 0.8675744 0.0000079
aliansce.retorno_indice 0.8480969 0.0001098
tim.retorno_indice 0.8121092 0.0007265
gerdau.retorno_indice 0.7920991 0.0002869
engie.retorno_indice 0.7819779 0.0000135
totvs.retorno_indice 0.7103816 0.0031326
vivo.retorno_indice 0.7030677 0.0015664
cpfl.retorno_indice 0.6767097 0.0007820
klabin.retorno_indice 0.6568561 0.0003998
cemig.retorno_indice 0.5711490 0.0188911
taesa.retorno_indice 0.5013060 0.0000076
slc.retorno_indice 0.4248689 0.0588821
suzano.retorno_indice 0.3930405 0.2711478
weg.retorno_indice 0.2863377 0.0893694
transmissao_paulista.retorno_indice -0.0327610 0.8809322

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