Questão 1

Você deve escolher 4 (quatro) variáveis disponı́veis no Yahoo Finance e verificar os fatos estilizados de séries temporais financeiras, seguindo aproximadamente o que foi mostrado na aula.


Fatos Estilizados

Séries Temporais Financeiras: Fatos estilizados

  • caudas pesadas: retornos de ativos são leptocúrticos (Mandelbrot, 1963; Fama (1963, 1965), ou seja, possuem caudas pesadas - coeficiente de curtose maior que 3. Lembrando que o valor de referência 3 é o que resulta da distribuição Normal. Dessa forma, seria mais apropriado usar distribuições com caudas pesadas para modelagem do retorno de ativos, tais como Pareto-Lévy, t-Student, entre outras.

  • efeitos de alavancagem: Black (1976) observou que os movimentos de preço são negativamente correlacionados com a volatilidade. Se há queda nos preços da empresa, ocorre um aumento da alavancagem (endividamento/valor ativo total) e aumento da incerteza o que tende a gerar aumento da volatilidade.

  • efeito calendário: retorno/volatilidade variam com o calendário. Exemplo: efeito dia da semana (maior retorno às segundas, etc), proximidade de feriados, intradiários.

  • ausência de correlação linear: retornos não autocorrelacionados. Em geral, a série de retornos é estacionária, com média ao redor de zero. Ajustar um modelo ARMA é desafiador e o melhor que poderemos fazer, muitas vezes, é um AR(1).

  • quadrados dos retornos são autocorrelacionados: heterocedasticidade condicional. Séries temporais financeiras revelam instantes de tempo de alta e baixa volatilidade que se agrupam (clusters de volatilidade). De fato, agrupamentos de volatilidade e caudas pesadas estão relacionados.

  • co-movimentos de volatilidade: globalização dos mercados aumenta a volatilidade e co-movimentos. Contágio.

  • efeito de bad news: mercado fica mais “nervoso” com más notícias (bad news) do que com boas notícias (good news).

fonte: Slides Aula


Resposta 1:

Inicialmente, fazemos o download de 4 variáveis do Yahoo Finance (https://finance.yahoo.com/, https://br.financas.yahoo.com/world-indices/) utilizando o pacote BatchGetSymbols (https://www.rdocumentation.org/packages/BatchGetSymbols/versions/2.6.4/topics/BatchGetSymbols).

OBS: Iremos considerar o seguinte período para análise: de 01/jan/2019 a 01/jul/2023. Além disso, para simplificar, assumiremos que a expressão retorno se refere tanto ao retorno do preço diário (taxa de mundança) como ao log (logaritmo natural) desse valor.

Referências: - https://www.b3.com.br/pt_br/produtos-e-servicos/negociacao/renda-variavel/empresas-listadas.htm (Consulta de empresas listadas na B3) - https://br.financas.yahoo.com/quote/%5EBVSP/components/ (30 principais componentes da Ibovespa, principal indicador de desempenho das ações negociadas na B3)

library(BatchGetSymbols, quietly=TRUE)
# ?BatchGetSymbols
# install.packages("BatchGetSymbols", dependencies=TRUE)
# https://stackoverflow.com/questions/31008877/unable-to-install-rvest-package

# define data
date_init <- "2019-01-01"
# date_end <- Sys.Date()
date_end <- "2023-07-01"

# download de dados de ativos no Yahoo Finance
tickers <- c("PETR3.SA", "VALE3.SA", "JBSS3.SA", "PETR4.SA")
assets <- BatchGetSymbols(tickers = tickers,
                          first.date = date_init,
                          last.date = date_end,
                          type.return = "log", # log retorno
                          freq.data = "daily")

# head(assets)

print(assets$df.control$ticker)
## [1] "PETR3.SA" "VALE3.SA" "JBSS3.SA" "PETR4.SA"
glimpse(assets)
## List of 2
##  $ df.control: tibble [4 × 6] (S3: tbl_df/tbl/data.frame)
##   ..$ ticker              : chr [1:4] "PETR3.SA" "VALE3.SA" "JBSS3.SA" "PETR4.SA"
##   ..$ src                 : chr [1:4] "yahoo" "yahoo" "yahoo" "yahoo"
##   ..$ download.status     : chr [1:4] "OK" "OK" "OK" "OK"
##   ..$ total.obs           : int [1:4] 1117 1117 1117 1117
##   ..$ perc.benchmark.dates: num [1:4] 0.962 0.962 0.962 0.962
##   ..$ threshold.decision  : chr [1:4] "KEEP" "KEEP" "KEEP" "KEEP"
##  $ df.tickers:'data.frame':  4468 obs. of  10 variables:
##   ..$ price.open         : num [1:4468] 25.4 26.6 27.2 27.6 28.6 ...
##   ..$ price.high         : num [1:4468] 27 27.4 27.6 29.1 28.8 ...
##   ..$ price.low          : num [1:4468] 25.1 26.3 27.1 27.5 28.1 ...
##   ..$ price.close        : num [1:4468] 26.6 27.2 27.5 28.4 28.2 ...
##   ..$ volume             : num [1:4468] 14725300 12766200 10848500 16164400 12562900 ...
##   ..$ price.adjusted     : num [1:4468] 10.4 10.6 10.7 11.1 11 ...
##   ..$ ref.date           : Date[1:4468], format: "2019-01-02" "2019-01-03" ...
##   ..$ ticker             : chr [1:4468] "PETR3.SA" "PETR3.SA" "PETR3.SA" "PETR3.SA" ...
##   ..$ ret.adjusted.prices: num [1:4468] NA 0.0204 0.0113 0.0318 -0.0053 ...
##   ..$ ret.closing.prices : num [1:4468] NA 0.0204 0.0113 0.0318 -0.0053 ...
assets <- assets[[2]]

Análise preliminar

A seguir iremos gerar alguns gráficos, para cada um dos 4 ativos escolhidos no Yahoo Finance, de forma que possamos verificar alguns fatos estilizados de séries temporais financeiras.

Sobre a númeração dos tickers:

As ações são negociadas na bolsa de valores por um código de letras e números - o ticker. As quatro letras maiúsculas representam o nome do ativo. Já os números vão de 1 a 10 e representam, normalmente, o tipo de ativo:

. 1: ativo com direito de subscrição a uma Ação ordinária;

. 2: ativo com direito de subscrição a uma Ação preferencial;

. 3: Ação ordinária;

. 4: Ação preferencial;

. 5 a 8: Ações preferenciais das classes A a D;

. 9: subscrição de Ação ordinária;

. 10: subscrição de Ação preferencial.

As ações ordinárias, por ex. PETR3 (PETROBRAS) ou JBSS3 (JBS), são as mais comuns no mercado e garantem ao investidor o direito a voto nas assembleias deliberativas. Logo, permitem a participação na tomada de decisões, como escolha dos diretores, alterações no estatuto, etc.

As ações preferenciais, como a PETR4, garantem aos investidores a preferência no pagamento de dividendos e outras compensações. O mesmo acontece em caso de falência da companhia. Entretanto, normalmente não há direito a votos na assembleia, nem há a segurança do Tag Along. Outro ponto é que esses papéis são considerados exigíveis. Isso significa, basicamente, que a empresa pode solicitar as ações a qualquer momento.

Fonte: https://blog.genialinvestimentos.com.br/diferenca-entre-petr3-petr4/

PETR3 e PETR4 (PETRÓLEO BRASILEIRO S.A.- PETROBRAS)

Descrição: Petróleo Brasileiro S.A. (Petrobras) é uma empresa de capital aberto (sociedade anônima), cujo acionista majoritário é o Governo do Brasil (União), sendo, portanto, uma empresa estatal de economia mista. Com sede no Rio de Janeiro, opera atualmente em 14 países, no segmento de energia, prioritariamente nas áreas de exploração, produção, refino, comercialização e transporte de petróleo, gás natural e seus derivados. O seu lema atual é “Uma empresa integrada de energia que atua com responsabilidade social e ambiental”. Em 2020 Forbes Global 2000, a Petrobras foi classificada como a septuagésima maior empresa pública do mundo.

Fonte: https://pt.wikipedia.org/wiki/Petrobras

VALE3 (VALE S.A.)

Descrição: Vale S.A. é uma mineradora multinacional brasileira e uma das maiores operadoras de logística do país. É uma das maiores empresas de mineração do mundo e também a maior produtora de minério de ferro, de pelotas e de níquel. A empresa também produz manganês, ferroliga, cobre, bauxita, potássio, caulim, alumina e alumínio. No setor de energia elétrica, a empresa participa em consórcios e atualmente opera nove usinas hidrelétricas, no Brasil, no Canadá e na Indonésia. Em 2008, a empresa chegou a ser a 33° maior do mundo (de acordo com o Financial Times de 2008) e a maior do Brasil em volume de exportações. Em 2009, a marca e o nome de fantasia da empresa deixaram de ser Companhia Vale do Rio Doce (CVRD) e passaram a ser apenas Vale S.A., nome pelo qual sempre foi conhecida nas bolsas de valores.

Fonte: https://pt.wikipedia.org/wiki/Vale_S.A.

JBSS3 (JBS S.A.)

Descrição: JBS S.A. (B3: JBSS3) é uma empresa brasileira do setor de alimentosfundada em 1953 em Goiás. A companhia opera no processamento de carnes bovina, suína, ovina, de frango, de peixe e plant-based, além de atuar no processamento de couros. Além disso, comercializa produtos de higiene e limpeza, colágeno, embalagens metálicas, biodiesel, entre outros, sendo uma das maiores indústrias de alimentos do mundo. Suas principais operações incluem as marcas Seara, Swift e Friboi.

Fonte: https://pt.wikipedia.org/wiki/JBS

library(ggplot2)
library(gridExtra)
min(assets$ref.date)
## [1] "2019-01-02"
# preço diário
g <- ggplot(data=assets) +
  geom_line(mapping=aes(x=ref.date, y=price.close, color=ticker), 
            linewidth=0.8, na.rm=TRUE) +
  geom_rect(aes(xmin=as.Date("2019-11-01"), xmax=as.Date("2020-10-01"),
                ymin=0, ymax=150),
            fill="transparent", linetype=3, color="orange", size=1.2) +
  labs(x="", y="Preço de Fechamento", 
       title="Cotação Diária",
       subtitle=paste("Período: de ", date_init, " a ", date_end, sep=""),
       caption="Fonte: B3") +
  theme_minimal()
g

# retorno diário
g.returns <- ggplot(data=assets) +
  geom_line(aes(x=ref.date, y=ret.closing.prices, color=ticker),
            alpha=0.7, linewidth=0.4, na.rm=TRUE) +
  geom_rect(aes(xmin=as.Date("2019-11-01"), xmax=as.Date("2020-10-01"), 
                ymin=-0.4, ymax=0.3),
            fill="transparent", linetype=3, color="orange", size=1.2) +
  labs(x="" , y="Retornos",
       title="Retorno Diário",
        subtitle=paste("Período: de", date_init, " a ", date_end, sep=""), 
        caption="Fonte: B3") +
    theme_minimal()
g.returns

grid.arrange(g, g.returns, nrow=1, ncol=2)

Pelos gráficos acima, notamos que a média dos retornos oscila em torno de 0. Além disso, a cotação diária e os retornos possuem o efeito da alavancagem, pois por volta do primeiro semestre de 2020 o preço dos ativos caiu bruscamente (vide gráfico da Cotaçõ Diária, o trecho em destaque). O gráfico de retornos mostra que no mesmo período a volatilidade aumentou e há uma correlação negativa entre os retornos e os preços. De fato, foi neste período que a pandemia de COVID-19 (uma bad news) começou a crescer no Brasil, período de muitas incertezas em todos os setores.

A seguir temos um gráfico dos valores absolutos dos retornos. Notemos que as altas varições destacadas, indicam a ocorrência de alta volatilidade, portanto período de alta incerteza. Os períodos destacados em vermelho indicam períodos cuja alta volatilidade esteve presente nos retornos dos 4 ativos. Já os períodos em azul indicam uma possível diminuição da volatilidade, se comparado com o os que estão em vermelho.

# retornos absolutos 
g.volatility <- ggplot(data=assets) +
  geom_line(aes(x=ref.date, y=abs(ret.closing.prices), color=ticker),
            alpha=0.7, linewidth=0.4, na.rm=TRUE) +
  geom_rect(aes(xmin=as.Date("2019-11-01"), xmax=as.Date("2020-10-01"), 
                ymin=0, ymax=0.37),
            fill="transparent", linetype=2, color="red", size=1) +
  geom_rect(aes(xmin=as.Date("2021-01-01"), xmax=as.Date("2021-06-01"), 
                ymin=0, ymax=0.25),
            fill="transparent", linetype=2, color="red", size=1) +
  geom_rect(aes(xmin=as.Date("2021-07-01"), xmax=as.Date("2022-04-01"), 
                ymin=0, ymax=0.1),
            fill="transparent", linetype=2, color="blue", size=0.8) +
  geom_rect(aes(xmin=as.Date("2022-05-01"), xmax=as.Date("2023-02-01"), 
                ymin=0, ymax=0.15),
            fill="transparent", linetype=2, color="red", size=1) +
  geom_rect(aes(xmin=as.Date("2023-03-01"), xmax=as.Date("2023-06-20"), 
                ymin=0, ymax=0.1),
            fill="transparent", linetype=2, color="blue", size=0.8) +
  labs( x="", y="Retorno Absoluto",
        title="Retorno Absoluto",
        subtitle=paste("Período: ", date_init, " - ", date_end, sep=""),
        caption="Fonte: B3")+
  theme_minimal()
g.volatility

# qqplot
# ?stat_qq()
qqplot <- ggplot(data=assets, 
                 aes(sample=ret.closing.prices, color=ticker)) +
  stat_qq(na.rm=TRUE) +
  stat_qq_line(na.rm=TRUE) +
    labs(x="Quantis teóricos (Normais)", y="Quantis amostra", 
         title="Q-Q plot",
         subtitle="Retornos diários da PETR3.SA",
         caption="Fonte: B3") +
  theme_minimal() +
  facet_wrap(~ticker, nrow=2)
qqplot

# histograma
histogram <- ggplot(data=assets) +
  geom_histogram(aes(x=ret.closing.prices, y=after_stat(density), 
                     fill=ticker, color=ticker),
                 linetype=1, alpha=0.5, bins=30, na.rm=TRUE) +
  geom_density(aes(x=ret.closing.prices, y=after_stat(density), color=ticker),
               na.rm=TRUE, linewidth=0.7) +
  labs(x="", y="Densidade", title="Histograma",
       subtitle="Retornos diários",
       caption="Fonte: B3") +
  theme_minimal() +
  facet_wrap(~ticker, nrow=2)
histogram

Os gráficos Q-Q plot mostram que como seus percentis são afastados da Normal quando analisamos suas caudas, então a distribuição do retorno possui cauda pesada. Portanto, eventos raros ocorrem com certa frequência e devem ser considerados nas análises desta série temporal. Notemos ainda que, pelos histogramas, a média da distribuição dos retornos é zero.


Questão 2. Extra

Calcule as principais estatı́sticas descritivas das variáveis: média, desvio-padrão, variância, curtose, assimetria, etc.

Resposta 2:

Iremos realizar o cálculos de nosso sumário estatístico para cada um dos 4 ativos aqui analisados utilizando o pacote fBasics (https://rdocumentation.org/packages/fBasics/versions/4022.94).

PETR3

petro3 <- assets %>% 
  filter(ticker=="PETR3.SA")

daily_returns_petro3 <- petro3 %>%
  select(ref.date, ticker, ret.closing.prices) 

# "package to investigate basic properties of financial returns 
# and related quantities" [fonte: help]
library(fBasics)
# ?fBasics

# computa resumo estatístico
basicStats(daily_returns_petro3$ret.closing.prices)
##             X..daily_returns_petro3.ret.closing.prices
## nobs                                       1117.000000
## NAs                                           1.000000
## Minimum                                      -0.352054
## Maximum                                       0.205024
## 1. Quartile                                  -0.012887
## 3. Quartile                                   0.015391
## Mean                                          0.000194
## Median                                        0.001097
## Sum                                           0.216744
## SE Mean                                       0.000948
## LCL Mean                                     -0.001665
## UCL Mean                                      0.002053
## Variance                                      0.001002
## Stdev                                         0.031653
## Skewness                                     -2.153570
## Kurtosis                                     22.775560

PETR4

petro4 <- assets %>% 
  filter(ticker=="PETR4.SA")

daily_returns_petro4 <- petro4 %>%
  select(ref.date, ticker, ret.closing.prices) 

# computa resumo estatístico
basicStats(daily_returns_petro4$ret.closing.prices)
##             X..daily_returns_petro4.ret.closing.prices
## nobs                                       1117.000000
## NAs                                           1.000000
## Minimum                                      -0.352367
## Maximum                                       0.200671
## 1. Quartile                                  -0.012532
## 3. Quartile                                   0.015650
## Mean                                          0.000184
## Median                                        0.001133
## Sum                                           0.204856
## SE Mean                                       0.000932
## LCL Mean                                     -0.001645
## UCL Mean                                      0.002012
## Variance                                      0.000969
## Stdev                                         0.031135
## Skewness                                     -2.223955
## Kurtosis                                     23.194841

VALE3

vale <- assets %>% 
  filter(ticker=="VALE3.SA")

daily_returns_vale <- vale %>%
  select(ref.date, ticker, ret.closing.prices) 

# computa resumo estatístico
basicStats(daily_returns_vale$ret.closing.prices)
##             X..daily_returns_vale.ret.closing.prices
## nobs                                     1117.000000
## NAs                                         1.000000
## Minimum                                    -0.281822
## Maximum                                     0.193574
## 1. Quartile                                -0.013494
## 3. Quartile                                 0.012907
## Mean                                        0.000205
## Median                                      0.000000
## Sum                                         0.228726
## SE Mean                                     0.000795
## LCL Mean                                   -0.001354
## UCL Mean                                    0.001764
## Variance                                    0.000705
## Stdev                                       0.026548
## Skewness                                   -0.776034
## Kurtosis                                   17.340391

JBSS3

jbs <- assets %>% 
  filter(ticker=="JBSS3.SA")

daily_returns_jbs <- jbs %>%
  select(ref.date, ticker, ret.closing.prices) 

# computa resumo estatístico
basicStats(daily_returns_jbs$ret.closing.prices)
##             X..daily_returns_jbs.ret.closing.prices
## nobs                                    1117.000000
## NAs                                        1.000000
## Minimum                                   -0.154627
## Maximum                                    0.219915
## 1. Quartile                               -0.014014
## 3. Quartile                                0.014224
## Mean                                       0.000333
## Median                                     0.000000
## Sum                                        0.371678
## SE Mean                                    0.000816
## LCL Mean                                  -0.001268
## UCL Mean                                   0.001934
## Variance                                   0.000743
## Stdev                                      0.027259
## Skewness                                   0.422424
## Kurtosis                                   8.087909

Analisemos os valores obtidos acima. Para a PETR3 a curtose calculada foi de K = 20.09. Então os retornos deste ativo são leptocúrticos. Portanto, há uma maior probabilidade de eventos extremos (positivos ou negativos) ocorrerem, se comparado a distribuição Normal. De fato, já que K > 3, então essa distribuição possui excesso de curtose (consequentemente, cauda pesada) e a distribuição Normal parece não ser a distribuição mais adequada para modelar tais valores de retornos. Distribuições como t-Student, ou distribuição de Laplace são mais adequadas para este caso. O mesmo ocorre para os demais ativos (PETR4, VALE3, JBSS3), sendo que a volatilidade para os retornos da JBSS3 são os menos voláteis no período analisado, pois sua curtose é K = 8.81, isto é, menos que a metade dos demais. Além disso, outro fato é que a média de cada um dos 4 ativos aqui estudados é zero.


Testes de hipótese da normalidade para média e curtose

Calculemos os testes de t-Student e de Jarque-Bera para rejeitarmos (ou não) as hipóteses nulas de média zero e de curtose K=3, respectivamente.

PETR3

# ?t.test
# teste de t-Student para normalidade
t.test(na.exclude(daily_returns_petro3$ret.closing.prices))
## 
##  One Sample t-test
## 
## data:  na.exclude(daily_returns_petro3$ret.closing.prices)
## t = 0.20498, df = 1115, p-value = 0.8376
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  -0.001664878  0.002053309
## sample estimates:
##    mean of x 
## 0.0001942151

Como o p do teste acima foi p > 0.05, então não podemos rejeitar a hipótese nula de que a média da distribuição é Normal (i.e., a média é zero).

# ?jarqueberaTest
# teste de Jarque-Bera para normalidade
jarqueberaTest(na.exclude(daily_returns_petro3$ret.closing.prices))
## 
## Title:
##  Jarque - Bera Normalality Test
## 
## Test Results:
##   STATISTIC:
##     X-squared: 25083.804
##   P VALUE:
##     Asymptotic p Value: < 2.2e-16

Como o p do teste foi p < 0.05, então rejeitamos a hipótese nula de que a curtose K da distribuição é Normal (K=3). Portanto, a distribuição dos retornos da PETR3 tem cauda pesada.

PETR4, VALE3, JBSS3

print("PETR4")
## [1] "PETR4"
# teste de t-Student para normalidade
t.test(na.exclude(daily_returns_petro4$ret.closing.prices))
## 
##  One Sample t-test
## 
## data:  na.exclude(daily_returns_petro4$ret.closing.prices)
## t = 0.19696, df = 1115, p-value = 0.8439
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  -0.001645099  0.002012225
## sample estimates:
##    mean of x 
## 0.0001835628
# teste de Jarque-Bera para normalidade
jarqueberaTest(na.exclude(daily_returns_petro4$ret.closing.prices))
## 
## Title:
##  Jarque - Bera Normalality Test
## 
## Test Results:
##   STATISTIC:
##     X-squared: 26040.9628
##   P VALUE:
##     Asymptotic p Value: < 2.2e-16
print("VALE3")
## [1] "VALE3"
t.test(na.exclude(daily_returns_vale$ret.closing.prices))
## 
##  One Sample t-test
## 
## data:  na.exclude(daily_returns_vale$ret.closing.prices)
## t = 0.2579, df = 1115, p-value = 0.7965
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  -0.001354328  0.001764232
## sample estimates:
##    mean of x 
## 0.0002049515
jarqueberaTest(na.exclude(daily_returns_vale$ret.closing.prices))
## 
## Title:
##  Jarque - Bera Normalality Test
## 
## Test Results:
##   STATISTIC:
##     X-squared: 14153.2883
##   P VALUE:
##     Asymptotic p Value: < 2.2e-16
print("JBSS3")
## [1] "JBSS3"
t.test(na.exclude(daily_returns_jbs$ret.closing.prices))
## 
##  One Sample t-test
## 
## data:  na.exclude(daily_returns_jbs$ret.closing.prices)
## t = 0.40816, df = 1115, p-value = 0.6832
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  -0.001267971  0.001934061
## sample estimates:
##    mean of x 
## 0.0003330449
jarqueberaTest(na.exclude(daily_returns_jbs$ret.closing.prices))
## 
## Title:
##  Jarque - Bera Normalality Test
## 
## Test Results:
##   STATISTIC:
##     X-squared: 3090.0282
##   P VALUE:
##     Asymptotic p Value: < 2.2e-16

O valor do p do teste de t-Student foi p > 0.05 para PETR4, VALE3 e JBSS3. Logo, não podemos rejeitar a hipótese nula de que a média é zero).

Além do mais, como o p do teste de Jarque-Bera foi p < 0.05 para PETR4, VALE e JBSS3, então rejeitamos a hipótese nula de que a curtose da distribuição é Normal (K=3). Portanto, concluímos que a distribuição dos retornos dos ativos PETR4, VALE3 e JBSS3 tem cauda pesada.

Gráficos em comparação com a distribuição Normal

Abaixo refizemos o gráfico dos histograma dos 4 ativos, acrescentando o gráfico de uma distribuição Normal com média e variância iguais a um dos ativos. Apenas para fins de comparação, fixamos o mesmo valor para os 4 gráficos.

Para simplificar, ao invés de considerarmos as distribuições Normais com mesma média e variância, escolhemos fixar esses valores no ativo com maior variância \(\sigma^2\) (o que equivale a maior desvio padrão \(\sigma\)). Portanto, adicionamos aos histogramas a distribuição Normal com média = 0 e \(\sigma\) = 0.031653 (desvio padrão da PETR3). Além disso, buscando melhorar a visualização, também reduzimos o intervalo do eixo x dos gráficos.

# histograma
xmin <- -0.15
xmax <- 0.15
assests_subset <- assets[assets$ret.closing.prices>=xmin &
                           assets$ret.closing.prices<=xmax, ]

petro3_subset <- petro3[petro3$ret.closing.prices>=xmin & 
                         petro3$ret.closing.prices<=xmax, ]

histogram0 <- ggplot(data=na.exclude(assests_subset)) +
  geom_histogram(aes(x=ret.closing.prices,
                        y=after_stat(density), 
                     fill=ticker, color=ticker),
                 linetype=1, alpha=0.5, bins=30, na.rm=TRUE) +
  geom_density(aes(x=ret.closing.prices, y=after_stat(density), color=ticker),
               na.rm=TRUE, linewidth=0.7) +
  stat_function(data=assets, 
                fun=dnorm,
                n=length(na.exclude(petro3_subset$ret.closing.prices)),
                args=list(mean=0, 
                          sd=0.031653),
                linetype=5, linewidth=0.7) +
  labs(x="", y="Densidade", title="Histograma",
       subtitle="Retornos diários",
       caption="Fonte: B3") +
  theme_minimal() +
  facet_wrap(~ticker, nrow=2)
histogram0

# histograma
xmin <- -0.01
xmax <- 0.4
assests_subset <- assets[assets$ret.closing.prices>=xmin &
                           assets$ret.closing.prices<=xmax, ]

petro3_subset <- petro3[petro3$ret.closing.prices>=xmin & 
                         petro3$ret.closing.prices<=xmax, ]

histogram2 <- ggplot(data=na.exclude(assests_subset)) +
  geom_histogram(aes(x=ret.closing.prices,
                        y=after_stat(density), 
                     fill=ticker, color=ticker),
                 linetype=1, alpha=0.5, bins=30, na.rm=TRUE) +
  geom_density(aes(x=ret.closing.prices, y=after_stat(density), color=ticker),
               na.rm=TRUE, linewidth=0.7) +
  stat_function(data=assets, 
                fun=dnorm,
                n=length(na.exclude(petro3_subset$ret.closing.prices)),
                args=list(mean=0, 
                          sd=0.031653),
                linetype=5, linewidth=0.7) +
  labs(x="", y="Densidade", title="Histograma",
       subtitle="Retornos diários",
       caption="Fonte: B3") +
  theme_minimal() +
  facet_wrap(~ticker, nrow=2)
histogram2

# class(histogram2)

# histograma
xmin <- 0.05
xmax <- 0.4
assests_subset <- assets[assets$ret.closing.prices>=xmin &
                           assets$ret.closing.prices<=xmax, ]

petro3_subset <- petro3[petro3$ret.closing.prices>=xmin & 
                         petro3$ret.closing.prices<=xmax, ]

histogram3 <- ggplot(data=na.exclude(assests_subset)) +
  geom_histogram(aes(x=ret.closing.prices,
                        y=after_stat(density), 
                     fill=ticker, color=ticker),
                 linetype=1, alpha=0.5, bins=10, na.rm=TRUE) +
  geom_density(aes(x=ret.closing.prices, y=after_stat(density), color=ticker),
               na.rm=TRUE, linewidth=0.7) +
  stat_function(data=assets, 
                fun=dnorm,
                n=length(na.exclude(petro3_subset$ret.closing.prices)),
                args=list(mean=0, 
                          sd=0.031653),
                linetype=5, linewidth=0.7) +
  labs(x="", y="Densidade", title="Histograma",
       subtitle="Retornos diários",
       caption="Fonte: B3") +
  theme_minimal() +
  facet_wrap(~ticker, nrow=2)
histogram3

Pelas linhas tracejada em preto nos gráficos acima, referentes a distribuição Normal, notamos que a média da distribuição calculada é zero. Além disso, os gráfico que focam nas caudas das distribuções, mostram o efeito de cauda pesada dos retornos. A parte colorida fica acima da linha tracejada conforme analisamos as extremidades das caudas de cada uma das 4 distribuições dos respectivos ativos.


Questão 3. Extra

Calcule o coeficiente de correlação entre dois retornos e faça o gráfico de dispersão.

Resposta 3:

A seguir calculamos algumas das correlações entre os 4 ativos.

#?cor
cor(na.exclude(petro3$ret.closing.prices), 
    na.exclude(vale$ret.closing.prices))
## [1] 0.4656771
cor(na.exclude(petro4$ret.closing.prices), 
    na.exclude(vale$ret.closing.prices))
## [1] 0.446543
cor(na.exclude(petro3$ret.closing.prices), 
    na.exclude(jbs$ret.closing.prices))
## [1] 0.3444307
cor(na.exclude(petro4$ret.closing.prices), 
    na.exclude(jbs$ret.closing.prices))
## [1] 0.3330509
cor(na.exclude(petro3$ret.closing.prices), 
    na.exclude(petro4$ret.closing.prices))
## [1] 0.9764284
cor(na.exclude(petro4$ret.closing.prices), 
    na.exclude(jbs$ret.closing.prices))
## [1] 0.3330509
cor(na.exclude(vale$ret.closing.prices), 
    na.exclude(jbs$ret.closing.prices))
## [1] 0.295631

Notemos que a maior correlação ocorre entre PETR3 e PETR4, e a menor entre JBS3 e VALE3, sendo os respectivos ceficientes de correlação iguais a 0.976 e 0.296.

#fit_cor1 <- lm(na.exclude(vale$ret.closing.prices) ~
#                 na.exclude(jbs$ret.closing.prices))
#summary(fit_cor1)

g_cor1 <- ggplot(mapping=aes(x=na.exclude(vale$ret.closing.prices), 
                             y=na.exclude(jbs$ret.closing.prices)),
                 na.rm=TRUE) +
  geom_point(size=2, alpha=0.3, color="violet") + 
  geom_smooth(method="lm", color="black", na.rm=TRUE) +
  labs(title="Gráfico de dispersão - VALE3 x JBS3",
       y="Retorno JBS3",
       x="Retorno VALE3")
g_cor1

g_cor2 <- ggplot(mapping=aes(x=na.exclude(petro3$ret.closing.prices), 
                             y=na.exclude(petro4$ret.closing.prices)),
                 na.rm=TRUE) +
  geom_point(size=2, alpha=0.3, color="#007722") + 
  geom_smooth(method="lm", color="black", na.rm=TRUE) +
  labs(title="Gráfico de dispersão - VALE3 x JBS3",
       y="Retorno PETRO4",
       x="Retorno PETRO3")
g_cor2

g_cor3 <- ggplot(mapping=aes(x=na.exclude(petro3$ret.closing.prices), 
                             y=na.exclude(jbs$ret.closing.prices)),
                 na.rm=TRUE) +
  geom_point(size=2, alpha=0.3, color="#00aa77") +
  geom_smooth(method="lm", color="black", na.rm=TRUE) +
  labs(title="Gráfico de dispersão - JBS3 x PETRO3",
       y="Retorno JBS",
       x="Retorno PETRO3")
g_cor3

Observamos pelos gráficos de dispersão que os ativos da PETR3 e PTR4 possuem alta correlação. Já os demais gráficos mostram que ativos usados possuem baixa correlação. Por exemplo, o gráfico mostra que a correlação entre VALE3 e JBS3 é baixa, visto a disperão dos pontos. Isso está de acordo com a correlação calculada de 0.295631 para esses ativos no exercício anterior.


Questão 4. Extra

Você pode fazer também o mapa de calor para as correlações entre os quatro ativos escolhidos.

Resposta 4:

Vejamos os gráficos anteriores, considerando a aplicação de um mapa de calor.

Scatter plot

Retorno <- na.exclude(vale$ret.closing.prices)
g_cor1 <- ggplot(mapping=aes(x=na.exclude(vale$ret.closing.prices), 
                             y=na.exclude(jbs$ret.closing.prices),
                             color=Retorno),
                 na.rm=TRUE) +
  scale_colour_gradient(low="green", high="red") +
  geom_point(size=2, alpha=0.3) +
  geom_smooth(method="lm", color="black", na.rm=TRUE) +
  labs(title="Gráfico de dispersão dos retornos - JBS3 x VALE3",
       y="JBS3",
       x="VALE3") + 
  theme_minimal()
g_cor1

Retorno <- na.exclude(petro3$ret.closing.prices)
g_cor2 <- ggplot(mapping=aes(x=na.exclude(petro3$ret.closing.prices), 
                             y=na.exclude(petro4$ret.closing.prices),
                             color=Retorno),
                 na.rm=TRUE) +
  scale_colour_gradient(low="gray", high="red") +
  geom_point(size=2, alpha=0.3) +
  geom_smooth(method="lm", color="black", na.rm=TRUE) +
  labs(title="Gráfico de dispersão dos retornos - JBS3 x VALE3",
       y="PETR3",
       x="PETR4") + 
  theme_minimal()
g_cor2

g_cor3 <- ggplot(mapping=aes(x=na.exclude(petro3$ret.closing.prices), 
                             y=na.exclude(jbs$ret.closing.prices),
                             color=Retorno),
                 na.rm=TRUE) +
  geom_point(size=2, alpha=0.3) +
  scale_colour_gradient(low="blue", high="orange") +
  geom_smooth(method="lm", color="black", na.rm=TRUE) +
  labs(title="Gráfico de dispersão dos retornos - JBS3 x PETRO3",
       y="JBS3",
       x="PETRO3") + 
  theme_minimal()
g_cor3

Matriz de correlação - mapa de calor

list_returns <- list(petro3=na.exclude(petro3$ret.closing.prices), 
                     petro4=na.exclude(petro4$ret.closing.prices),
                     vale=na.exclude(vale$ret.closing.prices),
                     jbs=na.exclude(jbs$ret.closing.prices))

df_returns <- as.data.frame(list_returns)
# head(df_returns)
correlation_matrix <- round(cor(df_returns), 2)

# gráfico matriz de correlação
# install.packages("ggcorrplot")
library(ggcorrplot)
# ?ggcorrplot

ggcorrplot(correlation_matrix, hc.order=TRUE,
           outline.color="white",
           colors=c("blue", "white", "orange"))


REFERÊNCIAS: