Tag

dataviz Archives - Análise Macro

Construindo uma dashboard de ações no R

By | mercado financeiro

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.

Visualizando dados com ggplot2

By | Data Science

Visualização de dados é uma habilidade essencial, seja para quando você quer plotar suas despesas e receitas mensais ou quando é pra gerar um relatório mais apresentável no seu trabalho. E com o pacote {ggplot2} essa tarefa fica mais simples, fácil e escalável. Neste exercício, vamos descobrir um pouco da mecânica por trás do pacote e como usá-lo para gerar seus primeiros gráficos!

Para reproduzir o exercício a seguir você precisará dos seguintes pacotes:


# Carregar pacotes/dependências
library(ggplot2) # CRAN v3.3.5
library(magrittr) # CRAN v2.0.2

Criando gráficos com ggplot2

O {ggplot2} funciona em camadas e, para facilitar o entendimento, pense que ao criar um {ggplot2} você está fazendo uma receita de torta onde você começa adicionando a base, depois a(s) camada(s) do recheio e, por fim, a cobertura. Tanto quanto o resultado final das tortas depende da habilidade da(o) confeiteira(o), o gráfico de {ggplot2} depende do empenho e conhecimento do(a) programador(a). E ambos podem ficar incrivelmente prazerosos aos olhos depois de prontos!

Com isso em mente, vamos a um exemplo criando um gráfico simples de dispersão. Para tal, usaremos o dataset economics, disponível no próprio pacote. Esse conjunto de dados traz informações de indicadores econômicos agregados da economia norte americana (EUA), possuindo como característica o atributo de série temporal.

Abaixo, por conveniência, salvamos os dados em objetos para trabalharmos com eles adiante. Perceba que eles estão disponíveis em dois formatos, wide e long, e é necessário que os dados sejam de classe data.frame/tibble. Primeiro uma inspeção visual nos dados:

# Datasets de exemplo: dados econômicos dos EUA
dados <- ggplot2::economics
dados_long <- ggplot2::economics_long
dados
# # A tibble: 574 x 6
# date pce pop psavert uempmed unemploy
# <date> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 1967-07-01 507. 198712 12.6 4.5 2944
# 2 1967-08-01 510. 198911 12.6 4.7 2945
# 3 1967-09-01 516. 199113 11.9 4.6 2958
# 4 1967-10-01 512. 199311 12.9 4.9 3143
# 5 1967-11-01 517. 199498 12.8 4.7 3066
# 6 1967-12-01 525. 199657 11.8 4.8 3018
# 7 1968-01-01 531. 199808 11.7 5.1 2878
# 8 1968-02-01 534. 199920 12.3 4.5 3001
# 9 1968-03-01 544. 200056 11.7 4.1 2877
# 10 1968-04-01 544 200208 12.3 4.6 2709
# # ... with 564 more rows

A camada inicial

Para criar um gráfico do {ggplot2} sempre comece especificando a camada inicial com a função ggplot(). Essa função recebe a entrada de dados a serem plotados e também pode servir para especificar os eixos X e Y:

# Camada inicial
dados %>%
ggplot2::ggplot()

Especificando os eixos

Conforme esperado, a camada inicial (ou seja, a "base" da nossa torta) não tem nada de muito informativo ou que dê uma pista sobre o que a imagem/gráfico se trata. Sendo assim, devemos adicionar a próxima camada: especificar os eixos X e Y - procedimento as vezes referido como "estética do gráfico" - usando a função aes(). Para adicionar novas camadas use, ao final da linha, o símbolo de adição (+).

Usaremos como exemplo as variáveis unemploy e psavert do dataset, que representam o número de desempregados em milhares e a taxa de poupança pessoal, respectivamente:

# Camada inicial e (+) estética dos eixos
dados %>%
ggplot2::ggplot() +
ggplot2::aes(x = unemploy, y = psavert)

Inserindo as observações

Agora já há uma informação de escala das variáveis tomando forma em ambos os eixos. O que está faltando são as observações dos dados. Para inseri-las há múltiplas possibilidades (família de funções geom_*()), mas o exercício proposto é criar um gráfico de dispersão, portanto devemos usar a função geom_point() adicionando nova camada.

# Gráfico de dispersão (obsevações)
dados %>%
ggplot2::ggplot() +
ggplot2::aes(x = unemploy, y = psavert) +
ggplot2::geom_point()

Este é o exemplo mais simples de um gráfico de {ggplot2}, porém serve para entender o fluxo de trabalho com o pacote. A partir daqui, podemos adicionar mais camadas, títulos, definir tema, enfeitar e personalizar o gráfico para torná-lo mais apresentável. Vamos focar nisso agora!

Adicionando mais camadas

Para adicionar mais camadas referentes às observações de dados devemos usar uma das funções geom_*(). Vamos supor que o gráfico de dispersão criado acima não tenha dado uma visão clara sobre a relação entre as variáveis. Neste caso, convém adicionar uma linha de regressão entre as variáveis. A função geom_smooth() serve para este propósito, havendo algumas opções de método que podem ser especificadas (consulte a documentação):

# Gráfico de dispersão + linha de regressão entre variáveis
dados %>%
ggplot2::ggplot() +
ggplot2::aes(x = unemploy, y = psavert) +
ggplot2::geom_point() +
ggplot2::geom_smooth(method = "lm")

Adicionando tema e títulos

Com os dados plotados e camadas definidas, chegou o momento de ir um pouco além e "enfeitar a torta", deixando o resultado final mais atrativo aos olhos. Nesta etapa a criatividade, a curiosidade e olhar analítico fazem diferença, mas no exemplo abaixo vamos simplificar e usar um tema gráfico padronizado, disponibilizado pelo próprio {ggplot2} (família de funções theme_*()). Por fim, adicionamos título, subtítulo, títulos dos eixos X e Y e legenda do gráfico usando a função labs(). Simples, não?

# Adicionando tema padronizado e títulos
dados %>%
ggplot2::ggplot() +
ggplot2::aes(x = unemploy, y = psavert) +
ggplot2::geom_point() +
ggplot2::geom_smooth() +
ggplot2::theme_light() +
ggplot2::labs(
title = "Relação entre Taxa de poupança e Nº de desempregados",
subtitle = "Dados de 1967 a 2015",
x = "Nº de desempregados (milhares)",
y = "Taxa de poupança pessoal",
caption = "Fonte: FRED"
)

Gráfico de linha

Vamos agora explorar um pouco mais do {ggplot2}: os gráficos de linha. Você pode criar um gráfico de linha com os seus dados, geralmente se for uma série temporal, usando a função geom_line().  No exemplo abaixo, plotamos a população total em milhares dos EUA (variável pop):

# Gráfico de linha
dados %>%
ggplot2::ggplot() +
ggplot2::aes(x = date, y = pop) +
ggplot2::geom_line()

Gráfico de múltiplas linhas

Se você quer criar um gráfico com mais de uma linha, também é muito fácil: dê preferência por usar dados em formato long e especifique, no argumento color da camada da estética, o nome da coluna que identifica cada linha no gráfico (variáveis). Por exemplo:

# Gráfico de múltiplas linhas
dados_long %>%
ggplot2::ggplot() +
ggplot2::aes(x = date, y = value, color = variable) +
ggplot2::geom_line()

Matriz de gráficos de linhas lado a lado

Perceba que o gráfico de múltiplas linhas anterior dificultou a visualização por questão de escala das variáveis. Neste caso, convém separar cada linha em um gráfico, gerando vários gráficos organizados lado a lado. Isso pode ser feito pela função facet_wrap(), especificando a coluna com os "níveis" de separação dos gráficos e, opcionalmente, o comportamento de escala do eixo Y:

# Matriz de gráficos de linhas lado a lado
dados_long %>%
ggplot2::ggplot() +
ggplot2::aes(x = date, y = value, color = variable) +
ggplot2::geom_line() +
ggplot2::facet_wrap(facets = ~variable, scales = "free_y")

Referências

Espero que estes simples exemplos tenham aguçado seu interesse por visualização de dados usando o {ggplot2}, pois este é um framework fantástico para apresentar dados. Veja abaixo algumas visualizações criadas com o {ggplot2} publicadas no blog da Análise Macro:

Posts dos gráficos:

E para se aprofundar, conheça o nosso Curso Gráficos com ggplot2.

Receba diretamente em seu e-mail gratuitamente nossas promoções especiais
e conteúdos exclusivos sobre Análise de Dados!

Assinar Gratuitamente