O estudo da análise de dados envolve primordialmente transformar dados 'crus' em informação útil, de forma que seja comunicado de forma mais simples possível para que qualquer usuário possa entender. Um meio interessante de transformar esses dados em uma forma simples de visualização é criando uma dashboard. Esse tipo de painel interativo pode ser criado em diferentes áreas de estudos, o que não é diferente para as finanças. No post de hoje, apresentaremos uma dashboard básica para a análise de ações da bolsa de valores criada no R.
A dashboard deverá conter os principais indicadores dos quais o usuário pretende tirar seus insights. Nesta dashboard criada como exemplo, demonstramos o preço da ação, o retorno mensal, o retorno acumulado e o desvio padrão, sendo este um gráfico móvel no qual é possível ter uma estimativa do risco de mercado das ações analisadas. Podemos também colocar inputs dentro dessas dashboard de forma que seja possível ter mais flexibilidade.
Como podem ver na imagem, a barra lateral possui 3 inputs: o nome do ticker da ação (que pode ser encontrado no site do Yahoo Finanças), a data inicial de análise e a janela móvel do desvio padrão (e que funciona somente neste indicador).
Você pode conferir o resultado neste link.
Para criar a dashboard utilizou-se do seguinte YAML:
Com os seguintes pacotes:
library(tidyverse) library(highcharter) library(tidyquant) library(timetk) library(scales)
A criação da dashboard seguiu como uma junção da Flexdashboard e Shiny, além dos gráficos serem criados através do Highchart.
Sidebar {.sidebar}
=====================================
# Construção dos inputs da barra lateral do dashboard fluidRow( column(6, textInput("stock1", "Stock 1", "VIVT3.SA")) ) fluidRow( column(6, textInput("stock2", "Stock 2", "ITSA4.SA")) ) fluidRow( column(6, textInput("stock3", "Stock 3", "TAEE4.SA")) ) fluidRow( column(6, textInput("stock4", "Stock 4", "BRSR6.SA")) ) fluidRow( column(7, dateInput("date", "Starting Date", "2013-01-01", format = "yyyy-mm-dd")) ) fluidRow( column(6, numericInput("window", "Window", 6, min = 3, max = 20, step = 1)) ) actionButton("go", "Submit")
### Coleta, tratamento e calculos # Coleta os preços das ações prices <- eventReactive(input$go, { symbols <- c(input$stock1, input$stock2, input$stock3, input$stock4) getSymbols(symbols, src = 'yahoo', from = input$date, auto.assign = TRUE, warnings = FALSE) %>% map(~Ad(get(.))) %>% reduce(merge) %>% `colnames<-`(symbols) }) # Transforma os preços xts em mensal prices_monthly <- eventReactive(input$go, { prices <- prices() to.monthly(prices(), indexAt = "last", OHLC = FALSE) }) # Calcula os retornos mensais em xts e wide asset_returns_xts <- eventReactive(input$go, { asset_returns_xts <- na.omit(Return.calculate(prices_monthly(), method = "log")) }) # Transforma os preços em tibble, mensal e long prices_monthly_tbl_long <- eventReactive(input$go, { prices <- prices() asset_returns_long_tbl<- prices %>% to.monthly(indexAt = "last", OHLC = FALSE) %>% tk_tbl(preserve_index = TRUE, rename_index = "date") %>% gather(asset, prices, -date) }) # Calcula os retornos mensais em tibble e long asset_returns_long_tbl <- eventReactive(input$go, { prices_monthly_tbl_long <- prices_monthly_tbl_long() prices_monthly_tbl_long %>% group_by(asset) %>% mutate(returns = (log(prices) - log(lag(prices))) ) %>% na.omit() }) # Calcula o retornos acumulado asset_acum_return_tbl <- eventReactive(input$go, { asset_returns_long_tbl <- asset_returns_long_tbl() asset_acum_return_tbl <- asset_returns_long_tbl %>% group_by(asset) %>% mutate(acum_return = cumsum(returns)) }) # Calcula o desvio padrão móvel das ações (volatilidade) rolling_sd_tbl <- eventReactive(input$go, { rolling_sd_tbl <- rollapply(asset_returns_xts(), FUN = sd, width = input$window) %>% na.omit() %>% tk_tbl(preserve_index = TRUE, rename_index = "date") %>% gather(asset, sd, -date) })
Painel de Acompanhamento
=====================================
Row {data-height=600, .tabset}
-----------------------------------------------------------------------
### Preços
renderHighchart({ hchart(prices_monthly_tbl_long(), type = "line", hcaes(x = date, y = prices, group = asset)) %>% hc_yAxis(opposite = FALSE) %>% hc_tooltip(pointFormat = '{point.x: %Y-%m-%d} R${point.y:.4f}') })
### Retornos mensais
renderHighchart({ hchart(asset_returns_long_tbl(), type = "column", hcaes(x = date, y = returns * 100, group = asset)) %>% hc_yAxis(opposite = FALSE, labels = list(format = "{value}%")) %>% hc_tooltip(pointFormat = '{point.x: %Y-%m-%d} {point.y:.4f}% ') })
### Retornos Acumulados
renderHighchart({ hchart(asset_acum_return_tbl(), type = "line", hcaes(x = date, y = acum_return * 100, group = asset)) %>% hc_yAxis(opposite = FALSE, labels = list(format = "{value}%")) %>% hc_tooltip(pointFormat = '{point.x: %Y-%m-%d} {point.y:.4f}% ') })
Row {.tabset .tabset-fade}
-------------------------------------
### Desvio Padrão Móvel
renderHighchart({ hchart(rolling_sd_tbl(), type = "line", hcaes(x = date, y = sd * 100, group = asset)) %>% hc_yAxis(opposite = FALSE, labels = list(format = "{value}%")) %>% hc_tooltip(pointFormat = '{point.x: %Y-%m-%d} {point.y:.4f}% ') })
Quer aprender a criar dashboards financeiros? Veja nosso Curso de R para o Mercado Financeiro e Produção de Dashboards.