Apresentamos uma breve introdução a um método que pode ajudar a melhorar o desempenho do seu portfólio: a Análise Técnica (AT), descreendo agumas ferramentas poderosas e alguns exemplos indicativos de como programá-las no ambiente R..
A ideia por trás desse método é que os movimentos de preço do passado podem ajudar na previsão de tendências futuras. Em outras palavras, implicitamente se assume que os preços não seguem um processo de Markov (por exemplo, um passeio aleatório), mas eles têm algum tipo de memória duradoura (ainda que curta), de tal modo que padrões do passado podem voltar a ocorrer também no futuro, isto é, os mercados não são eficientes.
Em um estudo emdesenvolvimento delinearemos o conceito de redes neurais utilizando as funções do R, focando em um único ativo e investigando sinais de compra e venda.
O objetivo aqui é apenas dar uma visão abrangente sobre os conceitos, as ferramentas mais comuns que são usadas e fornecer alguns exemplos de sua programação.
Os mercados são eficientes na medida em que todas as informações são incorporadas aos preços atuais. A forma fraca de eficiência de mercado exige que o preço mais recente já incorpore todas as informações que podem ser obtidas a partir do gráfico de preços e volumes de negociação passados. Claramente, se os mercados fossem eficientes, pelo menos neste sentido fraco, os retornos seriam totalmente independentes ao longo do tempo e estratégias baseadas em análise técnica ou redes neurais seriam completamente inúteis.
No entanto, a eficiência de um determinado mercado pode ser considerada uma questão empírica. É muito difícil se ter certeza de que os retornos de ativos no mundo real são completamente independentes. Portanto, não se deve tomar a eficiência do mercado como um fato, devemos ser capazes de testá-la por conta própria, inventando e implementando novas estratégias. Se sua estratégia baseada nos dados de negociação passados provar ser robusta o suficiente e funcionar bem no futuro, então os dados do mercado vão sugerir que os seus esforços melhoraram o perfil de risco/retorno de sua carteira e, consequentemente, você ganhará um lucro extra.
A experiência têm mostrado que a combinação da análise técnica com a análise fundamentalista pode vir a ser eficaz.
Apesar de ser bastante criticada ainda hoje, a análise técnica é amplamente utilizada, mesmo entre muitos dos investidores que se consideram fundamentalistas. Isso se deve principalmente à sua natureza auto-satisfatória: como os traders sabem que, cada vez mais, os seus pares estão usando as ferramentas da análise técnica, ela se torna, por assim dizer, auto-realizável. Se, por exemplo, uma média móvel de 200 dias for violada em um gráfico principal de algum índice, é provável que isso cause uma onda de vendas. Se a violação for no sentido para cima, pode gerar uma onda de compra.
A análise técnica (AT) pode ajudá-lo a alcançar melhores resultados se você não superestimar seu poder preditivo. A AT é especialmente indicada para tentar prever tendências de curto prazo e indicar o sentimento do mercado. Investidores fundamentalistas às vezes a utilizam para escolher seu ponto de compra e/ou venda: dada a sua visão fundamentalmente apoiada na direção do mercado, AT pode ser uma ajuda valiosa em decisões de curto prazo. Além disso, pode eliminar dificuldades comuns (bem humanas) de negociação, como uma pobre escolha do volume da posição (indicação sobre a força da tendência), mãos trêmulas (só vender quando há um sinal) e incapacidade de pressionar o botão (mas quando há um sinal forte, vende).
Cada mercado tem seu próprio mix de ferramentas que funcionam. Um simples exemplo: uma figura ombro-cabeça-ombro (OCO) (ver referência bibligráfica 2) aparece principalmente em gráficos de ações, enquanto uma resistência ao suporte pode indicar uma negociação em mercados FOREX. Portanto, como regra geral, use conjuntos de indicadores sob medida e algoritmos (regras) específicos para o ativo real que você está olhando.
No pain, no gain: tenha em mente que não há mágica, se alguém desenvolveu uma estratégia que obtenha 55% de resultados positivos nos negócios, então essa pessoa encontrou um instrumento viável (lucrativo).
Evite negociações impulsivas: talvez este seja a regra mais importante. Pode ser decepcionante ter um resultado negativo em seu último negócio, mas não deixe isso influenciar as suas futuras decisões. Realize sua negociação só quando houver um sinal.
A quantidade de ferramentas da AT é muito grande, mas a maioria delas pode ser classificada em quatro grupos principais:
Suporte-resistência e canais de preços: Os preços geralmente influenciam a negociação: níveis estratégicos podem agir tanto como suporte, impedindo que os níveis de preços caiam abaixo, ou como resistência, um obstáculo para aumentos adicionais. Linhas paralelas aplicadas às condições primárias de uma tendência (fundos para uma tendência crescente, topos para uma tendência decrescente) definem canais de preços, e são ferramentas do que é conhecido como análise top-down, assim como a próxima categoria, os padrões gráficos. Como estes são geralmente um pouco mais difícil de se programar, não lidaremos com eles aqui.
Padrões gráficos: ombro-cabeça-ombro: soa familiar? Talvez, devido à sua natureza facilmente reconhecível, padrões gráficos são as mais amplamente conhecidas ferramentas de análise técnica. Elas têm três categorias: trend makers (mastro, bandeira), trend breakers (topos duplos) e sinais de ponto de decisão (triângulos). Estes, também, são bastante intuitivos, dificilmente programáveis e, portanto, não serão tratados aqui, tendo em vista o caráter introdutório deste texto.
Padrões de candlesticks : como gráficos de candlesticks (ou candles, como passaremos a chamar) são os mais difundidos, analistas técnicos começaram a detectar sinais neles e cunharam nomes como estrela da manhã (morning stars), três soldados brancos (three white soldiers) etc. Mais do que qualquer outra ferramenta da AT, elas são significativas apenas se combinadas com outros sinais, na maioria dos casos níveis estratégicos de preços. Normalmente, há uma uma combinação de duas e cinco candles (ou mais) para se estabelecer um padrão reconhecível.
Indicadores: Este é o tipo com o que mais lidaremos. Fáceis de programar, indicadores técnicos servem de base para o que é conhecido como high frequency trading (HFT), uma estratégia baseada em decisões algorítmicas e rápidas ordens ao mercado. Esses indicadores têm quatro categorias: impulso, seguidor de tendência, volume de negociações e volatilidade.
Cada trader deve explorar suas próprias ferramentas de AT, aquelas que melhor funcionam para o(s) mercado(s) onde operam, mas algumas observações de caráter geral podem ser feitas:
Ações geralmente formam padrões gráficos notáveis e são sensíveis a padrões de candles e para cruzamentos de médias móveis. Informações assimétricas são uma questão importante, embora menor do que no caso de commodities, por exemplo, e picos imprevisíveis podem alterar significativamente a trajetória dos preços a aprtir de notícias inesperadas.
FOREX é um mercado negociado continuamente em todo o mundo e é fortemente descentralizado, o que implica duas coisas. Primeiro, nenhum dado de volume global está disponível (ou é confiável), o que torna necessário se ter uma ideia geral sobre a liquidez dos mercados para pesar o importância das mudanças de preços. Segundo, os traders negociam em momentos diferentes e cada um deles pode possuir hábitos diferentes. Em EURJPY, por exemplo, durante o horário de negociação dos EUA e da Europa as dezenas e números redondos tendem a ser suportes psicológicos, enquanto há uma mudança para os 8s durante o horário comercial asiático (8 é um número da sorte).
O emprego de algoritmos para trading é um subconjunto do trading quantitativo, que faz uso de algoritmos pré-programados. Os algoritmos, utilizando os modelos quantitativos, decidem sobre vários aspectos importantes do negócio, como preço, timing e volume, e executa as negociações automaticamente sem intervenção humana. O processo de negociação algorítmica envolve fazer uso de computadores para executar esses modelos matemáticos complexos e executar as ordens de compra e venda. Isso envolve automatizar todo o processo, incluindo geração, submissão e execução de ordens. A negociação algorítmica é frequentemente usada por grandes investidores institucionais, como fundos de pensão e fundos mútuos, para dividir grandes ordens em várias peças menores. Uma vez que as informações são recebidas eletronicamente, a negociação algorítimica também é usada por players como fundos de hedge para tomar automaticamente decisões antes que outros traders humanos sequer recebam as informações, fornecendo-lhes uma enorme vantagem.
Nota: é importante perceber que o R pode ser usado para analisar dados, construir uma estratégia e testá-la (backtest). É ótimo para análise. No entanto, uma vez que se inicia a execução da estratégia, ou seja, quando se está pronto para executar ordens com base na estratégia, você vai fazer isso em um sistema de execução de ordens em tempo real.
O backtesting é um dos passos mais importantes na construção de uma estratégia de negociação quantitativa bem sucedida. Os quants usam suas habilidades de programação para construir estratégias de negociação complexas. No entanto, antes que essas estratégias sejam executadas no mercado ao vivo, elas são testadas usando dados históricos. Basicamente, os traders alimentarão os dados históricos nesses programas de negociação algorítmica que lhes dirão o quão bem suas estratégias foram executadas nesses dados históricos. Isso pode ajudar a encontrar falhas em suas estratégias de negociação para que sejam melhoradas, mas não se esqueça: fazer previsões é difícil, especialmente sobre o futuro!
Atualmente há muitos softwares proprietários que facilitam o trabalho dos traders, oferecendo gráficos e ferramentas de AT poderosas. Eles incorporam a possibilidade de se utilizar vários indicadores. As empresas que oferecem aos traders (profissionais ou amadores) robôs que utilizam estes programas constituem uma indústria sempre crescente. Entretanto, podemos utilizar o R para traçar os gráficos e para desenvolver e utilizar os indicadores que preferirmos. Na realidade, a maioria absoluta dos indicadores utilizados no mercado já estão disponíveis como parte de pacotes testados e otimizados.
Comecemos com um exemplo: gráficos de candles.
Podemos obter dados do mercado de ações de vários modos em R. Utilzaremos um código que obtem os dados online, funcionando, portanto, como se fosse uma ferramenta de gráficos em tempo real. Usaremos gráficos de candlesticks (também chamados OHLC - Open, High, Low, Close), o tipo comumente usado. A Figura 1 descreve candles de alta e de baixa.
Figura 1 - Candlestics de Alta/Baixa
A engenharia de atributos é um dos passos divertidos, criativos e essenciais no aprendizado de máquina: transforma dados brutos em uma forma que provê informações muito significativas para um modelo de previsão. A previsibilidade de um modelo depende de bons atributos, que por sua vez dependem do seu conhecimento do negócio.
Muitos traders experientes do mercado de ações, que avaliam regras de negociação ou gráficos, já se envolveram em algumas forma de engenharia de atributos - quer saibam disso ou não. Por exemplo, uma média móvel é um indicador que caracteriza o movimento dos preços das ações. Todos os indicadores técnicos (RSI, MACD, osciladores estocásticos, Bandas de Bollinger etc.) são alguma forma de atributo. Esses recursos podem ser alimentados em um modelo de aprendizado de máquina, ou usados como sinais de negociação. Pode haver centenas, se não milhares, de estratégias de negociação para capturar as anomalias do mercado ou tentar prever tendências futuras.
Os pacotes quantmod, TTR e
PerformanceAnalytics são os três mais usados para finanças
quantitativas. Eles permitem que nos concentremos em testar várias
estratégias de trading. Utilizaremos a função getSymbols()
para baixar os dados históricos de um ativo.
Carregamento dos pacotes na memória:
library(tidyverse) # https://www.tidyverse.org/
library(quantmod) # Carrega, também, o pacote TTR
library(PerformanceAnalytics)
library(IRdisplay)
Obtenção dos dados:
ativos <- "VALE3.SA" # Inicialmente, apenas um ativo
inicio <- "2019-01-01"
hoje <- as.character(Sys.Date())
getSymbols(ativos,
from = inicio,
to = hoje,
auto.assign = TRUE) # Cria automaticamente séries temporais (xts) com os nomes dos ativos
## [1] "VALE3.SA"
chartSeries(VALE3.SA,
theme = "white")
# Simplifiquemos o nome da variável
df <- VALE3.SA
df$OpCl <- OpCl(df)
df$OpOp <- OpOp(df)
df$HiCl <- HiCl(df)
df$ClCl <- ClCl(df)
Delt()Calcula a diferença percentual (retorno de k períodos) entre duas séries de dados (x1 e x2), ou entre valores de uma mesma série: Lag = x2(t) - x1(t-k))/x1(t-k).
df$pcntOpCl1 <- Delt(Op(df),Cl(df), k = 1)
df$pcntOpCl2 <- Delt(Op(df),Cl(df), k = 2)
df$pcntOpCl3 <- Delt(Op(df),Cl(df), k = 3)
df$lagCl <- Lag(Cl(df))
df$lag2Cl <- Lag(Cl(df), 2)
df$lag3Cl <- Lag(Cl(df), 3)
df$proxOpCl <- Next(OpCl(df))
head(df)
## VALE3.SA.Open VALE3.SA.High VALE3.SA.Low VALE3.SA.Close
## 2019-01-02 50.01 51.37 49.79 51.09
## 2019-01-03 50.80 50.94 48.40 49.00
## 2019-01-04 49.82 52.45 49.82 52.19
## 2019-01-07 52.87 53.65 51.72 51.91
## 2019-01-08 52.20 52.80 51.62 52.41
## 2019-01-09 53.16 54.06 52.83 53.69
## VALE3.SA.Volume VALE3.SA.Adjusted OpCl OpOp
## 2019-01-02 17319600 37.18023 0.021595722 NA
## 2019-01-03 30120000 35.65925 -0.035433052 0.01579686
## 2019-01-04 43360100 37.98074 0.047571236 -0.01929132
## 2019-01-07 20998900 37.77698 -0.018157727 0.06122037
## 2019-01-08 19925600 38.14084 0.004022969 -0.01267256
## 2019-01-09 27695500 39.07236 0.009969883 0.01839079
## HiCl ClCl pcntOpCl1 pcntOpCl2 pcntOpCl3 lagCl
## 2019-01-02 -0.005450633 NA NA NA NA NA
## 2019-01-03 -0.038084002 -0.040908201 -0.020195922 NA NA 51.09
## 2019-01-04 -0.004957140 0.065102020 0.027362205 0.04359130 NA 49.00
## 2019-01-07 -0.032432469 -0.005364993 0.041951024 0.02185041 0.03799244 52.19
## 2019-01-08 -0.007386345 0.009632055 -0.008700568 0.05198715 0.03169293 51.91
## 2019-01-09 -0.006844284 0.024422801 0.028544022 0.01550974 0.07767963 52.41
## lag2Cl lag3Cl proxOpCl
## 2019-01-02 NA NA -0.035433052
## 2019-01-03 NA NA 0.047571236
## 2019-01-04 51.09 NA -0.018157727
## 2019-01-07 49.00 51.09 0.004022969
## 2019-01-08 52.19 49.00 0.009969883
## 2019-01-09 51.91 52.19 -0.002442269
Muitas vezes é necessário reduzir os preços diários para preços
semanais ou mensais. As irregularidades em um calendário, como feriados,
ano bissexto ou meses do ano, vão complicar seu program. As funções R
úteis como to.monthly ou para to.weekly ajudam
bastante.
df.mensal <- to.monthly(df)
df.mensal$mes <- format(index(df.mensal),"%Y%m")
df.mensal$ano <- format(index(df.mensal),"%Y")
head(df.mensal)
## df.Open df.High df.Low df.Close df.Volume df.Adjusted mes ano
## jan 2019 52.87 56.20 42.36 45.50 609914100 33.11216 201901 2019
## fev 2019 45.72 47.75 40.51 47.10 509025800 34.27655 201902 2019
## mar 2019 47.29 52.39 44.55 50.93 422600700 37.06379 201903 2019
## abr 2019 52.35 53.80 49.38 50.10 327521600 36.45977 201904 2019
## mai 2019 49.28 51.00 45.82 49.00 474970400 35.65925 201905 2019
## jun 2019 49.35 53.10 47.86 51.82 351314100 37.71148 201906 2019
É fácil calcular os retornos:
rtn.diario <- dailyReturn(df)
rtn.semanal <- weeklyReturn(df)
rtn.mensal <- monthlyReturn(df)
# Todos os retornos (muitos NA´s aqui)
rtn.todos <- allReturns(df) # note o plural
É sabido que as distribuições dos retornos diários e mensais das ações possuem “caudas-gordas” (fat tails) em relação à distribuição normal. A forma de sua distribuição de retornos é mais “pontuda” do que uma distribuição normal simétrica, em forma de sino, padrão. Isso significa que eventos extremos (um grande movimento de preço) são mais propensos a acontecer do que uma curva normal padrão.
A curtose mede esse grau de afastamento em relação à curva Normal. Uma distribuição normal padrão tem média 0, desvio padrão 1, e curtose 0. A distribuição de um retorno típico de ações tem pequeno desvio padrão e curtose positiva.
print(paste0("Desvio Padrão: ", round(sd(rtn.diario), 4)))
## [1] "Desvio Padrão: 0.0273"
print(paste0("Curtose: ", round(kurtosis(rtn.diario), 2)))
## [1] "Curtose: 14.81"
options(repr.plot.width = 4, repr.plot.height = 4)
hist(rtn.diario,
main = 'Histograma dos retornos diários - VALE3',
ylab = 'Densidade (%)',
xlab = 'Retorno diário',
breaks = 100,
prob = TRUE) # Transforma numa distribuição de probabilidade
m <- mean(rtn.diario)
dp <- sd(rtn.diario)
# Sobrepõe uma distribuição Normal
curve(dnorm(x, mean = m, sd = dp), col = "darkblue", lwd = 2, add = TRUE )
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 Média Móvel Exponencial, EMA é um marco na análise técnica, sendo utilizada em inúmeros indicadores. A EMA é 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 da EMA é 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}\]
O MACD foi desenvolvido por Gerald Appel e é provavelmente um dos osciladores mais populares.
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**. Esse sinal só deve ser utilizado em tendências fortes, pois apresenta com alguma frequência falsos alarmes.
Pode ser usado como um oscilador genérico para qualquer série univariada, não apenas de preços. Como visto acima, o MACD é definido como a diferença entre a média móvel simples de 12 períodos (SMA) e a média móvel simples de 26 períodos (MACD = SMA de 12 períodos − SMA de 26 períodos), ou “SMA rápida — SMA lenta”.
O MACD tem um valor positivo sempre que a SMA de 12 períodos estiver acima da SMA de 26 períodos e um valor negativo quando a SMA de 12 períodos estiver abaixo da SMA de 26 períodos. Quanto mais distante o MACD estiver acima ou abaixo de sua linha de base, indica que a distância entre os dois SMAs está crescendo.A função “MACD” também calcula a média móvel do MACD, chamado sinal. O número padrão de períodos para calcular o sinal é de nove períodos. Por que a SMA de 12 períodos é chamada de “SMA rápida” e a SMA de 26 períodos de “SMA lenta”? Porque a SMA de 12 períodos reage mais rapidamente às mudanças de preços mais recentes do que a SMA de 26 períodos.
A linha MACD oscila em torno de 0. Quando o SMA rápido está acima do SMA lento, o MACD está acima de 0, e vice-versa.
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 100 e 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.
O OBV é um indicador de momento, isto é, de movimento (gradiente), e relaciona mudanças no preço com as variações de volume. Ele foi criado por Joe Granville e a ideia é detectar a direção do fluxo do volume, ou seja, se está entrando ou saindo volume do ativo. Se o fechamento do dia for superior ao do dia anterior, todo o volume é considerado volume de alta. Se o fechamento for inferior ao do dia anterior, todo o volume é considerado volume de baixa.
Esse indicador pode ser utilizado para:
– Medir a força da tendência
– Identificar possíveis reversões
– Sinalizar o surgimento de novas tendências
Sua fórmula relaciona o volume com o movimento do preço no período, determinando a força da pressão compradora e da pressão vendedora na ação:
Dia de alta:
Dia de baixa:
Alguns exemplos de utilização da função chartseries()
podem ser encontrados aqui. Use
?chartseries para uma lista completa das funcionalidades da
função.
Para uma breve introdução ao emprego do pacote ´quantmod` siga este link.
Um gráfico de candles. O argumento “TA” é um vetor de indicadores técnicos e parâmetros a serem adicionados ao gráfico
chartSeries(df, subset = "2020::",
name = "VALE",
theme = "white",
TA = "addSMA(12);addMACD();addBBands();addRSI()")
Indicadores técnicos podem, também, ser adicionados ao gráfico por
meio das funções iniciadas po add. Por exemplo, para
adicionar o momento OBV:
addOBV()
Não desenvolveremos estratégias de negociação algorítmica (com o R)
neste tutorial, mas recomendamos, como uma apresentação inicial ao tema,
conhecer o pacote quantstrat.
O sítio Finance Train possui várias implementações de soluções financeiras para o mercado, sempre usando o R.
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 do ativo de sua preferência e atribua a um objeto
xts.
Apresente uma lista com os preços mensais ajustados de seu ativo no período entre 1/12/2019 até a data de hoje.
Apresente um gráfico com os retornos semanais desde o início de 2020.
Apresente um gráfico de candles de período.
Acrescente ao gráfico anterior (ou trace um gráfico de linha) Bandas de Bollinger e RSI (índice de força relativa).
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.
Escolha um ativo de sua preferência (pode ser o anterior), obtenha os candles diários e trace as curvas de EMA e do MACD. Como você pode fazer o R avisá-lo quando um sinal aparecer?