Ativos que serão analisados: - VALE3.SA; - USIM5.SA; - PETR4.SA; - Índice Ibovespa.
Período: de 2009-11-30 a 2020-09-20.
## 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>
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
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)
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)
É 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.