Análise Técnica de Aplicações Financeiras
Traders que contam com análise técnica, tais como leitura de gráficos descobrem padrões de negociação lucrativos a partir de dados históricos e implementam as estratégias no mercado. O trabalho é perfeito para o Python. Mas é um campo vasto e só podemos arranhar a superfície.
Como crente na eficiência do mercado, duvido que as regras técnicas de negociação publicamente conhecidas possam gerar lucros anormais. As pessoas que tentam vender sinais técnicos de negociação são os vendedores picaretas durante a corrida do ouro. É então uma pergunta natural a se fazer: por que nos incomodamos em aprender regras técnicas de negociação se elas não parecem funcionar. A resposta é simples. Não podemos descartar a eficácia das regras proprietárias. Por definição, as regras proprietárias são conhecidas apenas pelos proprietários. Se as regras funcionarem, não há incentivos para que os comerciantes as divulguem. Se não o fizerem, não há incentivo para os comerciantes continuarem. Pelo grande número de traders técnicos bem-sucedidos, não posso descartar a possibilidade de trabalhar as regras técnicas. Portanto, aprender a implementar regras técnicas de negociação não é necessariamente sem sentido.
Infelizmente, o que irei demonstrar aqui são apenas regras técnicas de negociação públicas e principalmente inúteis.
O código mostrando é para fazer o chamado backtesting. No backtesting, colocamos-nos em um ponto do tempo no passado e não temos consciência do que está por vir. Implementamos a regra de negociação naquele momento específico. Em seguida, analisamos o desempenho da estratégia e inferimos resultados.
Regras de Filtros
Uma regra de filtro é atuar nos resultados filtrados de um movimento de preço de ações. Uma vez que uma ação passa pela regra do filtro, o trader compra ou vende no local. Por exemplo, uma regra de filtro de momento pode pedir a um trader para comprar uma ação quando ela estiver 3%, ou mais, acima da mínima anterior e vendê-la quando estiver 3%, ou mais, abaixo da máxima anterior.
Vamos usar os preços diários da GOLL4.SA para demonstrar tal regra e testar sua validade. No exemplo a seguir, imagino que em qualquer dia de negociação, o trader analisa sua posição e toma uma decisão. Se o trader tem a ação, ele procura um sinal de venda. Se não, ele procura o sinal de compra.
Como está o nosso DataFrame importado do Finance YahooR.
Baixando arquivo GOLL4.SA e salvando-o no mesmo diretório da nossa notebook Jupyter, podemos fazer a leitura deste arquivo sem precisar ficar acessado o site do Yahoo.
O sinal é determinado pelo preço de abertura (Open) do dia de negociação e o preço local alto ou baixo (AB_PCT). Digo, o comerciante está em posição. Se ele perceber que o preço de abertura (Open) está 3% ou mais abaixo do pico anterior, ele vende. O código a seguir captura essas ações criando uma nova coluna chamada Posicao:
Como está tudo certo com o arquivo, vamos implementar o restante:
Neste ponto, “voltamos à história” para estabelecer nossa posição de entrada ou saída na GOLL4.SA. Agora será mostrado como observar o desempenho e compará-lo com uma estratégia simples de comprar e manter.
Em essência, tentamos ver como a “riqueza” é construída usando a regra. A riqueza cresce à taxa da mudança de preço da GOLL4.SA se o trader mantiver uma posição. Permanece o mesmo se o trader não mantiver uma posição.
Durante os dias em que o trader passa da posição de entrada para a de saída, a riqueza é calculada com base no número de ações que ele possui no dia anterior.
Em seguida, multiplicamos o número com o preço de abertura (Open) do dia. A riqueza é calculada de maneira semelhante quando se muda de posição out para posição in.
A coluna Riqueza apenas foi criada para deixar-nos conhecedores de quanto dinheiro o $100 cresce, mas o valor absoluto do saldo final significa pouco, se não tivermos benchmark. O código seguinte mostra como padronizar a estratégia comprar e manter benchmark. Você pode imaginar um investidor passivo que coloca $100 na ação da GOLL4.SA no início. O resultado será o saldo final de uma tal estratégia.
Podemos plotar as duas séries de riquezas para comparar o seu desempenho.
A comparação gráfica não é a maneira mais científica para medir o desempenho de qualquer estratégia de trading. Para isto, precisamos saber o benchmark da série de retorno. Mas uma figura vale mais do que cem palavras. Observando o gráfico seguinte, estamos seguros de dizer que não há dinheiro grátis neste caso. Nós nem falamos sobre custos de transação!
Você pode tentar mudar o filtro de corte e o período de tempo para ver se você pode “data mine” uma regra satisfazendo. Para mudar o filtro de corte, você deve apenas modificar a linha 5. Para mudar o período de tempo, você pode inserir o seguinte na linha 3:
Gráficos Candlestick
O melhor meio para visualizar dados de ação é usar os assim chamados gráficos candlestick. Este tipo de gráfico nos dá informação sobre quatro diferentes valores ao mesmo tempo, chamados de valor alto, baixo, abertura e fechamento. A fim de plotar gráficos candlestick, iremos precisar importar a função da biblioteca MPL-Finance.
Também, para nosso gráfico candlestick, iremos precisar de um formato diferente de datas fornecido pelo MAtplotlib. Portanto, precisamos importar o módulo respectivo também. Demos a ele o apelido (alias) mdates.
Agora a fim de plotar nossos dados de ações, precisamos selecionar as quatro colunas na ordem direita.
Agora, temos nossas colunas na ordem direita, mas há ainda um problema. Nossos dados não têm o formato direito e como é o índice, não podemos manipulá-lo. Portanto, precisamos resetar o índice e depois converter nosso datetime para um número.
Para isso, usamos a função reset_index() de modo que podemos manipular nossa coluna de Date. Note que estamos usando o parâmetro inplace para trocar o data frame pelo aquele novo. Depois disso, mapeamos a função date2num do módulo matplotlib.dates em todos os nossos valores. Isso converte nossas datas em números que podemos trabalhar com eles.
Plotando os Dados
Agora podemos começar plotando nosso gráfico. Para isso, apenas definimos um subplot (porque precisamos passar um para nossa função) e chamamos nossa função candlestick_ohlc.
Ao lado do subplot, estamos também passando uma dupla de outros parâmetros aqui. Primeiro de tudo, nossos quatro valores financeiros. Acessamos estes referindo-se aos atributos values do nosso data frame. Adicionalmente, definimos a largura dos candlesticks individuais e as cores para os movimentos para cima e para baixo. Por último, mas muito importante, ligamos a grade e definimos o eixo x como o eixo das datas e nossos valores numéricos serem exibidos como datas novamente. O resultado foi o que encontramos na figura acima.
Se parecer confuso, não se preocupe, vamos cuidar disso logo mais.
O Candlestick
Como você pode ver, temos dois tipos de candlesticks – o verde e o vermelho. Se o preço da ação subiu num dia particular, o candlestick é verde. Caso contrário é vermelho.
Um candlestick nos dá a informação sobre todos os quatro valores de um dia específico. O ponto mais alto do stick é o alto (high) e o ponto mais baixo é o low daquele dia. A área colorida é a diferença entre o preço open e o preço close. Se o stick for verde, o valor de fechamento (Close) está no topo e o de abertura (Open) no fundo, pois o fechamento (Close) deve ser maior que o da abertura (Open). Se ele for vermelho, é o contrário.
Plotando por Múltiplos Dias
Outra coisa que podemos fazer com esta espécie de plot é plotar o Open, High, Low e Close de múltiplos dias. Para isso, podemos tomar um valor como o Adjusted Close e calcular os quatro valores para uma quantidade específica de tempo
Usando a função resample empilhamos os dados num intervalo de tempo específico. Neste caso, tomamos 10 dias (10D). No final aplicamos a função ohlc, para obter os quatro valores fora de nossas entradas. Depois novamente convertemos nossas datas num formato numérico.
Adicionalmente, iremos criar um segundo subplot deste tempo, que mostra o volume para esses dias.
Desta vez entretanto temos usado a função sum(), pois não queremos plotar outro candlestick mas somente o volume desses 10 dias.
Agora precisamos definir os dois subplots. Para isso, estamos usando a função subplot2grid que torna mais fácil alinhar os plots.
A primeira tupla aqui (6,1) estabelece a quantia de linhas e colunas da janela. Aqui definimos seis linhas e uma coluna. A segunda tupla define em qual ponto o subplot começa. A primeira delas toma a linha um e coluna um, enquanto a segunda toma a linha quatro e coluna um. Os parâmetros rowspan e colspan define quantas linhas e colunas nossos plots deve esticar. Note também que definimos que ambos subplots compartilham o eixo-x.
Novamente usamos a mesma função para plotar nosso candlestick mas dessa vez usamos nossos dez valores diários. Também, plotamos nossos volumes no segundo subplot usando a função fill_between. Isto cria um tipo de gráfico que preenche a área abaixo do gráfico. Nossos valores x aqui são as datas convertidas e nossos valores y são os volumes. O resultado foi aquele apresentado na figura acima.
Como somente temos um décimo da quantia de valores agora, as coisas são mais legíveis. Podemos ver como o preço da ação se desenvolve num intervalo de dez dias.