1 Risco dos ativos

Ativos que serão analisados: - VALE3.SA; - USIM5.SA; - PETR4.SA; - Índice Ibovespa.

Período: de 2009-11-30 a 2020-09-20.

Exercício nº01

## Loading required package: BatchGetSymbols
## Loading required package: rvest
## Loading required package: xml2
## Loading required package: dplyr
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
## 
## Loading required package: tidyverse
## ── Attaching packages ──────────────────────────────────────────────── tidyverse 1.3.0 ──
## ✓ ggplot2 3.3.2     ✓ purrr   0.3.4
## ✓ tibble  3.0.3     ✓ stringr 1.4.0
## ✓ tidyr   1.1.2     ✓ forcats 0.5.0
## ✓ readr   1.3.1
## ── Conflicts ─────────────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter()         masks stats::filter()
## x readr::guess_encoding() masks rvest::guess_encoding()
## x dplyr::lag()            masks stats::lag()
## x purrr::pluck()          masks rvest::pluck()
## [1] "VALE3.SA" "USIM5.SA" "PETR4.SA" "^BVSP"
## 
## Running BatchGetSymbols for:
## 
##    tickers =VALE3.SA, USIM5.SA, PETR4.SA, ^BVSP
##    Downloading data for benchmark ticker
## ^GSPC | yahoo (1|1) | Found cache file
## VALE3.SA | yahoo (1|4) | Not Cached | Saving cache - Got 96% of valid prices | Youre doing good!
## USIM5.SA | yahoo (2|4) | Found cache file - Got 96% of valid prices | OK!
## PETR4.SA | yahoo (3|4) | Found cache file - Got 96% of valid prices | Youre doing good!
## ^BVSP | yahoo (4|4) | Found cache file - Got 96% of valid prices | Well done!
## List of 2
##  $ df.control: tibble [4 × 6] (S3: tbl_df/tbl/data.frame)
##   ..$ ticker              : chr [1:4] "VALE3.SA" "USIM5.SA" "PETR4.SA" "^BVSP"
##   ..$ src                 : chr [1:4] "yahoo" "yahoo" "yahoo" "yahoo"
##   ..$ download.status     : chr [1:4] "OK" "OK" "OK" "OK"
##   ..$ total.obs           : int [1:4] 2682 2682 2682 2682
##   ..$ perc.benchmark.dates: num [1:4] 0.961 0.961 0.961 0.961
##   ..$ threshold.decision  : chr [1:4] "KEEP" "KEEP" "KEEP" "KEEP"
##  $ df.tickers: tibble [524 × 10] (S3: tbl_df/tbl/data.frame)
##   ..$ ticker             : chr [1:524] "^BVSP" "^BVSP" "^BVSP" "^BVSP" ...
##   ..$ ref.date           : Date[1:524], format: "2009-11-30" "2009-12-01" ...
##   ..$ volume             : num [1:524] 2224800 25856400 32866000 27096400 37817200 ...
##   ..$ price.open         : num [1:524] 67082 67051 68587 65402 66511 ...
##   ..$ price.high         : num [1:524] 67044 NA 70729 67836 70372 ...
##   ..$ price.low          : num [1:524] 67044 NA 65070 62763 67228 ...
##   ..$ price.close        : num [1:524] 67044 68546 70045 66572 67228 ...
##   ..$ price.adjusted     : num [1:524] 67044 68546 70045 66572 67228 ...
##   ..$ ret.adjusted.prices: num [1:524] NA 0.0224 0.02187 -0.04958 0.00985 ...
##   ..$ ret.closing.prices : num [1:524] NA 0.0224 0.02187 -0.04958 0.00985 ...
## # A tibble: 6 x 10
##   ticker ref.date   volume price.open price.high price.low price.close
##   <chr>  <date>      <dbl>      <dbl>      <dbl>     <dbl>       <dbl>
## 1 ^BVSP  2009-11-30 2.22e6      67082      67044     67044       67044
## 2 ^BVSP  2009-12-01 2.59e7      67051         NA        NA       68546
## 3 ^BVSP  2010-01-04 3.29e7      68587      70729     65070       70045
## 4 ^BVSP  2010-02-01 2.71e7      65402      67836     62763       66572
## 5 ^BVSP  2010-03-01 3.78e7      66511      70372     67228       67228
## 6 ^BVSP  2010-04-01 3.43e7      70375      71785     66511       71136
## # … with 3 more variables: price.adjusted <dbl>, ret.adjusted.prices <dbl>,
## #   ret.closing.prices <dbl>

Exercício nº02

Para determinar a variabilidade destes ativos, será utilizado o seguinte algoritmo.

## Loading required package: quantmod
## Loading required package: xts
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## 
## Attaching package: 'xts'
## The following objects are masked from 'package:dplyr':
## 
##     first, last
## Loading required package: TTR
## Version 0.4-0 included new data defaults. See ?getSymbols.
## Loading required package: plyr
## ------------------------------------------------------------------------------
## You have loaded plyr after dplyr - this is likely to cause problems.
## If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
## library(plyr); library(dplyr)
## ------------------------------------------------------------------------------
## 
## Attaching package: 'plyr'
## The following object is masked from 'package:purrr':
## 
##     compact
## The following objects are masked from 'package:dplyr':
## 
##     arrange, count, desc, failwith, id, mutate, rename, summarise,
##     summarize
## Loading required package: parallel
## 
## Attaching package: 'rugarch'
## The following object is masked from 'package:purrr':
## 
##     reduce
## The following object is masked from 'package:stats':
## 
##     sigma
## [1] "VALE3.SA"
##           mu        omega       alpha1        beta1        shape 
## 0.0037694141 0.0009296188 0.1547464365 0.7784134838 9.1843619875

## [1] "USIM5.SA"
##           mu        omega       alpha1        beta1        shape 
## -0.007156812  0.006533702  0.230175223  0.630282548  5.402207288

## [1] "PETR4.SA"
##           mu        omega       alpha1        beta1        shape 
## 0.0003756553 0.0033992890 0.2779029570 0.6038123294 4.4802286089

## [1] "^BVSP"
##           mu        omega       alpha1        beta1        shape 
## 6.266101e-03 1.050168e-05 1.797695e-04 9.988201e-01 5.288198e+00

Exercício nº03

Para cálculo da carteira igualmente ponderada, será feita a consideração de soma dos retornos.

  df.tickersnew <- na.omit(df.tickers)
  base1 <- subset(df.tickersnew, ticker == my.tickers[1])
  base2 <- subset(df.tickersnew, ticker == my.tickers[2])
  base3 <- subset(df.tickersnew, ticker == my.tickers[3])
  base4 <- subset(df.tickersnew, ticker == my.tickers[4])
  base1 <- base1[,c(2,10)]
  base2 <- base2[,c(2,10)]
  base3 <- base3[,c(2,10)]
  base4 <- base4[,c(2,10)]
  basefinal <- inner_join(base1,base2, by = "ref.date")
  basefinal <- inner_join(basefinal,base3, by = "ref.date")
  basefinal <- inner_join(basefinal,base4, by = "ref.date")
  colnames(basefinal)<- c("Data",my.tickers[1],my.tickers[2],my.tickers[3],my.tickers[4])
  va <- 0
  carteira <- rep(NA,length = nrow(basefinal))
 for (j in 1:nrow(basefinal)) {
   
   for (i in 2:5) {
    
    va <- va + basefinal[j,i]
    
   }
   va <- va/4
   carteira[j] <- va
   va <-0
 }

carteira <- as.data.frame(cbind(carteira))

gspec.ru <- ugarchspec(mean.model = list(armaOrder=c(0,0)), variance.model = list(model = "sGARCH",garchOrder=c(1,1)), distribution = "std")

gfit.ru <- ugarchfit(gspec.ru, carteira)

print(coef(gfit.ru))
##          mu       omega      alpha1       beta1       shape 
## 0.003003248 0.001944381 0.221407172 0.645380143 5.742920484
plot(sqrt(252)*gfit.ru@fit$sigma, type ="l",xaxt = "n", col=3, ylab="Volatilidade Anual",xlab="")
axis(1,at=1:length(gfit.ru@fit$sigma),labels = basefinal$Data, las = 2, gap.axis = 1/4, cex.axis=0.75)

Exercício nº04

Para fazer a volatilidade anual, irei baixar novamente os dados, agora de forma anual.

require(BatchGetSymbols)
require(tidyverse)

my.tickers <- c('VALE3.SA','USIM5.SA','PETR4.SA','^BVSP')
my.tickers
## [1] "VALE3.SA" "USIM5.SA" "PETR4.SA" "^BVSP"
first.date <- '2009-11-30'
last.date <- '2020-09-20'

my.l <- BatchGetSymbols(tickers = my.tickers,
                        first.date = first.date,
                        freq.data = 'yearly',
                        last.date = last.date)
## 
## Running BatchGetSymbols for:
##    tickers =VALE3.SA, USIM5.SA, PETR4.SA, ^BVSP
##    Downloading data for benchmark ticker
## ^GSPC | yahoo (1|1) | Found cache file
## VALE3.SA | yahoo (1|4) | Found cache file - Got 96% of valid prices | You got it!
## USIM5.SA | yahoo (2|4) | Found cache file - Got 96% of valid prices | Nice!
## PETR4.SA | yahoo (3|4) | Found cache file - Got 96% of valid prices | Good stuff!
## ^BVSP | yahoo (4|4) | Found cache file - Got 96% of valid prices | Nice!
glimpse(my.l)
## List of 2
##  $ df.control: tibble [4 × 6] (S3: tbl_df/tbl/data.frame)
##   ..$ ticker              : chr [1:4] "VALE3.SA" "USIM5.SA" "PETR4.SA" "^BVSP"
##   ..$ src                 : chr [1:4] "yahoo" "yahoo" "yahoo" "yahoo"
##   ..$ download.status     : chr [1:4] "OK" "OK" "OK" "OK"
##   ..$ total.obs           : int [1:4] 2682 2682 2682 2682
##   ..$ perc.benchmark.dates: num [1:4] 0.961 0.961 0.961 0.961
##   ..$ threshold.decision  : chr [1:4] "KEEP" "KEEP" "KEEP" "KEEP"
##  $ df.tickers: tibble [48 × 10] (S3: tbl_df/tbl/data.frame)
##   ..$ ticker             : chr [1:48] "^BVSP" "^BVSP" "^BVSP" "^BVSP" ...
##   ..$ ref.date           : Date[1:48], format: "2009-11-30" "2010-01-04" ...
##   ..$ volume             : num [1:48] 2.81e+07 4.44e+08 5.82e+08 7.46e+08 1.20e+09 ...
##   ..$ price.open         : num [1:48] 67082 68587 69310 NA 60990 ...
##   ..$ price.high         : num [1:48] NA 72996 71633 NA 63312 ...
##   ..$ price.low          : num [1:48] NA 58192 48668 NA 45044 ...
##   ..$ price.close        : num [1:48] 67044 70045 69962 NA 62550 ...
##   ..$ price.adjusted     : num [1:48] 67044 70045 69962 NA 62550 ...
##   ..$ ret.adjusted.prices: num [1:48] NA 0.04476 -0.00118 NA NA ...
##   ..$ ret.closing.prices : num [1:48] NA 0.04476 -0.00118 NA NA ...
df.tickers <- my.l$df.tickers

head(df.tickers)
## # A tibble: 6 x 10
##   ticker ref.date   volume price.open price.high price.low price.close
##   <chr>  <date>      <dbl>      <dbl>      <dbl>     <dbl>       <dbl>
## 1 ^BVSP  2009-11-30 2.81e7      67082         NA        NA       67044
## 2 ^BVSP  2010-01-04 4.44e8      68587      72996     58192       70045
## 3 ^BVSP  2011-01-03 5.82e8      69310      71633     48668       69962
## 4 ^BVSP  2012-01-02 7.46e8         NA         NA        NA          NA
## 5 ^BVSP  2013-01-02 1.20e9      60990      63312     45044       62550
## 6 ^BVSP  2014-01-02 8.83e8      51522      61896     44966       50341
## # … with 3 more variables: price.adjusted <dbl>, ret.adjusted.prices <dbl>,
## #   ret.closing.prices <dbl>
require(quantmod)
require(plyr)
library(rugarch)

gspec.ru <- ugarchspec(mean.model = list(armaOrder=c(0,0)), variance.model = list(model = "sGARCH",garchOrder=c(1,1)), distribution = "std")


for (i in 1:length(my.tickers)){
  
print(my.tickers[i])
banco <- na.omit(subset(df.tickers,ticker==my.tickers[i]))
gfit.ru <- ugarchfit(gspec.ru, (banco$ret.closing.prices))

print(coef(gfit.ru))

plot(sqrt(12)*gfit.ru@fit$sigma, type ="l",xaxt = "n", col=3, ylab="Volatilidade Anual",xlab="")
axis(1,at=1:length(gfit.ru@fit$sigma),labels = banco$ref.date, las = 2, gap.axis = 1/4, cex.axis=0.75)
}
## [1] "VALE3.SA"
## Warning in .sgarchfit(spec = spec, data = data, out.sample = out.sample, : 
## ugarchfit-->waring: using less than 100 data
##  points for estimation
##           mu        omega       alpha1        beta1        shape 
## 1.990983e-02 9.229534e-01 6.024638e-08 9.989999e-01 2.100000e+00
## [1] "USIM5.SA"
## Warning in .sgarchfit(spec = spec, data = data, out.sample = out.sample, : 
## ugarchfit-->waring: using less than 100 data
##  points for estimation

##           mu        omega       alpha1        beta1        shape 
## 6.531894e-03 2.389466e+00 7.860937e-08 9.989998e-01 2.100000e+00
## [1] "PETR4.SA"
## Warning in .sgarchfit(spec = spec, data = data, out.sample = out.sample, : 
## ugarchfit-->waring: using less than 100 data
##  points for estimation

##            mu         omega        alpha1         beta1         shape 
## -1.253778e-01  8.333848e-01  8.320840e-08  9.989998e-01  2.100000e+00
## [1] "^BVSP"
## Warning in .sgarchfit(spec = spec, data = data, out.sample = out.sample, : 
## ugarchfit-->waring: using less than 100 data
##  points for estimation

##            mu         omega        alpha1         beta1         shape 
## -8.067849e-02  2.930343e-12  2.592023e-06  8.274919e-01  9.999592e+01

  df.tickersnew <- na.omit(df.tickers)
  base1 <- subset(df.tickersnew, ticker == my.tickers[1])
  base2 <- subset(df.tickersnew, ticker == my.tickers[2])
  base3 <- subset(df.tickersnew, ticker == my.tickers[3])
  base4 <- subset(df.tickersnew, ticker == my.tickers[4])
  base1 <- base1[,c(2,10)]
  base2 <- base2[,c(2,10)]
  base3 <- base3[,c(2,10)]
  base4 <- base4[,c(2,10)]
  basefinal <- inner_join(base1,base2, by = "ref.date")
  basefinal <- inner_join(basefinal,base3, by = "ref.date")
  basefinal <- inner_join(basefinal,base4, by = "ref.date")
  colnames(basefinal)<- c("Data",my.tickers[1],my.tickers[2],my.tickers[3],my.tickers[4])
  va <- 0
  carteira <- rep(NA,length = nrow(basefinal))
 for (j in 1:nrow(basefinal)) {
   
   for (i in 2:5) {
    
    va <- va + basefinal[j,i]
    
   }
   va <- va/4
   carteira[j] <- va
   va <-0
 }

carteira <- as.data.frame(cbind(carteira))

gspec.ru <- ugarchspec(mean.model = list(armaOrder=c(0,0)), variance.model = list(model = "sGARCH",garchOrder=c(1,1)), distribution = "std")

gfit.ru <- ugarchfit(gspec.ru, carteira)
## Warning in .sgarchfit(spec = spec, data = data, out.sample = out.sample, : 
## ugarchfit-->waring: using less than 100 data
##  points for estimation
print(coef(gfit.ru))
##            mu         omega        alpha1         beta1         shape 
## -3.740560e-01  9.328812e-16  1.711647e-04  4.166221e-04  4.450633e+00
plot(sqrt(252)*gfit.ru@fit$sigma, type ="l",xaxt = "n", col=3, ylab="Volatilidade Anual",xlab="")
axis(1,at=1:length(gfit.ru@fit$sigma),labels = basefinal$Data, las = 2, gap.axis = 1/4, cex.axis=0.75)

Exercício nº05

É possível observar que ao fazer a análise da volatilidade anual, ocorreram erros de dados e os dados são poucos para fazer uma análise mais precisa dos dados. Sendo assim, a análise mensal e diária são melhores pela quantidade de dados.