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) UNIVERSIDADE FEDERAL DA PARAÍBA
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)2024/03/07 a 2024/07/17
# Intervalo de Tempo dos dados
dataini <- "2024-03-07"
datafim <- "2024-07-17"Retorno, média dos Retornos, Desvio Padrão, Coeficiente de Variação e Beta Mercado.
# 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
# Checar o tamanho da amostra para 'vivo'
length(retornos$vivo)[1] 90
# 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 |
# 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
# 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 | 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 |
# 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