Pegando os tickers

rm(list = ls())
# definir os códigos disponíveis no yahoo finance
#install.packages("BatchGetSymbols")
tickers <- c('EQTL3.SA', 'PETR4.SA', 'VALE3.SA', 'WEGE3.SA', 'EMBR3.SA')
# Variável numérica para o número de anos
timeframe <- 5
library(BatchGetSymbols)
## Loading required package: rvest
## 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
## 
# Limpa o carregamento em vermelho original. 
suppressMessages({
  assets <- BatchGetSymbols(tickers,
                            # A estrutura -365*timeframe seleciona o número de anos a partir da data do sistema
                            # seja ela qual for.
                            first.date = Sys.Date() - 365*timeframe,
                            last.date = Sys.Date(),
                            type.return = "log",
                            freq.data = "daily")
                })
## Warning: `BatchGetSymbols()` was deprecated in BatchGetSymbols 2.6.4.
## ℹ Please use `yfR::yf_get()` instead.
## ℹ 2022-05-01: Package BatchGetSymbols will soon be replaced by yfR.  More
##   details about the change is available at github
##   <<www.github.com/msperlin/yfR> You can install yfR by executing:
## 
## remotes::install_github('msperlin/yfR')
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

tranformando assets para dataframe

assets <- as.data.frame(assets)
summary(assets)
##  df.control.ticker  df.control.src     df.control.download.status
##  Length:6185        Length:6185        Length:6185               
##  Class :character   Class :character   Class :character          
##  Mode  :character   Mode  :character   Mode  :character          
##                                                                  
##                                                                  
##                                                                  
##                                                                  
##  df.control.total.obs df.control.perc.benchmark.dates
##  Min.   :1237         Min.   :0.9594                 
##  1st Qu.:1237         1st Qu.:0.9594                 
##  Median :1237         Median :0.9594                 
##  Mean   :1237         Mean   :0.9594                 
##  3rd Qu.:1237         3rd Qu.:0.9594                 
##  Max.   :1237         Max.   :0.9594                 
##                                                      
##  df.control.threshold.decision df.tickers.price.open df.tickers.price.high
##  Length:6185                   Min.   :  5.91        Min.   :  6.08       
##  Class :character              1st Qu.: 18.80        1st Qu.: 19.07       
##  Mode  :character              Median : 25.10        Median : 25.50       
##                                Mean   : 32.00        Mean   : 32.46       
##                                3rd Qu.: 36.66        3rd Qu.: 37.25       
##                                Max.   :119.80        Max.   :120.45       
##                                                                           
##  df.tickers.price.low df.tickers.price.close df.tickers.volume  
##  Min.   :  5.77       Min.   :  6.03         Min.   :        0  
##  1st Qu.: 18.47       1st Qu.: 18.77         1st Qu.:  6293500  
##  Median : 24.70       Median : 25.15         Median : 11487700  
##  Mean   : 31.50       Mean   : 31.98         Mean   : 24552686  
##  3rd Qu.: 36.04       3rd Qu.: 36.61         3rd Qu.: 30697300  
##  Max.   :115.25       Max.   :118.72         Max.   :490230400  
##                                                                 
##  df.tickers.price.adjusted df.tickers.ref.date  df.tickers.ticker 
##  Min.   : 4.479            Min.   :2018-06-25   Length:6185       
##  1st Qu.:12.381            1st Qu.:2019-09-24   Class :character  
##  Median :20.430            Median :2020-12-22   Mode  :character  
##  Mean   :26.531            Mean   :2020-12-23                     
##  3rd Qu.:33.504            3rd Qu.:2022-03-25                     
##  Max.   :95.894            Max.   :2023-06-21                     
##                                                                   
##  df.tickers.ret.adjusted.prices df.tickers.ret.closing.prices
##  Min.   :-0.352367              Min.   :-0.352367            
##  1st Qu.:-0.011859              1st Qu.:-0.012003            
##  Median : 0.000389              Median : 0.000300            
##  Mean   : 0.000776              Mean   : 0.000526            
##  3rd Qu.: 0.013811              3rd Qu.: 0.013704            
##  Max.   : 0.200671              Max.   : 0.200671            
##  NA's   :5                      NA's   :5
# Exibe os 5 primeiros dados
head(assets)
##   df.control.ticker df.control.src df.control.download.status
## 1          EQTL3.SA          yahoo                         OK
## 2          PETR4.SA          yahoo                         OK
## 3          VALE3.SA          yahoo                         OK
## 4          WEGE3.SA          yahoo                         OK
## 5          EMBR3.SA          yahoo                         OK
## 6          EQTL3.SA          yahoo                         OK
##   df.control.total.obs df.control.perc.benchmark.dates
## 1                 1237                       0.9593949
## 2                 1237                       0.9593949
## 3                 1237                       0.9593949
## 4                 1237                       0.9593949
## 5                 1237                       0.9593949
## 6                 1237                       0.9593949
##   df.control.threshold.decision df.tickers.price.open df.tickers.price.high
## 1                          KEEP                11.398                11.896
## 2                          KEEP                11.890                11.914
## 3                          KEEP                11.514                11.572
## 4                          KEEP                11.252                11.654
## 5                          KEEP                11.502                11.606
## 6                          KEEP                11.364                11.772
##   df.tickers.price.low df.tickers.price.close df.tickers.volume
## 1               11.398                 11.802           5316500
## 2               11.462                 11.514           5794500
## 3               11.250                 11.252           3397000
## 4               11.250                 11.560           4871500
## 5               11.356                 11.356           8182500
## 6               11.306                 11.700           3956500
##   df.tickers.price.adjusted df.tickers.ref.date df.tickers.ticker
## 1                  10.62555          2018-06-25          EQTL3.SA
## 2                  10.36626          2018-06-26          EQTL3.SA
## 3                  10.13037          2018-06-27          EQTL3.SA
## 4                  10.40767          2018-06-28          EQTL3.SA
## 5                  10.22401          2018-06-29          EQTL3.SA
## 6                  10.53372          2018-07-02          EQTL3.SA
##   df.tickers.ret.adjusted.prices df.tickers.ret.closing.prices
## 1                             NA                            NA
## 2                    -0.02470525                   -0.02470533
## 3                    -0.02301794                   -0.02301780
## 4                     0.02700508                    0.02700502
## 5                    -0.01780467                   -0.01780467
## 6                     0.02984263                    0.02984259
# Exibindo o nome de todas as colunas baixadas. 
colnames(assets)
##  [1] "df.control.ticker"               "df.control.src"                 
##  [3] "df.control.download.status"      "df.control.total.obs"           
##  [5] "df.control.perc.benchmark.dates" "df.control.threshold.decision"  
##  [7] "df.tickers.price.open"           "df.tickers.price.high"          
##  [9] "df.tickers.price.low"            "df.tickers.price.close"         
## [11] "df.tickers.volume"               "df.tickers.price.adjusted"      
## [13] "df.tickers.ref.date"             "df.tickers.ticker"              
## [15] "df.tickers.ret.adjusted.prices"  "df.tickers.ret.closing.prices"
# Criar um dataframe contendo somente informações úteis numéricas. 
# cbind junta tudo dentro do ()
# antes do = nomeia a coluna
# depois do = recebe a coluna do dataframe original
# Pegar uma coluna do dataframe df$coluna, df = nome do dataframe, coluna = resultados de colnames
ativos <- as.data.frame(cbind(Data = assets[which(colnames(assets) == "df.tickers.ref.date")],
                             Ticker = assets$df.tickers.ticker, # Aparentemente faz mais sentido que            
                             # df.control.ticker" 
                             Open = assets$df.tickers.price.open,
                             Close = assets$df.tickers.price.close,
                             Low = assets$df.tickers.price.low,
                             High = assets$df.tickers.price.high,
                             Ajuste = assets$df.tickers.price.adjusted,
                             Volume = assets$df.tickers.volume))
              
# A estrutura df[] retorna a posição da coluna dentro do dataframe df. Por algum motivo o cbind desconfigura as tadas. 
# assets[which(colnames(assets) == "df.tickers.ref.date")] retorna a coluna em que a data estiver e coloca na 
# primeira posição do dataframe

# renomear a primeira coluna 
colnames(ativos)[1] <- "Data"

Estatística dos dados

# esta primeira visualização permite apenas avaliar a classe dos parâmetros: numéricos, categóricos e data e além disso entender se existem valores nulos baixados pela base. Caso existam NAs, a base precisará ser tratada
summary(ativos)
##       Data               Ticker               Open            Close       
##  Min.   :2018-06-25   Length:6185        Min.   :  5.91   Min.   :  6.03  
##  1st Qu.:2019-09-24   Class :character   1st Qu.: 18.80   1st Qu.: 18.77  
##  Median :2020-12-22   Mode  :character   Median : 25.10   Median : 25.15  
##  Mean   :2020-12-23                      Mean   : 32.00   Mean   : 31.98  
##  3rd Qu.:2022-03-25                      3rd Qu.: 36.66   3rd Qu.: 36.61  
##  Max.   :2023-06-21                      Max.   :119.80   Max.   :118.72  
##       Low              High            Ajuste           Volume         
##  Min.   :  5.77   Min.   :  6.08   Min.   : 4.479   Min.   :        0  
##  1st Qu.: 18.47   1st Qu.: 19.07   1st Qu.:12.381   1st Qu.:  6293500  
##  Median : 24.70   Median : 25.50   Median :20.430   Median : 11487700  
##  Mean   : 31.50   Mean   : 32.46   Mean   :26.531   Mean   : 24552686  
##  3rd Qu.: 36.04   3rd Qu.: 37.25   3rd Qu.:33.504   3rd Qu.: 30697300  
##  Max.   :115.25   Max.   :120.45   Max.   :95.894   Max.   :490230400
#Pode-se fazer um summary para cada coluna em específico na qual o Ticker é igual a um ativo. O exemplo prático é o seguinte:
# summary(subset(ativos, Ticker == "Coloque o ticker que você definiu e baixou "))

 summary(subset(ativos, Ticker == 'EQTL3.SA'))
##       Data               Ticker               Open           Close      
##  Min.   :2018-06-25   Length:1237        Min.   :11.23   Min.   :11.25  
##  1st Qu.:2019-09-24   Class :character   1st Qu.:18.90   1st Qu.:18.91  
##  Median :2020-12-22   Mode  :character   Median :22.91   Median :22.95  
##  Mean   :2020-12-23                      Mean   :21.81   Mean   :21.83  
##  3rd Qu.:2022-03-25                      3rd Qu.:25.00   3rd Qu.:25.03  
##  Max.   :2023-06-21                      Max.   :31.25   Max.   :31.15  
##       Low             High           Ajuste          Volume        
##  Min.   :11.13   Min.   :11.49   Min.   :10.13   Min.   : 2082600  
##  1st Qu.:18.64   1st Qu.:19.17   1st Qu.:17.22   1st Qu.: 4772700  
##  Median :22.63   Median :23.27   Median :21.82   Median : 6523600  
##  Mean   :21.48   Mean   :22.12   Mean   :20.67   Mean   : 7427455  
##  3rd Qu.:24.67   3rd Qu.:25.40   3rd Qu.:24.14   3rd Qu.: 9039900  
##  Max.   :30.99   Max.   :31.41   Max.   :31.15   Max.   :28311200
 # caso queiramos trabalhar com cada daframe isoladamente, podemos carrecar o subset deste jeito
 
 EQTL3 <- subset(ativos, Ticker == 'EQTL3.SA')
 # Agora podemos chamar diretamente EQTL3
 head(EQTL3)
##         Data   Ticker   Open  Close    Low   High   Ajuste  Volume
## 1 2018-06-25 EQTL3.SA 11.398 11.802 11.398 11.896 10.62555 5316500
## 2 2018-06-26 EQTL3.SA 11.890 11.514 11.462 11.914 10.36626 5794500
## 3 2018-06-27 EQTL3.SA 11.514 11.252 11.250 11.572 10.13037 3397000
## 4 2018-06-28 EQTL3.SA 11.252 11.560 11.250 11.654 10.40767 4871500
## 5 2018-06-29 EQTL3.SA 11.502 11.356 11.356 11.606 10.22401 8182500
## 6 2018-07-02 EQTL3.SA 11.364 11.700 11.306 11.772 10.53372 3956500
 # podemos fazer o processo repetidamente em código, trocando cada variável ou fazer de um jeito mais inteligente (porém menos acessivel). Todavia, o GPT nos ajuda com isso. Peça ao GPT para que cada item contido em tickers ele gere um dataframe utilizando subset. 

Gerando dataframes para cada ativo

# Retorna os valores únicos da coluna TICKER para você entender o FOR
unique(ativos$Ticker)
## [1] "EQTL3.SA" "PETR4.SA" "VALE3.SA" "WEGE3.SA" "EMBR3.SA"
# Retorna os valores do dataframe ticker
tickers
## [1] "EQTL3.SA" "PETR4.SA" "VALE3.SA" "WEGE3.SA" "EMBR3.SA"
# Para cada ticker dentro do dataframe tickers (você definiu){
for (i in tickers) {
  # cria-se um subset de ativos, no qual a coluna Ticker em ativos recebe o primeiro elemento (i) em tickers. 
  # na posição 1 i = EQTL3.SA, na posição 2 = PETR4.SA e assim até EMBR3.SA
  subset_dataframe <- subset(ativos, Ticker == i)
  # grava ticker como um dataframe com a variável subset_dataframe, para que vocÊ possa acessá-lo posteriormente)
  assign(i, subset_dataframe)
}

Acessando cada dataframe individualmente.

summary(EQTL3.SA)
##       Data               Ticker               Open           Close      
##  Min.   :2018-06-25   Length:1237        Min.   :11.23   Min.   :11.25  
##  1st Qu.:2019-09-24   Class :character   1st Qu.:18.90   1st Qu.:18.91  
##  Median :2020-12-22   Mode  :character   Median :22.91   Median :22.95  
##  Mean   :2020-12-23                      Mean   :21.81   Mean   :21.83  
##  3rd Qu.:2022-03-25                      3rd Qu.:25.00   3rd Qu.:25.03  
##  Max.   :2023-06-21                      Max.   :31.25   Max.   :31.15  
##       Low             High           Ajuste          Volume        
##  Min.   :11.13   Min.   :11.49   Min.   :10.13   Min.   : 2082600  
##  1st Qu.:18.64   1st Qu.:19.17   1st Qu.:17.22   1st Qu.: 4772700  
##  Median :22.63   Median :23.27   Median :21.82   Median : 6523600  
##  Mean   :21.48   Mean   :22.12   Mean   :20.67   Mean   : 7427455  
##  3rd Qu.:24.67   3rd Qu.:25.40   3rd Qu.:24.14   3rd Qu.: 9039900  
##  Max.   :30.99   Max.   :31.41   Max.   :31.15   Max.   :28311200
summary(PETR4.SA)
##       Data               Ticker               Open           Close      
##  Min.   :2018-06-25   Length:1237        Min.   :11.07   Min.   :11.29  
##  1st Qu.:2019-09-24   Class :character   1st Qu.:23.54   1st Qu.:23.57  
##  Median :2020-12-22   Mode  :character   Median :26.63   Median :26.68  
##  Mean   :2020-12-23                      Mean   :26.16   Mean   :26.15  
##  3rd Qu.:2022-03-25                      3rd Qu.:29.00   3rd Qu.:28.98  
##  Max.   :2023-06-21                      Max.   :37.65   Max.   :37.72  
##       Low             High           Ajuste           Volume         
##  Min.   :10.85   Min.   :12.18   Min.   : 4.479   Min.   : 17977100  
##  1st Qu.:23.15   1st Qu.:23.95   1st Qu.: 9.439   1st Qu.: 48877800  
##  Median :26.22   Median :26.97   Median :11.038   Median : 63598500  
##  Mean   :25.74   Mean   :26.57   Mean   :12.906   Mean   : 71791692  
##  3rd Qu.:28.58   3rd Qu.:29.27   3rd Qu.:16.109   3rd Qu.: 86264000  
##  Max.   :36.85   Max.   :38.39   Max.   :31.850   Max.   :490230400
summary(VALE3.SA)
##       Data               Ticker               Open            Close       
##  Min.   :2018-06-25   Length:1237        Min.   : 35.55   Min.   : 34.10  
##  1st Qu.:2019-09-24   Class :character   1st Qu.: 51.87   1st Qu.: 51.78  
##  Median :2020-12-22   Mode  :character   Median : 66.80   Median : 66.56  
##  Mean   :2020-12-23                      Mean   : 69.81   Mean   : 69.74  
##  3rd Qu.:2022-03-25                      3rd Qu.: 85.90   3rd Qu.: 85.72  
##  Max.   :2023-06-21                      Max.   :119.80   Max.   :118.72  
##       Low              High            Ajuste          Volume         
##  Min.   : 32.45   Min.   : 35.86   Min.   :24.84   Min.   :  4356600  
##  1st Qu.: 51.15   1st Qu.: 52.42   1st Qu.:36.80   1st Qu.: 18118600  
##  Median : 65.83   Median : 67.70   Median :61.28   Median : 23933600  
##  Mean   : 68.83   Mean   : 70.68   Mean   :57.60   Mean   : 26295480  
##  3rd Qu.: 84.72   3rd Qu.: 86.73   3rd Qu.:76.55   3rd Qu.: 31476600  
##  Max.   :115.25   Max.   :120.45   Max.   :95.89   Max.   :183534500
summary(WEGE3.SA)
##       Data               Ticker               Open           Close      
##  Min.   :2018-06-25   Length:1237        Min.   : 7.75   Min.   : 7.83  
##  1st Qu.:2019-09-24   Class :character   1st Qu.:11.90   1st Qu.:11.91  
##  Median :2020-12-22   Mode  :character   Median :30.30   Median :30.21  
##  Mean   :2020-12-23                      Mean   :26.10   Mean   :26.09  
##  3rd Qu.:2022-03-25                      3rd Qu.:36.66   3rd Qu.:36.61  
##  Max.   :2023-06-21                      Max.   :46.46   Max.   :46.10  
##       Low             High           Ajuste           Volume        
##  Min.   : 7.75   Min.   : 8.01   Min.   : 7.307   Min.   :       0  
##  1st Qu.:11.78   1st Qu.:12.11   1st Qu.:11.387   1st Qu.: 5594500  
##  Median :29.81   Median :30.78   Median :29.713   Median : 7460300  
##  Mean   :25.68   Mean   :26.53   Mean   :25.397   Mean   : 8595393  
##  3rd Qu.:36.07   3rd Qu.:37.23   3rd Qu.:35.486   3rd Qu.:10405200  
##  Max.   :44.80   Max.   :46.93   Max.   :44.467   Max.   :43934000
summary(EMBR3.SA)
##       Data               Ticker               Open           Close      
##  Min.   :2018-06-25   Length:1237        Min.   : 5.91   Min.   : 6.03  
##  1st Qu.:2019-09-24   Class :character   1st Qu.:12.78   1st Qu.:12.83  
##  Median :2020-12-22   Mode  :character   Median :17.93   Median :17.87  
##  Mean   :2020-12-23                      Mean   :16.10   Mean   :16.08  
##  3rd Qu.:2022-03-25                      3rd Qu.:19.50   3rd Qu.:19.48  
##  Max.   :2023-06-21                      Max.   :26.61   Max.   :26.95  
##       Low             High           Ajuste          Volume         
##  Min.   : 5.77   Min.   : 6.08   Min.   : 6.03   Min.   :   888800  
##  1st Qu.:12.51   1st Qu.:13.13   1st Qu.:12.83   1st Qu.:  3455400  
##  Median :17.66   Median :18.11   Median :17.87   Median :  7107500  
##  Mean   :15.79   Mean   :16.40   Mean   :16.08   Mean   :  8653408  
##  3rd Qu.:19.24   3rd Qu.:19.75   3rd Qu.:19.48   3rd Qu.: 11130300  
##  Max.   :26.11   Max.   :28.00   Max.   :26.91   Max.   :125473100

Fazendo o gráfico de Dispersão de ativos pelo preço de ajuste.

#insttal.packages(ggplot)
# Carregar as bibliotecas necessárias
library(ggplot2)

# Criar o gráfico de dispersão
ggplot(ativos, aes(x = Ticker, y = Ajuste)) +
  geom_point() +
  xlab("Ticker") +
  ylab("Preço") +
  ggtitle("Gráfico de Dispersão dos Preços por Ticker")

# O gráfico abaixo não representa muita coisa! já que a dimensão esta apenas no preço de ajuste. 

Fazendo o gráfico de Dispersão de ativos pelo preço de ajuste por volume diário

# muito similar ao código acima, porém vamos definir o tamanho com a coluna de volume
library(ggplot2)
library(scales)

# Criar o gráfico de dispersão com preço por volume
ggplot(ativos, aes(x = Ticker, y = Ajuste, size = Volume)) +
  geom_point() +
  xlab("Ticker") +
  ylab("Preço") +
  ggtitle("Gráfico de Dispersão: Preço por Volume") +
  scale_size_continuous(labels = comma)

library(ggplot2)
#install.packages("scales")
library(scales)

# Criar o gráfico de dispersão de ajuste por volume dividido em 5 painéis
ggplot(ativos, aes(x = Ajuste, y = Volume)) +
  geom_point() +
  xlab("Ajuste") +
  ylab("Volume") +
  ggtitle("Gráfico de Dispersão: Ajuste por Volume") +
  facet_wrap(~ Ticker, nrow = 1, ncol = 5) + # Linha que resolve o problema de exibição
  scale_y_continuous(labels = comma_format()) # Arruma o eixo Y de um jeito mais amigável

## Plotando a correlação entre as variáveis

# A opção mais simples é criar um dataframe com os preços de ajuste e plotar
# tentei plotar direto e não consegui


ajustes <- as.data.frame(cbind(WEG = WEGE3.SA$Ajuste,
                 VALE = VALE3.SA$Ajuste, 
                 EMBR = EMBR3.SA$Ajuste, 
                 PETR = PETR4.SA$Ajuste, 
                 EQTL = EQTL3.SA$Ajuste))
# Este é o jeito mais tranquilo
plot(ajustes)

# Converter a matriz em um dataframe
dados_cor <- as.data.frame(cor(ajustes))

# Obter as combinações de variáveis para as estéticas x e y
dados_cor$linhas <- rownames(dados_cor)
dados_cor <- reshape2::melt(dados_cor, id.vars = "linhas")

# Criar o heatmap
heatmap <- ggplot(data = dados_cor, aes(x = linhas, y = variable, fill = value)) +
  geom_tile() +
  scale_fill_gradient(low = "blue", high = "red") +
  labs(title = "Heatmap de Correlação") +
  theme_minimal()
print(heatmap)

## Plotando os dataframes em candlesticks (padrões de vela da análise técnica)

# Biblioteca
library(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
## 
## ######################### Warning from 'xts' package ##########################
## #                                                                             #
## # The dplyr lag() function breaks how base R's lag() function is supposed to  #
## # work, which breaks lag(my_xts). Calls to lag(my_xts) that you type or       #
## # source() into this session won't work correctly.                            #
## #                                                                             #
## # Use stats::lag() to make sure you're not using dplyr::lag(), or you can add #
## # conflictRules('dplyr', exclude = 'lag') to your .Rprofile to stop           #
## # dplyr from breaking base R's lag() function.                                #
## #                                                                             #
## # Code in packages is not affected. It's protected by R's namespace mechanism #
## # Set `options(xts.warn_dplyr_breaks_lag = FALSE)` to suppress this warning.  #
## #                                                                             #
## ###############################################################################
## 
## Attaching package: 'xts'
## The following objects are masked from 'package:dplyr':
## 
##     first, last
## Loading required package: TTR
# Vamos utilizar o dataframe 'ativos'
# Retirando Volume e Ajuste de ativos
candles <- subset(ativos, select = -c(Volume, Ajuste))

# Trocar ordem das colunas no dataframe candles
candles <- candles[, c("Data", "Ticker", "Open", "Close", "Low", "High")]

head(candles)
##         Data   Ticker   Open  Close    Low   High
## 1 2018-06-25 EQTL3.SA 11.398 11.802 11.398 11.896
## 2 2018-06-26 EQTL3.SA 11.890 11.514 11.462 11.914
## 3 2018-06-27 EQTL3.SA 11.514 11.252 11.250 11.572
## 4 2018-06-28 EQTL3.SA 11.252 11.560 11.250 11.654
## 5 2018-06-29 EQTL3.SA 11.502 11.356 11.356 11.606
## 6 2018-07-02 EQTL3.SA 11.364 11.700 11.306 11.772
# Loop para criar os gráficos de candlestick para cada ativo
for (ativo in tickers) {
  # Criar subset para o ativo atual
  subset_candles <- candles[candles$Ticker == ativo, ]

  # Configurar a coluna de data para o formato correto
  subset_candles$Data <- as.POSIXct(subset_candles$Data)

  # Criar objeto 'xts' apenas com as colunas relevantes
  subset_xts <- xts(subset_candles[, -(1:2)], order.by = subset_candles$Data)

  # Plotar o gráfico de candlestick
  chartSeries(subset_xts, type = "candlesticks", name = ativo, theme = chartTheme("white", col = c("green", "red")))
}

# Jeito fácil

#install.packages("plotly")
library(plotly)
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
library(htmltools)


candles2 <- subset(ativos, select = c(Data, Ticker, Open, Close, High, Low, Volume))
head(candles2)
##         Data   Ticker   Open  Close   High    Low  Volume
## 1 2018-06-25 EQTL3.SA 11.398 11.802 11.896 11.398 5316500
## 2 2018-06-26 EQTL3.SA 11.890 11.514 11.914 11.462 5794500
## 3 2018-06-27 EQTL3.SA 11.514 11.252 11.572 11.250 3397000
## 4 2018-06-28 EQTL3.SA 11.252 11.560 11.654 11.250 4871500
## 5 2018-06-29 EQTL3.SA 11.502 11.356 11.606 11.356 8182500
## 6 2018-07-02 EQTL3.SA 11.364 11.700 11.772 11.306 3956500
for (ativo in unique(candles2$Ticker)) {
  
  subset_candles <- subset(candles2, Ticker == ativo)
  subset_candles <- data.frame(Date = as.Date(index(subset_candles)), coredata(subset_candles))
  
  fig <- plot_ly(data = subset_candles, x = ~Date, type = "candlestick",
                 open = ~Open, close = ~Close,
                 high = ~High, low = ~Low, name = "Candles") 
  
  fig <- layout(fig, title = "Basic Candlestick Chart",
                xaxis = list(type = "date", rangeslider = list(visible = FALSE)))
  
  fig2 <- plot_ly(subset_candles, x = ~Date, y = ~Volume, type = 'bar', name = "Volume",
                  marker = list(color = ifelse(c(subset_candles$Volume[-1] > subset_candles$Volume[-length(subset_candles$Volume)]), "green", "red"))) 
  fig2 <- layout(fig2, yaxis = list(title = "Volume"))
  
  fig <- subplot(fig, fig2, heights = c(0.7, 0.2), nrows = 2,
                 shareX = TRUE, titleY = TRUE)
  html_print(fig)
  knitr::knit_print(fig)
}