Introdução

Neste conjunto de exercícios, exploraremos possibilidades da análise fundamentalista e técnica de ações oferecidos pelo pacote quantmod. Se você já não tiver instalado o pacote, instale-o usando o seguinte código:

install.packages(quantmod)

e carregue o pacote na memória.

library(quantmod)

Exercício 1

Carregue os dados da ação da Embraer (EMBR3.SA) e atribua a um objeto xts chamado emb.p.

Exercício 2

Apresente uma lista com os preços mensais ajustados da Embraer no período entre 1/12/2019 até a data de hoje (20 de dezembro de 2020).

Exercício 3

Apresente um gráfico com os retornos semanais em 2020.

Exercício 4

Apresente um gráfico de candles de 2020.

Exercício 5

As Bandas de Bollinger consistem em três linhas. A faixa média é uma média móvel simples (geralmente 20 períodos) do preço. As bandas superior e inferior são F desvios padrão (geralmente 2) acima e abaixo da faixa média. As bandas aumentam e estreitam quando a volatilidade do preço é maior ou menor, respectivamente. As Bandas de Bollinger não geram, por si só, sinais de compra ou venda; elas são um indicador de condições de overbought ou oversold. Quando o preço está perto da faixa superior ou inferior, há uma indicação que uma reversão pode ser iminente. A faixa do meio torna-se um nível de suporte ou resistência. As bandas superior e inferior também podem ser interpretadas como metas de preço. Quando o preço salta para fora da faixa inferior e cruza a faixa do meio, então a faixa superior torna-se a meta de preço.

O Índice de Força Relativa, RSI, calcula a razão dos movimentos recentes de preços para cima em relação ao movimento absoluto dos preços. O RSI varia de 0 a 100e pode ser interpretado como um indicador overbought/oversold quando o valor é superior a 70/abaixo de 30. Também é possível procurar divergência com preços. Se o preço está fazendo novas altas/baixas e o RSI não está, isso pode ser o sinal de uma reversão. O Índice de Força Relativa (RSI) foi desenvolvido por J. Welles Wilder e foi introduzido pela primeira vez em junho de 1978.

Acrescente ao gráfico anterior (ou trace um gráfico de linha) bandas de Bollinger e RSI (índice de força relativa).

Exercício 6

A Média Móvel Exponencial, EMA é um marco na análise técnica, sendo utilizada em inúmeros indicadores. Em uma Média Móvel Simples, SMA, cada valor no período de tempo carrega um peso igual, e valores fora do período de tempo não estão incluídos na média. A EMA, em contrapartida, é calculada de modo cumulativo, incluindo todos os dados. Os valores passados têm uma contribuição cada vez menor para a média, enquanto os valores mais recentes têm maior contribuição. Este método permite que a média móvel seja mais responsiva às mudanças nos dados. A fórmula padrão de cálculo é a seguinte:

\[K=\frac{2}{n+1}\]

\[EMA_{t} = EMA_{t-1} + K \times (\text {novo_valor} - EMA_{t-1})\]

ou

\[EMA_{t} = K \times \text {novo_valor} + (1-K) \times EMA_{t-1}\]

Ainda com relação ao gráfico do exercício 4, acrescente as médias móveis simples de 9, 21 e 200 períodos. Acrescente a média móvel exponencial de 34 períodos.

Exercício 7

MACD (Mac Dee) é a sigla de Moving Average Convergence-Divergence. Trata-se de uma combinação de uma EMA lenta (26 candles) e uma rápida (12 candles) que serve como um indicador para seguidores de tendência. Os sinais desse indicador são raros, mas tendem a ser mais precisos. O sinal surge quando a curva rápida cruza a lenta: é um sinal de compra se o cruzamento se dá de baixo para cima e de venda se ocorrer no **sentido *oposto**.

Note que esse sinal só deve ser utilizado em tendências fortes, pois apresenta com alguma frequência falsos alarmes.

Escolha um ativo de sua preferência, obtenha os candles diários e trace as curvas de EMA do MACD. Como você pode fazer o R avisá-lo quando um sinal aparecer?

Exercício 8

O script a seguir “reconhece” reversões, a partir de um determinado padrão de candles. Para fazer isso, aplicamos a seguinte lógica dupla: primeiro, demos uma definição para o que é um nível de preço estratégico. Por exemplo, nós reconhecemos como uma tendência “madura” uma tendência crescente do movimento de preços cujos fundos estão monótonamente aumentando (fundo sendo o ponto mais baixo do corpo do candle) e cujo nível atual de MA(25) é maior do que o MA(25) medido 25 candles antes. Note que isso não constitui parte das ferramentas padrão de AT e que os parâmetros forma escolhidos apenas como exemplo. Se você quiser aplicá-lo a ativos específicos, aconselho que os selecione para fornecer o melhor ajuste. Isso não é um algoritmo de reconhecimento de tendência por si só: ele só serve como parte do algum sistema de sinais.

A reversão é um padrão de candles de quebra de tendência, e ocorre quando o candle anterior ao último candle da tendência que aponta para a mesma direção que a tendência anterior (é verde para uma tendência crescente, vermelho para um em queda, mas de repente os preços giram e os próximos candles vêm na direção oposta à tendência com um corpo maior do que o anterior. O candle de quebra de tendência deve começar pelo menos tão alto quanto o anterior, ou um pouco acima do fechamento para uma tendência de alta, e um pouco abaixo para uma de baixa. Veja o gráfico abaixo para um exemplo de uma reversão em uma tendência de alta:

Vamos ao código (ainda utilizando o pacote quantmod):

graf.OHLC <- function(d) {
  #windows(20, 10)
  chartSeries(d, dn.col = "red")
}

# A função utiliza uma série temporal e dois índices (i e j) como argumentos,
# e decide se há uma tendência entre i e j

is.trend <- function(ohlc, i, j) {
# Primeiro: se a MA(25) naõ aumenta, então não é uma tendência de alta, e retorna FALSE
 
  media1 = mean(ohlc[(i-25):i, 4])
  media2 = mean(ohlc[(j-25):j, 4])
  if(media1 >= media2) return(FALSE)

# Neste algoritmo bem simples, chamo o candle de 'vale', se seu fundo 
# é monotamente não-decrescente. Neste caso, temos uma tendência de alta.
  ohlc <- ohlc[i:j, ]
  n <- nrow(ohlc)
  candle_l <- pmin(ohlc[, 1], ohlc[, 4])
  vale <- rep(FALSE, n)
  for (k in 2:(n - 1))
  vale[k] <- ((candle_l[k-1] >= candle_l[k]) & (candle_l[k+1] >= candle_l[k]))
  z <- candle_l[vale]
  if (all(z == cummax(z))) return(TRUE)
  FALSE
}

Este foi o reconhecimento de tendências. Vamos ver a reversão de tendências.

Primeiro, utilizamos a função anterior para verificar as condições da tendência crescente. Então, verificamos aos dois últimos candles para identificar o padrão de reversão.

is.trend.rev <- function(ohlc, i, j) {
  if (is.trend(ohlc, i, j) == FALSE) return(FALSE)
  ultima_candle <- ohlc[j + 1, ]
  candle_reversao <- ohlc[j + 2, ]
  ohlc <- ohlc[i:j, ]
  if (ultima_candle[4] < last_candle[1]) return(FALSE)
  if (ultima_candle[4] < max(ohlc[,c(1,4)])) return(FALSE)
  if (candle_reversao[1] < ultima_candle[4] |
      candle_reversao[4] >= ultima_candle[1]) return(FALSE)
  TRUE
}

Bom trabalho