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)
Carregue os dados da ação da Embraer (EMBR3.SA) e atribua a um objeto xts chamado emb.p.
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).
Apresente um gráfico com os retornos semanais em 2020.
Apresente um gráfico de candles de 2020.
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).
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.
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?
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
}