---
title: "B3 Indexes"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{B3 Indexes}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)
```

`rb3` comes with a diverse range of functions to explore the index delivered by the B3 Exchange.
These functions will be presented here.

```{r setup, message=FALSE, warning=FALSE}
library(rb3)
library(ggplot2)
library(dplyr)
library(stringr)
```

## B3 Indexes

The function `rb3::indexes_get` list the names of available indexes.

```{r indexes-get, eval=FALSE}
indexes_get()
```

```{r indexes-get-load, message=FALSE, warning=FALSE, echo=FALSE}
indexes_get_ <- try(indexes_get(), silent = TRUE)
if (is(indexes_get_, "try-error")) {
  load("indexes_get.rda")
}
indexes_get_
```

## Indexes Composition and Weights

The composition of B3 indexes are available through the function `rb3::index_weights_get`.
This function returns a data.frame with the current compostion of the requested index, all
symbols that compound the index, their weights and theoretical position.
Here the IBOVESPA (`IBOV`) Index has its composition listed.

```{r ibov-weights-get, eval=FALSE}
index_weights_get("IBOV")
```

```{r ibov-weights-get-load, message=FALSE, warning=FALSE, echo=FALSE}
ibov_weights_get_ <- try(index_weights_get("IBOV"), silent = TRUE)
if (is(ibov_weights_get_, "try-error")) {
  load("indexes_data.rda")
}
ibov_weights_get_
```

The IBr100 Index (`IBXX`)

```{r ibxx-weights-get, eval=FALSE}
index_weights_get("IBXX")
```

```{r ibxx-weights-get-load, message=FALSE, warning=FALSE, echo=FALSE}
ibxx_weights_get_ <- try(index_weights_get("IBXX"), silent = TRUE)
if (is(ibxx_weights_get_, "try-error")) {
  load("indexes_data.rda")
}
ibxx_weights_get_
```

The Small Caps Index (`SMLL`)

```{r smll-weights-get, eval=FALSE}
index_weights_get("SMLL")
```

```{r smll-weights-get-load, message=FALSE, warning=FALSE, echo=FALSE}
smll_weights_get_ <- try(index_weights_get("SMLL"), silent = TRUE)
if (is(smll_weights_get_, "try-error")) {
  load("indexes_data.rda")
}
smll_weights_get_
```

### Index Composition

`rb3::index_comp_get` returns a vector with symbols that compound the given index.

```{r smll-comp-get, eval=FALSE}
index_comp_get("SMLL")
```

```{r smll-comp-get-load, message=FALSE, warning=FALSE, echo=FALSE}
smll_comp_get_ <- try(index_comp_get("SMLL"), silent = TRUE)
if (is(smll_comp_get_, "try-error")) {
  load("indexes_data.rda")
}
smll_comp_get_
```

### Index by Segment

`rb3::index_by_segment_get` returns a data.frame with all stocks that are in the index, their
economic segment, weights, position and segment weight in the index.

```{r ibov-by-segment-get, eval=FALSE}
index_by_segment_get("IBOV")
```

```{r ibov-by-segment-get-load, message=FALSE, warning=FALSE, echo=FALSE}
ibov_by_segment_get_ <- try(index_by_segment_get("IBOV"), silent = TRUE)
if (is(ibov_by_segment_get_, "try-error")) {
  load("indexes_data.rda")
}
ibov_by_segment_get_
```

## Indexes Time Series

`rb3` downloads data from B3 website to build time series for B3 indexes.

The function `rb3::index_get` downloads data from B3 for the given index name and returns
data structured in a data.frame.
The index names are obtained with `rb3::indexes_get` function.

```{r ibov-get-2019-load, message=FALSE, warning=FALSE, echo=FALSE}
index_name <- "IBOV"
index_data <- try(index_get(index_name, as.Date("2019-01-01")), silent = TRUE)
if (is(index_data, "try-error")) {
  load("indexes_data.rda")
  index_data <- ibov_data_1
}
```

```{r ibov-get-2019, eval=FALSE}
index_name <- "IBOV"
index_data <- index_get(index_name, as.Date("2019-01-01"))
```

```{r ibov-get-2019-echo}
head(index_data)
```

The returned data.frame has three columns: `refdate`, `index_name` and `value`.

```{r ibov-get-2019-plot, fig.width=7, fig.height=3}
index_data |>
  ggplot(aes(x = refdate, y = value)) +
  geom_line() +
  labs(
    x = NULL, y = "Index",
    title = str_glue("{index_name} Historical Data"),
    caption = str_glue("Data imported using rb3")
  )
```

The IBOVESPA index starts at 1968 and the series is adjusted for all economic events the that
affected the Brazilian currency in the 80-90's decades.

```{r ibov-get-1968-load, message=FALSE, warning=FALSE, echo=FALSE}
index_name <- "IBOV"
index_data <- try(index_get(index_name, as.Date("1968-01-01")), silent = TRUE)
if (is(index_data, "try-error")) {
  load("indexes_data.rda")
  index_data <- ibov_data_2
}
```

```{r ibov-get-1968, eval=FALSE}
index_data <- index_get(index_name, as.Date("1968-01-01"))
index_data |>
  ggplot(aes(x = refdate, y = value)) +
  geom_line() +
  scale_y_log10() +
  labs(
    x = NULL, y = "Index (log scale)",
    title = str_glue("{index_name} Historical Data - since 1968"),
    caption = str_glue("Data imported using rb3")
  )
```

```{r ibov-get-1968-plot, message=FALSE, warning=FALSE, echo=FALSE, fig.width=7, fig.height=3}
index_data |>
  ggplot(aes(x = refdate, y = value)) +
  geom_line() +
  scale_y_log10() +
  labs(
    x = NULL, y = "Index (log scale)",
    title = str_glue("{index_name} Historical Data - since 1968"),
    caption = str_glue("Data imported using rb3")
  )
```

The y-axis was transformed to log scale in order to get the visualization improved.

Change `index_name` to get data for other indexes, for example, the Small Caps Index SMLL.

```{r smll-get-2010-load, message=FALSE, warning=FALSE, echo=FALSE}
index_name <- "SMLL"
index_data <- try(index_get(index_name, as.Date("2010-01-01")), silent = TRUE)
if (is(index_data, "try-error")) {
  load("indexes_data.rda")
  index_data <- smll_data
}
```

```{r smll-get-2010, eval=FALSE}
index_name <- "SMLL"
index_data <- index_get(index_name, as.Date("2010-01-01"))
```

```{r smll-get-2010-plot, fig.width=7, fig.height=3}
index_data |>
  ggplot(aes(x = refdate, y = value)) +
  geom_line() +
  labs(
    x = NULL, y = "Index",
    title = str_glue("{index_name} Historical Data"),
    caption = str_glue("Data imported using rb3")
  )
```

## Indexes Last Update

`rb3::indexes_last_update` returns the date where the indexes have been last updated.

```{r indexes-last-update, eval=FALSE}
indexes_last_update()
```