Artigo original: Python for Finance – Algorithmic Trading Tutorial for Beginners

Escrito por: Harshit Tyagi

A tecnologia se tornou um ativo nas finanças. As instituições financeiras estão agora evoluindo para empresas de tecnologia, em vez de se concentrarem apenas nos aspectos financeiros do setor.

Os algoritmos matemáticos trazem inovação e rapidez. Eles podem nos ajudar a obter uma vantagem competitiva no mercado.

A velocidade e a frequência das transações financeiras, juntamente com os grandes volumes de dados, têm atraído muita atenção para a tecnologia por parte de todas as grandes instituições financeiras.

A negociação algorítmica ou quantitativa é o processo de concepção e desenvolvimento de estratégias de negociação com base em análises matemáticas e estatísticas. É uma área extremamente sofisticada das finanças.

Este tutorial serve como um guia para iniciantes em negociação quantitativa com Python. Você achará este artigo muito útil se for:

  1. Um estudante ou alguém que aspira a se tornar um analista quantitativo (quant) em um fundo ou banco.
  2. Alguém que planeja iniciar seu próprio negócio de negociação quantitativa.

Neste artigo, abordaremos os seguintes tópicos:

  • Princípios básicos de ações e negociação
  • Extração de dados da API da Quandl
  • Análise exploratória de dados sobre preços de ações
  • Médias móveis
  • Formulação de uma estratégia de negociação com Python
  • Visualização do desempenho da estratégia

Antes de mergulharmos nos detalhes e na dinâmica dos dados de preços de ações, primeiro precisamos entender os princípios básicos das finanças. Se você já está familiarizado com finanças e com a maneira como as negociações funcionam, pode pular esta seção e passar para a próxima.

O que são ações? O que é a negociação de ações?

Ações

Uma ação é a representação de uma participação na propriedade de uma corporação, emitida por um determinado valor. É um tipo de título financeiro que estabelece sua reivindicação sobre os ativos e o desempenho de uma empresa.

Uma organização ou empresa emite ações para arrecadar mais fundos/capital com o objetivo de expandir e se envolver em mais projetos. Essas ações ficam então disponíveis ao público e são compradas e vendidas.

Negociação de ações e estratégia de negociação

O processo de compra e venda de ações existentes e previamente emitidas é chamado de negociação de ações. Existe um preço pelo qual uma ação pode ser comprada e vendida. Esse preço continua a flutuar dependendo da demanda e da oferta no mercado de ações.

Dependendo do desempenho e das medidas tomadas pela empresa, os preços das ações podem subir ou descer, mas o movimento do preço das ações não se limita ao desempenho da empresa.

Os negociadores pagam dinheiro em troca de participação na empresa, esperando fazer negociações lucrativas e vender as ações a um preço mais alto.

Outra técnica importante que os negociadores seguem é a venda a descoberto. Isso envolve pegar emprestado ações e vendê-las imediatamente, na esperança de comprá-las posteriormente a um preço mais baixo, devolvê-las ao credor e obter a margem de lucro.

Assim, a maioria dos negociadores segue um plano e um modelo para negociar. Isso é conhecido como estratégia de negociação.

Negociadores quantitativos em fundos hedge e bancos de investimento projetam e desenvolvem essas estratégias de negociação e estruturas para testá-las. Isso requer um profundo conhecimento em programação e compreensão das linguagens necessárias para construir sua própria estratégia.

Python é uma das linguagens de programação mais populares usadas, junto com C++, Java, R e MATLAB. Está sendo amplamente adotada em todas as áreas, especialmente em ciência de dados, devido à sua sintaxe fácil, grande comunidade e suporte de terceiros.

Você precisará estar familiarizado com Python e estatísticas para aproveitar ao máximo este tutorial. Certifique-se de revisar seus conhecimentos em Python e verificar os fundamentos das estatísticas (texto em inglês).

Extraindo dados da API da Quandl

Para extrair dados de preços de ações, usaremos a API da Quandl. Antes, porém, vamos configurar o ambiente de trabalho. Veja como:

  1. No seu terminal, crie um diretório para o projeto (nomeie-o como quiser):
mkdir <nome_do_diretorio>
  1. Certifique-se de ter o Python 3 e o virtualenv instalados em sua máquina.
  2. Crie um virtualenv de Python 3 usando virtualenv <nome_do_env> e ative-o usando source <nome_do_env>/bin/activate.
  3. Agora, instale o Jupyter Notebook usando o pip, e digite pip install jupyter-notebook no terminal.
  4. Da mesma maneira, instale os pacotes pandas, quandl e numpy.
  5. Abra o seu jupyter-notebook pelo terminal

Agora, o seu notebook deve estar rodando no localhost, como mostra a captura de tela abaixo:

1-1

Você pode criar seu primeiro notebook clicando no menu suspenso New (Novo) à direita. Certifique-se de ter criado uma conta na Quandl (texto em inglês). Siga os passos mencionados aqui (texto em inglês) para criar sua chave de API.

Uma vez que você esteja pronto, vamos mergulhar de cabeça:

# importando os pacotes necessários
import pandas as pd
import quandl as q

O Pandas será o pacote mais exaustivamente utilizado neste tutorial, pois faremos muitas manipulações de dados e plotagens.

Depois que os pacotes forem importados, faremos solicitações à API do Quandl usando o pacote Quandl:

# define a chave da API
q.ApiConfig.api_key = "<API key>"
# envia uma solicitação GET para consultar os preços de fechamento diário das
# ações da Microsoft de 1º de janeiro de 2010 a 1º de janeiro de 2019

msft_data = q.get("EOD/MSFT", start_date="2010-01-01", end_date="2019-01-01")
# visualizar as primieras 5 linhas dos dataframe

msft_data.head()
2-3

Aqui temos os dados de preços de fechamento diário das ações EOD (de end of the day, em inglês) da Microsoft dos últimos 9 anos. Tudo o que você precisava fazer era chamar o método get do pacote Quandl e fornecer o símbolo da ação, MSFT, e o período de tempo dos dados que você precisa. Isso foi realmente simples, não foi? Vamos avançar para entender e explorar esses dados mais a fundo.

Análise exploratória em dados de preços de ações

Com os dados em mãos, a primeira coisa que devemos fazer é entender o que eles representam e que tipo de informação eles trazem.

Imprimindo as informações do DataFrame, podemos ver tudo que ele contém:

3-1

Como visto na captura de tela acima, o DataFrame contém DatetimeIndex, o que significa que estamos lidando com dados de séries temporais.

Um índice pode ser considerado como uma estrutura de dados que nos ajuda a modificar ou referenciar os dados. Dados de séries temporais são uma sequência de registros instantâneos de preços tirados em intervalos de tempo consecutivos e igualmente espaçados.

Na negociação, os dados de preços de fechamento diário capturam o movimento de certos parâmetros sobre uma ação, como o preço da ação, ao longo de um período especificado de tempo, com pontos de dados registrados em intervalos regulares.

Terminologia importante

Olhando para outras colunas, vamos tentar entender o que cada coluna representa:

  • Open/Close  —  captura o preço de abertura/fechamento das ações
  • Adj_Open/Adj_Close — um preço de abertura/fechamento ajustado é o preço de uma ação em qualquer dia de negociação que foi revisado para incluir quaisquer distribuições de dividendos, desdobramentos de ações e outras ações corporativas que ocorreram a qualquer momento antes da abertura do dia seguinte.
  • Volume — registra o número de ações que estão sendo negociadas em qualquer dia de negociação.
  • High/Low — rastreia o preço mais alto e o mais baixo da ação durante um determinado dia de negociação.

Essas são as colunas importantes nas quais vamos focar neste momento.

Podemos aprender sobre as estatísticas resumidas dos dados, que nos mostram o número de linhas, média, máximo, desvios padrão e assim por diante. Tente executar a seguinte linha de código na célula do IPython:

msft_data.describe()
4-1

resample()

O método resample() do Pandas é usado para facilitar o controle e a flexibilidade na conversão de frequência dos dados de séries temporais. Podemos especificar os intervalos de tempo para reamostrar (mudar a frequência de amostragem) os dados para mensal, trimestral ou anual, além de realizar a operação necessária sobre eles.

msft_data.resample('M').mean()
5-1

Essa é uma maneira interessante de analisar o desempenho das ações em diferentes períodos de tempo.

Calculando retornos

O retorno financeiro é simplesmente o dinheiro ganho ou perdido em um investimento. Um retorno pode ser expressado nominalmente como a variação no valor de um investimento ao longo do tempo. Pode ser calculado como a porcentagem derivada da razão entre o lucro e o investimento.

Temos o pct_change() à nossa disposição para esse propósito. Aqui está como você pode calcular os retornos:

# Importa o pacote do numpy
import numpy as np
# atribui 'Adj_Close' a 'daily_close'
daily_close = msft_data[['Adj_Close']]
# retorna como variação em percentual
daily_return = daily_close.pct_change()
# substitui valores NA por 0
daily_return.fillna(0, inplace=True)
print(daily_return)

Isso imprimirá os retornos que a ação vem gerando diariamente. Multiplicando o número por 100, você obterá a mudança percentual.

A fórmula usada em pct_change() é:

Retorno = {(Preço em t) — (Preço em t-1)} / {Preço em t-1}

Agora, para calcular retornos mensais, tudo que precisa fazer é:

mdata = msft_data.resample('M').apply(lambda x: x[-1])

monthly_return = mdata.pct_change()

Após reamostrar os dados para meses (considerando apenas os dias úteis), podemos obter o último dia de negociação no mês usando a função apply().

apply() recebe uma função e a aplica a cada linha da série Pandas. A função lambda é uma função anônima em Python que pode ser definida sem um nome e só aceita expressões no seguinte formato:

Lambda: espressão

Por exemplo, lambda x: x * 2 é uma função lambda. Aqui, x é o argumento e x * 2 é a espressão avaliada e retornada.

dias móveis no mercado financeiro

O conceito de médias móveis vai estabelecer a base para nossa estratégia de negociação baseada em momentum.

No campo financeiro, os analistas frequentemente têm que avaliar métricas estatísticas continuamente ao longo de uma janela de tempo móvel, o que é chamado de cálculos de janela móvel.

Vamos ver como podemos calcular a média móvel ao longo de uma janela de 50 dias e deslizar a janela por 1 dia.

rolling()

Esta é a função mágica que faz os truques para nós:

# atribuindo os preços de fechamento ajustados a
adj_pricesadj_price = msft_data['Adj_Close']
# calcular a média móvel
mav = adj_price.rolling(window=50).mean()
# imprime o result
print(mav[-10:])
6-1

Você verá a média móvel em uma janela de 50 dias (aproximadamente 2 meses). As médias móveis ajudam a suavizar qualquer flutuação ou pico nos dados, proporcionando uma curva mais suave para o desempenho da empresa.

Podemos traçar um gráfico e ver a diferença:

# importa o pacote matplotlib para visualizar o gráfico
import matplotlib.pyplot as plt

adj_price.plot()
7-1

Você pode traçar o gráfico da média móvel:

mav.plot()
8-1

Você também pode ver a diferença por si mesmo, como os picos nos dados são suavizados para fornecer uma ideia geral sobre o desempenho da ação.

Formulando uma estratégia de negociação

Aqui vem a parte final e mais interessante: desenhar e criar a estratégia de negociação. Este será um guia passo a passo para desenvolver uma estratégia de Cruzamento de Média Móvel Simples (Simple Moving Average Crossover - SMAC) baseada em momentum.

Estratégias baseadas em momentum são fundamentadas em um indicador técnico que capitaliza a continuidade da tendência do mercado. Compramos valores mobiliários que mostram uma tendência de alta e vendemos a descoberto valores mobiliários que mostram uma tendência de baixa.

A estratégia SMAC é uma estratégia de momentum bem conhecida. É uma estratégia apenas de compra. Aqui, o momentum é o retorno total da ação, incluindo os dividendos, nos últimos n meses. Esse período de n meses é chamado de período de observação.

Existem 3 principais tipos de períodos de observação: curto prazo, médio prazo e longo prazo. Precisamos definir 2 diferentes períodos de observação de uma série temporal específica.

Um sinal de compra é gerado quando a média móvel (ou média móvel simples) de período curto ultrapassa a média móvel de período longo. Um sinal de venda ocorre quando a média móvel de período curto cai abaixo da média móvel de período longo.

Agora, vamos ver como será o código para essa estratégia:

# passo 1: inicialize os períodos de observação curto e longo.

short_lb = 50
long_lb = 120
# passo 2: Inicialize um novo DataFrame chamado signal_df 
#          com uma coluna de sinal.

signal_df = pd.DataFrame(index=msft_data.index)
signal_df['signal'] = 0.0
# Passo 3: crie uma média móvel simples curta 
#          sobre o período de observação curto.

signal_df['short_mav'] = msft_data['Adj_Close'].rolling(window=short_lb,                                     min_periods=1, center=False).mean()
# Passo 4: crie uma média móvel simples longa 
#          sobre o período de observação longo.

signal_df['long_mav'] = msft_data['Adj. Close'].rolling(window=long_lb, min_periods=1, center=False).mean()
# Passo 5: gere os sinais com base na declaração condicional.

signal_df['signal'][short_lb:] = np.where(signal_df['short_mav'][short_lb:] > signal_df['long_mav'][short_lb:], 1.0, 0.0)
# Passo 6: crie as ordens de negociação com base na coluna de posições.

signal_df['positions'] = signal_df['signal'].diff()
signal_df[signal_df['positions'] == -1.0]

Vamos ver o que está acontecendo aqui. Criamos 2 períodos de observação. O período de observação curto, short_lb, é de 50 dias, e o período de observação mais longo para a média móvel longa é definido como long_lb de 120 dias.

Criamos um DataFrame projetado para capturar os sinais. Esses sinais são gerados sempre que a média móvel curta cruza a média móvel longa usando np.where. Ele atribui 1.0 para verdadeiro e 0.0 se a condição for falsa.

As colunas positions no DataFrame nos informam se há um sinal de compra, um sinal de venda, ou se deve-se manter a posição. Basicamente, estamos calculando a diferença na coluna de sinais em relação à linha anterior usando diff.

Lá, temos nossa estratégia implementada em apenas 6 passos usando o Pandas. Fácil, não é?

Agora, vamos tentar visualizar isso usando o Matplotlib. Tudo que precisamos fazer é inicializar um gráfico, adicionar os preços de fechamento ajustados, as médias móveis curtas e longas ao gráfico. Em seguida, fazemos o gráfico (plot) dos sinais de compra e venda usando a coluna de posições no signal_df acima:

# Inicialize o gráfico usando plt.
fig = plt.figure()
# Adicione um subgráfico e rótulo para o eixo y.
plt1 = fig.add_subplot(111,  ylabel='Preço em $')
msft_data['Adj. Close'].plot(ax=plt1, color='r', lw=2.)
# Plote as médias móveis de curto e longo prazo.
signal_df[['short_mav', 'long_mav']].plot(ax=plt1, lw=2., figsize=(12,8))
# Plotando os sinais de venda.
plt1.plot(signal_df.loc[signal_df.positions == -1.0].index,
			signal_df.short_mav[signal_df.positions == -1.0],'v',
            	markersize=10, color='k')
# Plotando os sinais de compra.
plt1.plot(signal_df.loc[signal_df.positions == 1.0].index,
			signal_df.short_mav[signal_df.positions == 1.0],
			'^',
          	markersize=10, color='m')

Executando as células acima no Jupyter Notebook resultaria em um gráfico como o abaixo:

image-2

Agora, você pode ver claramente que sempre que a linha azul (média móvel curta) ultrapassa e vai além da linha laranja (média móvel longa), há um marcador rosa para cima indicando um sinal de compra.

Um sinal de venda é indicado por um marcador preto para baixo sempre que houver uma queda da média móvel curta (short_mav) abaixo da média móvel longa (long_mav).

Visualize o desempenho da estratégia no Quantopian

O Quantopian (texto em inglês) é uma plataforma alimentada por Zipline que possui diversos casos de uso. Você pode escrever seus próprios algoritmos, acessar dados gratuitos, testar sua estratégia, contribuir para a comunidade e colaborar com o Quantopian se precisar de capital.

Escrevemos um algoritmo para testar nossa estratégia de SMA e aqui estão os resultados:

10-1

Aqui está uma explicação das métricas acima:

  • Total return: é a porcentagem total de retorno do portfólio desde o início até o final do backtest.
  • Specific return: é a diferença entre os retornos totais do portfólio e os retornos comuns.
  • Common return: são retornos atribuíveis a fatores de risco comuns. Existem 11 fatores de risco setoriais e 5 de estilo que compõem esses retornos. Os gráficos de Exposição Setorial e Exposição de Estilo na seção de Risco fornecem mais detalhes sobre esses fatores.
  • Sharpe: é o sharpe ratio de 6 meses consecutivos. É uma medida de investimento ajustada ao risco. É calculado dividindo os retornos excedentes do portfólio sobre a taxa livre de risco pelo desvio padrão do portfólio.
  • Max Drawdown: é a maior queda de todo o movimento do pico ao ponto mais baixo na história do portfólio.
  • Volatility: é o desvio padrão dos retornos do portfólio.

Parabéns! Você implementou com sucesso sua estratégia de trading quantitativo.

Para onde ir a partir daqui?

Agora que seu algoritmo está pronto, você precisará realizar backtests dos resultados e avaliar as métricas que mapeiam o risco (texto em inglês) envolvido na estratégia e na ação. Novamente, você pode usar o BlueShift e o Quantopian para aprender mais sobre backtesting e estratégias de negociação (textos dos links em inglês).

Recursos adicionais

Quantra-logo-Black
https://quantra.quantinsti.com/learning-track/algorithmic-trading-for-everyone?utm_source=harshit_tyagi&utm_medium=affiliate&utm_campaign=lt_everyone

Quantra (texto em inglês) é uma criação da QuantInsti. Com uma variedade de cursos gratuitos e pagos ministrados por especialistas na área, a Quantra oferece um guia completo sobre diversas estratégias de negociação, tanto básicas quanto avançadas.

  • Curso de Ciência de Dados  (texto em inglês) — eles lançaram um curso introdutório sobre Ciência de Dados que ajuda a construir uma base sólida para projetos na área.
  • Curso de Negociação para iniciantes (texto em inglês)  — desde negociação por momentum até estratégias de negociação baseadas em aprendizado de máquina e deep learning (aprendizagem profunda), pesquisadores renomados no mundo da negociação, como o Dr. Ernest P. Chan, são os autores desses cursos especializados.

Recursos gratuítos

Para aprender mais sobre algoritmos de negociação, confira esses blogs:

  • Quantstart  (texto em inglês) — eles abrangem uma ampla gama de algoritmos de backtesting, guias para iniciantes e muito mais.
  • Investopedia (texto em inglês) — tudo o que você deseja saber sobre investimentos e finanças.
  • Quantivity (texto em inglês)  — explicações matemáticas detalhadas dos algoritmos, bem como suas vantagens e desvantagens.

Warren Buffet diz que lê cerca de 500 páginas por dia, o que indica que a leitura é essencial para ter sucesso na área de finanças.

Embarque nesta jornada de negociação e você poderá levar uma vida cheia de emoção, paixão e matemática.

Ciência de Dados com Harshit

Com este canal, estou planejando lançar uma série de vídeos que cobrirá todo o espaço da ciência de dados (em inglês). Aqui está o motivo pelo qual você deve se inscrever no canal (texto em inglês):

Se este tutorial foi útil, confira meus cursos de ciência de dados e aprendizagem de máquina na Wiplane Academy (texto em inglês). Eles são abrangentes, porém compactos, ajudando a construir uma base sólida de trabalho para mostrar.