Ferramentas para buscar os dados

A análise de ações e investimentos é um tema que pode ser muito bem explorado com técnicas de análise e tendência, além de avaliar o quanto ganhou ou perdeu ao investir em ações é preciso aprender a tomar decisões de compra e venda usando alguma técnica.

A ação aqui analisada é da Johson e Johnson (JNJ) com dados extraídos do site Yahoo Finance por meio do pacote quantmod que é bastante utilizado para a modelagem quantitativa de dados financeiros. Além disso, o pacote ggplot2 será utilizado para a visualização dos dados.

rm(list=ls())
#install.packages("quantmod") pacote quantmod
#install.packages("ggplot2") pacote ggplot2
library(quantmod)
library(ggplot2)

Dados Johnson & Johnson

O código abaixo nomeia as ações de Johnson & Johnson de jnj e puxa automaticamente e em tempo real todos os dados de 01-01-2021 ao dia atual, no caso 24-01-2025

Vamos agora plotar os preços diários, utilizando a coluna de Preço Ajustado, visto que ela incorpora eventos como splits e distribuição de dividendos, que podem afetar a série.

ggplot(jnj, aes(x = index(jnj), y = jnj[,6])) + geom_line(color = "darkblue") +
ggtitle("Série de preços da JNJ") +
xlab("Data") + ylab("Preço ($)") + theme(plot.title = element_text(hjust = 0.5)) + 
scale_x_date(date_labels = "%b %y", date_breaks = "3 months")

Análise Técnica

Em Análise Técnica de ações, uma técnica muito utilizada é a plotagem de médias móveis nos gráficos de preços. Uma média móvel simples é a média aritmética dos últimos \(q\) dias de uma série \(x_t\) no período de tempo \(t\). Assim, a média móvel é dada por:

\[MM_t^t = \frac{1}{q} \sum_{i=0}^{q-1} x_{t-1} \] Esse indicador é interessante pois ajuda a identificar tendências e suaviza ruídos dos preços. Isto é, quanto maior a janela de dias para o cálculo da média, menor é a responsividade da MM à variação no preço. Quanto menor a janela, mais rápido à média móvel se ajusta às mudanças. Vamos então calcular agora duas médias móveis para a série de preços da Johnson & Johnson, uma com janela de 10 dias e outra com janela de 30 dias:

jnj_mm <- subset(jnj, index(jnj) >= "2024-01-01")

jnj_mm10 <- rollmean(jnj_mm[,6], 10, fill = list(NA, NULL, NA), align = "right")
jnj_mm30 <- rollmean(jnj_mm[,6], 30, fill = list(NA, NULL, NA), align = "right")

jnj_mm$mm10 <- coredata(jnj_mm10)
jnj_mm$mm30 <- coredata(jnj_mm30)

Primeiro dividimos a base para dados a partir de 2024 utilizando a função subset(). Em seguida, usamos a função rollmean(), que toma como argumento a série (\(x_t\)), no caso o preço ajustado; a janela de períodos (\(q\)); um argumento opcional de preenchimento, que é utilizado para completar os dias em que ainda não é possível calcular a média móvel, ou seja, quando não se passaram dias suficiente para completar a janela desejada; e, por último, o argumento align, que indica se a média móvel deve ser calculada usando os períodos à esquerda, ao centro ou à direita do dia \(t\) da série. Por último, acrescentamos as médias móveis a duas novas colunas na base inicial.

Para a análise, calculamos utilizando 10 e 30 dias de janela, preenchendo os valores com NA e utilizando os períodos à esquerda do dia em questão. Em seguida, podemos plotar ambas as séries no mesmo gráfico de preços para identificar tendências.

Teoria da Análise de Médias Móveis

Uma teoria existente na Análise Técnica é a de que quando duas médias móveis de janelas de curto e longo prazo se cruzam, há uma indicação de compra ou de venda.

Caso a MM de menor período cruze de baixo para cima a MM de maior período, há uma indicação de compra.

Se o cruzamento for o contrário, é um sinal de venda.

Plotando a série de preços e as médias móveis para todos os dias a partir de 2023, temos:

ggplot(jnj_mm, aes(x = index(jnj_mm))) + geom_line(aes(y = jnj_mm[,6], color = "JNJ")) + 
ggtitle("Série de preços da JNJ") +
geom_line(aes(y = jnj_mm$mm10, color = "MM10")) +
geom_line(aes(y = jnj_mm$mm30, color = "MM30")) +
xlab("Data") + ylab("Preço ($)") +
theme(plot.title = element_text(hjust = 0.5), panel.border = element_blank()) +
scale_x_date(date_labels = "%b %y", date_breaks = "3 months") +
scale_colour_manual("Séries", values=c("JNJ"="gray40", "MM10"="firebrick4", "MM30"="darkcyan"))

#![Legenda](https://drive.google.com/file/d/1BNtbsTrJbwIP3zkpni8mQaB4xrcob6kr/view?usp=sharing)

Resultado

Resultado
Resultado

Há 8 pontos que as médias se cruzam.

Em 80% dos casos a tendência é de acerto, ou seja, nos pontos que a curva vermelha cruza com a verde de baixo para cima = compra as ações subiram depois, e quando a curva vermelha cruzou com a verde de cima para baixo, as ações na maioria das vezes cairam.