segunda-feira, 20 de fevereiro de 2017

Reversão à Média : Desmistificando o Log-Returns

Eu tenho lido bastante sobre formas de se identificar quando um certo ativo reverte à média, e me chamou a atenção que há muitas referências que citam o Log-Returns como sendo uma representação dos preços que é mean-reverting, ou seja, quando o valor se distancia muito da média, ele tende a voltar para ela. Tenho visto isso sendo comentado para stocks, então resolvi testar a hipótese em cima de ativos no Forex, para ver se vale a pena criar uma estratégia baseada nisso.

Como a postagem foi ficando bastante extensa, acabei dividindo ela em partes. Na primeira parte, será introduzido o conceito de Log-Returns, do indicador criado, dos desvios que ele sofre e uma estratégia básica que poderia utilizar o indicador. Também será apresentada a metodologia de testes utilizada nos próximos posts para validar (ou não) a estratégia escolhida.

Os resultados e análises serão introduzidos nos posts seguintes. Como cada análise demanda bastante tempo e são muitos parâmetros de teste como verão a seguir, optei por escolher o EURUSD, por ser um ativo de liquidez muito alta, e sempre há bastante disponibilidade de dados dele nos servidores de MT5.

O objetivo deste estudo é encontrar Edges ou Inneficiencies na utilização deste indicador para elaborar estratégias de trading automatizadas.

Introdução ao Log-Returns


Primeiro, eis a definição do Returns $r_i$. Sendo $i$ o candle atual, $i+1$ o candle anterior, e $i+n$ o candle $n$ atrás, define-se
$$r_i \equiv \frac{close_i - close_{i+n}}{close_{i+n}}$$
E tipicamente $n=1$.
Agora assumindo que os preços possuem uma distribuição log-normal, então $log(1+r_i)$ possui uma distribuição normal, pois
$$1 + r_i =\frac{close_i}{close_{i+n}}=\exp^{\log\left(\frac{close_i}{close_{i+n}}\right)}$$
A normalização da série de preços traz consigo várias consequências (boas) no sentido de tornar estratégias de reversão à média viáveis. Não vou focar nisso no momento, mas uma vantagem interessante que vale a pena ser citada, é a seguinte [1]. Considere uma sequência de $n$ trades. O compounding return é uma medida do Retorno composto ao longo do tempo, e é calculado da seguinte forma
$$\left(1+r_1\right)\left(1+r_2\right)\dots\left(1+r_i\right) = \prod\limits_i\left(1+r_i\right)$$
que não é normal (o produto de variáveis aleatórias normais não é necessariamente uma variável aleatória  normal). No entanto, como
$$\log\left(1+r_i\right) = \log\left(\frac{close_i}{close_{i+1}}\right) = \log(close_i) - \log(close_{i+1})$$
o Retorno composto é normalmente distribuído, e temos que
$$\sum\limits_i\log\left(1+r_i\right)=\log(1+r_1)+\log(1+r_2)+\dots+\log(1+r_n) = \log(close_n)-\log(close_0)$$
ou seja, o Retorno composto é a diferença entre o Retorno final e o Retorno inicial da faixa de trades.

Mas basta de calculeira por hoje e voltemos a falar de $\$$.

Hipótese : Estratégia Básica


Uma possível estratégia de trade utilizando esse indicador seria como oscilador. Grosso modo, quando o preço estiver em uma tendência de alta e o Log-Returns estiver muito afastado de sua média para o lado negativo, é long. Analogamente, quando o preço tender em tendência de queda e o Log-Returns estiver muito afastado de sua média para o lado negativo, é short. E para medir esse afastamento, pode-se utilizar, por exemplo, o desvio-padrão do Log-Returns. 

Para avaliar esse setup, criei um indicador chamado de Log Returns Saturator, que calcula o seguinte:
  • Log-Returns, considerando um certo número de períodos
  • Média de longo prazo do Log-Returns
  • Desvio padrão de longo prazo do Log-Returns 

Fig. 1. EURUSD-H1 com Log-Returns Saturator


A Fig. 1 mostra o EURUSD no timeframe H1 com o Log-Returns Saturator na parte de baixo em duas opções. A linha azul como pontos azuis representa o valor do Log-Returns de 10 períodos, e n=1 (gráfico do meio) e n=10 (gráfico de baixo). A linha tracejada cinza é a média simples de 20 períodos do Log-Returns. As linhas tracejadas verde e vermelha representam um canal de desvio-padrão de 20 períodos de distância total 4, em que entre a linha cinza e a linha verde há uma distância de 2 desvios-padrão do Log-Returns, e entre a linha vermelha e a linha cinza há também uma distância de 2 desvios-padrão do Log-Returns. No gráfico principal estão os preços em representação de candles, e uma média móvel de 20 períodos em amarelo. Perceba que o gráfico com n=10 é bem mais suave que o gráfico mais ruidoso com n=1, que relaciona o retorno ao último candle.

Metodologia dos Testes


Estamos interessados nos pontos de saturação do indicador, em que o valor dele ultrapassa os limites dos canais verde e vermelho. As várias perguntas que seguem estão relacionadas com a questão: o que acontece com o preço de fechamento do ativo quando o Log-Returns satura os limites do canal de desvio-padrão?

Para cada conjunto de testes, considerando os últimos 100000 candles (ou o máximo que o servidor disponibilizar), haverá 2 subconjuntos: quando houver o cruzamento do canal inferior (negative breach), e quando houver o cruzamento do canal superior (positive breach). E em cada subconjunto desses, serão calculados a quantidade e a probabilidade amostral do ganho e da perda, e o valor esperado dos parâmetros de ganho, nos seguintes cenários:

Negative Breaches
  1. O próximo candle é positivo [D-1 +];
  2. Os próximos 2 candles são ambos positivos [D-1+ & D-2+];
  3. A mínima do próximo candle é maior que a mínima do candle de rompimento [D-1_low > D0_br_low];
  4. A menor mínima dos próximos 2 candles é maior do que a mínima do candle de rompimento [D-1_low > D0_br_low & D-2_low > D0_br_low];
  5. Caso seja feita uma entrada na abertura do próximo candle após o rompimento:
    1. Probabilidade amostral de o spread de ganho high-open no próximo candle ser maior que {5, 10, 20} Pips [P1{5,10,20}];
    2. Probabilidade amostral de o spread de perda open-low  no próximo candle ser maior que {5, 10, 20} Pips [L1{5,10,20}];
    3. Valor esperado dessa entrada considerando  no próximo candle spread de ganho, spread de perda, e perda por spread Bid-Ask, calculado como $EV = profit\cdot Prob(profit) - loss\cdot Prob(loss) - spread_{Bid,Ask}$ [EV1{5,10,20}]
    4. Probabilidade amostral de o spread de ganho high-open nos próximos 2 candles ser maior que {10, 20, 50} Pips [P2{10,20,50}];
    5. Probabilidade amostral de o spread de perda open-low  nos próximos 2 candles ser maior que {10, 20, 50} Pips [L2{10,20,50}];
    6. Valor esperado dessa entrada considerando  nos próximos 2 candles spread de ganho, spread de perda, e perda por spread Bid-Ask, calculado como $EV = profit\cdot Prob(profit) - loss\cdot Prob(loss) - spread_{Bid,Ask}$[EV2{5,10,20}]
Positive Breaches
  1. O próximo candle é negativo [D-1 -];
  2. Os próximos 2 candles são ambos negativos [D-1- & D-2-];
  3. A máxima do próximo candle é menor que a máxima do candle de rompimento [D-1_ high < D0_br_high];
  4. A maior máxima dos próximos 2 candles é menor do que a máxima do candle de rompimento [D-1_high < D0_br_high & D-2_high < D0_br_high];
  5. Caso seja feita uma entrada na abertura do próximo candle após o rompimento:
    1. Probabilidade amostral de o spread de ganho open-low no próximo candle ser maior que {5, 10, 20} Pips [P1{5,10,20}];
    2. Probabilidade amostral de o spread de perda high-open no próximo candle ser maior que {5, 10, 20} Pips [L1{5,10,20}];
    3. Valor esperado dessa entrada considerando  no próximo candle spread de ganho, spread de perda, e perda por spread Bid-Ask, calculado como $EV = profit\cdot Prob(profit) - loss\cdot Prob(loss) - spread_{Bid,Ask}$ [EV1{5,10,20}]
    4. Probabilidade amostral de o spread de ganho open-low nos próximos 2 candles ser maior que {10, 20, 50} Pips [P2{10,20,50}];
    5. Probabilidade amostral de o spread de perda high-open  nos próximos 2 candles ser maior que {10, 20, 50} Pips [L2{10,20,50}];
    6. Valor esperado dessa entrada considerando  nos próximos 2 candles spread de ganho, spread de perda, e perda por spread Bid-Ask, calculado como $EV = profit\cdot Prob(profit) - loss\cdot Prob(loss) - spread_{Bid,Ask}$[EV2{5,10,20}]

Os valores mais relevantes a serem observados são as probabilidades de manutenção da tendência no próximo candle, e valores esperados positivos. Caso valores esperados positivos sejam encontrados, isso já é bom um indicativo de que vale a pena codificar um EA, e iniciar todo o processo longo de {simulação, optimização, validação estatística, e validação não-invasiva com dados reais, e validação real} para colocar o robô para operar.

Bom, por hoje é isso. Esta semana devo escrever a continuação deste post com os resultados das análises.

[]s.
Rego.

Referências


[1] Why Log Returns


segunda-feira, 26 de dezembro de 2016

Atualização dos Dados Históricos para o formato do MetaTrader4

Continuando o post Dados Históricos de Criptomoedas (Poloniex), hoje fiz a conversão dos dados históricos para o formato do MT4, então a partir de agora os dados serão providos no formato 
date,open,high,low,close,volume

Sendo a TimeZone em UTC. Os próximos passos, provavelmente: prolongar a data inicial dos dados, e criar  novos pares de preços com base na relação entre os pares originais.

A respeito da criação dos pares, a questão principal é que é muito mais legal fazer backtest quando é possível utilizar os resultados da simulação para rodar os robôs em conta real. Nesse sentido, a SimpleFX permite a operação com alguns pares de criptomoedas, como se fossem CFDs. 

Na SimpleFX, os pares de criptomoedas disponíveis hoje são os seguintes:

  • BFXBTC
  • BFXUSD
  • BTCCNY
  • BTCEUR
  • BTCJPY
  • BTCUSD
  • ETCBTC
  • ETCETH
  • ETHBTC
  • ETHUSD
  • LTCCNY
  • LTCEUR
  • LTCJPY
  • LTCUSD
  • NMCUSD

mas infelizmente os dados históricos disponíveis lá são muito recentes. Por exemplo, hoje o candle H1 mais antigo de BTCUSD é de 28/set/2016. Ou seja, quase não há dados para backtest. Isso se resolve em parte com os dados exportados da Poloniex, só que alguns ajustes/ações precisam ser feitos.

O primeiro ajuste a ser feito é a geração dos pares de moedas de interesse. Por exemplo, a Poloniex disponibiliza o par USDTBTC, sendo USDT um instrumento que segue o USD. Para operar na SimpleFX, no entanto, precisaríamos do BTCUSD: em princípio, basta inverter as relações entre os preços. Aos poucos vou disponibilizar esses dados. 

Uma segunda ação é checar se os dados gerados são correspondem a dados reais da SimpleFX. Normalmente dados históricos de um broker para outro variam um pouco, às vezes por conta dos spreads diferentes, requotes, timezone, então é natural que haja alguma variação, mas essa variação deve ser pequena.

Depois alguns pares serão criados, capturando a relação entre pares originais.

Após isso os dados devem ser tratados. Pode haver intervalos de dados com volume zero, outros sem informação de preços. Às vezes é interessante completar os dados (por exemplo, por regressão linear), e às vezes é interessante excluir os dados mesmo, depende do caso. Às vezes é interessante somente conhecer esses detalhes dos dados. Pode haver intervalos redundantes que precisem ser eliminados. Enfim, algumas correções provavelmente serão necessárias.

Resumindo, hoje disponibilizo os dados históricos originais no formato do MetaTrader4. Para acessar os dados históricos, clique na aba Dados Históricos, ou aqui.

Última nota, eu conheço apenas a SimpleFX que permite operações no MetaTrader4 com as criptomoedas, mas com certeza há mais brokers que também o fazem. Se você conhece outros brokers que também o permitem, por favor deixe um comentário com o nome do broker. Vlw!

[]s
Rego.

domingo, 25 de dezembro de 2016

Dados Históricos de Criptomoedas (Poloniex)

Como havia comentado no último post De volta aos posts, reversões, catequese, criptos, encontrei este script em Python, que faz download de dados históricos de criptomoedas da Poloniex (para quem não conhece, a Poloniex é um broker de altcoins), rodei o script com uma mínima modificação, e baixei os dados históricos de todos os pares de moedas que estavam disponíveis. Não vou esmiuçar os detalhes do script agora, a intenção aqui é mais de apresentar a nova página para download de dados históricos do blog.

Para quem não percebeu ainda, o nosso blog possui uma aba nova que dá acesso à página de download de dados históricos. Inicialmente eu devo compartilhar apenas dados baixados da Poloniex, mas posteriormente devo incluir mais fontes de dados, e alguns dados tratados também. A Poloniex não disponibiliza alguns pares de moedas, então é interessante fazer algumas conversões de dados para termos mais acesso a outros pares. 

E o intuito é servir de base de dados para backtest utilizando o MetaTrader 4.

No caso dos dados da Poloniex, sem tratamento, eles vêm no seguinte formato:
close,timestamp,high,low,open,quoteVolume,volume,weightedAverage

e originalmente os são desde 01/janeiro/2014, em candles de 5 minutos. Infelizmente os candles de 1 minuto não são disponibilizados por essa API, mas com M5 já é possível fazer muita coisa.

Hoje os dados compartilhados lá estão sem tratamento, mas a idéia é em breve converter esses dados para o padrão de dados históricos do MT4, ou seja 
date,open,high,low,close,volume

além de forçar os dados a alguma timezone específica, aumentar a data inicial dos dados, fazer teste de coerência dos dados, etc. Mas por enquanto ponho os dados crus, para satisfazer a ansiedade de alguns amigos de começar a analisar esses dados mais rapidamente. 

[]s
Rego.

sábado, 24 de dezembro de 2016

De volta aos posts, reversões, catequese, criptos

Caros,

Depois de um tempinho sem postar, agora o fôlego retomou e vou retomar agora, espero que em uma cadência bem maior que antes. Então vamos falar dos próximos planos.

Nos próximos dias eu devo retomar a série de posts sobre Reversão de Média na Bovespa, eu creio que este tópico sempre chama atenção pois costuma ser um conjunto bastante lucrativo de estratégias de trade, e portanto sempre é interesse de muita gente. Devo discutir a implementação de novas estratégias, variações em cima delas, resultados com conjuntos de dados mais válidos (como por exemplo backtests direto do MetaTrader), enfim, vai ser legal. 

Conversando também com alguns amigos e em alguns grupos de trading, eu percebi também que há muita gente que possui um forte perfil para a Análise Técnica Quantitativa (Quantitative Trading, Algo Trading, ou como você quiser chamar), só que muitas vezes carecem de conhecimento básico mesmo sobre Análise Técnica, sobre princípios básicos. Mais ou menos assim...o cara consegue analisar perfeitamente uma Série de Fourier, uma Wavelet, consegue fazer predições bastante verossímeis em cima de séries temporais com drift (opa, de preços também!), mas, ue... o que é mesmo um candle? E por que não posso usar meu float com a precisão máxima? Bom, então objetivo dessa série de posts, que deve incluir também alguns vídeos, é catequizar um futuro quant trader. Quando vocês virem portanto um post com a tag Catequese de Trade, é disso que eu estou falando. Eu devo fazer também alguns vídeos introdutórios sobre ferramentas, as que eu uso pelo menos. 

E por fim, eu devo iniciar uma série de discussões também em cima do tema de Cripto Moedas. Este mercado tá crescendo muito! BTCUSD, POTBTC, NAVBTC, ETHBTC, a lista de altcoins é imensa, não tão imensa quanto volatilidades fantásticas que às vezes aparecem! E há muitas possibilidades de aplicar a Análise Quantitativa aqui. Eu devo postar alguns vídeos, algumas notícias, algumas análises em cima de comportamentos, enfim o que eu for encontrando vou postando, espero que gostem. Aqui há uns breakouts causados por notícias em cima da atualização na tecnologia das moedas que são no mínimo intrigantes (há! 166% em um dia??? 250% em algumas horas???? e por aí vai). Devo colocar a tag Criptomoedas nesses posts. No próximo post (#cenasdospróximoscapítulos), inclusive, eu devo comentar sobre um script que encontrei para baixar dados históricos de um broker de altcoins para fazer backtesting posterior (por exemplo, com o MT4).

Bom, por enquanto é isso. 
Um abraço,
Rego.

quarta-feira, 28 de setembro de 2016

Reversão de Média Funciona na Bovespa? Parte 1

Alguns dias atrás me chamou a atenção o post  Is mean reversion dead? no blog do Cesar Alvarez, em que ele analisa uma estratégia de reversão de média no mercado americano. O post é de 2013, desde então o Alvarez tem feito vários outros posts com temas próximos, analisando várias variações do mesmo sistema. Decidi então fazer uma análise no mercado da Bovespa seguindo uma abordagem parecida, ou seja, como funcionam as ações da Bovespa quanto a reversão de médias em sistemas mecânicos de regras simples?

Minha motivação nesse estudo é mesmo confrontar algumas estratégias com o funcionamento real no mercado. Francamente não vi muitos sistemas ditos extremamente simples funcionarem bem no mercado brasileiro, e que mantenham índice de Sharpe acima de 2 por muito tempo, então vai ser útil saber como pode ser o comportamento delas.

Alguns livros sobre operação em renda variável se referem à regra da simplicidade, e nem sempre discutem várias modificações que se tem que se fazer no sistema para que ele funcione de verdade; modificações essas que acrescentam mais graus de liberdade aos sistemas e que, portanto, destroem a hipótese da simplicidade. Necessariamente ou você põe uma pitada de subjetividade ganha com a experiência no caso da operação manual (e nesse caso adiciona infinitos graus de liberdade), ou você não roda o sistema exatamente como o livro diz. E não estou falando de ajuste de parâmetros! "Mas eu fiz tudo certo! Por que não funcionou? Isso não presta, não brinco mais." Amiguinho, é que só te contaram 20% da verdade. Os sistemas têm que ser simples para evitar o overfit, mas não tão simples a ponto de não representarem nada: a coisa tem que ter equilíbrio.

Apesar disso, eu acredito que podemos tomar proveito sim de alguns desses sistemas extremamente simples, mas só quando analisados de forma adequada. Mas é claro que há várias formas de se analisar, vamos apenas propor uma delas. Este é o primeiro de uma série de posts, e hoje vamos analisar o caso geral e tentar responder à seguinte pergunta: a estratégia (abaixo) funcionaria na Bovespa no último ano?

A expectativa inicial que eu tinha para essa resposta me surpreendeu bastante. Para o sistema proposto, eu tinha um sentimento de que a resposta seria não, que seriam necessários alguns ajustes no sistema e tal, e eu tinha em mente utilizar por exemplo, o adf para melhorar o resultado.

Vamos então ao que interessa.


Estratégia


  • Entrada (comprada): 
    • IFR2[1] < 40.0
    • Fechamento[1] > Fechamento[2]
  • Saída:
    • IFR2[1] > 60.0
    • Fechamento[1] < Fechamento[2]
    • Última posição do intervalo de dados é fechada
  • Sem stops
  • Sistema comprado (para não entrarmos no mérito de aluguel de ações)
  • Gráfico D1
  • Position Sizing : lote padrão (100), sem empilhamento de posições
  • Universo
    • Conjunto das ações listadas no Índice Ibovespa
    • Intervalo de dados: 1 ano
    • Fonte de dados: Google Finance
  • Não foi considerada performance do sistema no que tange a drawdown, profit factor, sharpe ratio, hit rate, nem estabilidade estatística do sistema. Deixaremos esses pontos para depois.


Método de testes, algoritmo e implementação


A estratégia foi implementada em Matlab, seguindo os seguintes passos
  1. Obter os nomes dos símbolos do Ibovespa
  2. Para cada símbolo, obter o OHLC pela API do Google Finance
  3. Calcular o IFR de cada um desse conjunto de dados
  4. Calcular as condições de entrada e saída
  5. Calcular o retorno para cada par compra/venda dos ativos e obter o lucro final


Resultados e Discussão


Como há bastantes ativos no índice Ibovespa, vou agrupar os símbolos em dois grupos, para ficar melhor de apresentar em gráfico. As figuras 1 e 2 mostram os ganhos absolutos para os ativos. O que surpreendeu aqui foi que a maioria dos ativos obtiveram ganhos positivos, ficando os cinco maiores lucros entre RADL3, SMLE3, EQLT3, MULT3 e BBDC4. Os piores ganhos ficaram para ABEV3, FIBR3, SUZB5, KLBN11 e EMBR3.

Fig.1. Ganhos absolutos em ativos do Ibovespa - Grupo 1
Fig.2. Ganhos absolutos em ativos do Ibovespa - Grupo 2
Para ficar mais fácil de comparar, as figuras 3 e 4 mostram os ganhos relativos, considerando o ganho dividido pelo último preço de fechamento de cada ativo. Os maiores 5 ganhos relativos ficaram por conta de CSNA3, GOAU4, PETR4, BBBR4 e PETR3. Os piores ganhos relativos ficaram novamente com os mesmos ativos que obtiveram os piores ganhos absolutos para a estratégia, nesse período, ou seja, SUZB5, ABEV3, FIBR3, EMBR3 e KLBN11.


Fig.3. Ganhos relativos ao preço de fechamento em ativos do Ibovespa - Grupo 1

Fig.4. Ganhos relativos ao preço de fechamento em ativos do Ibovespa - Grupo 2


Conclusão e Próximos Passos


É fácil perceber que a estratégia proposta parece ser viável do ponto de vista de lucratividade, para vários ativos do Ibovespa. No próximo post vamos rodar o teste ADF Augmented Dickey-Fuller, e comparar com o resultado obtido aqui, para ver se eles são confirmados. Em seguida vamos incluir custos, e comparar novamente os resultados. Isso pode dar um indicativo mais filtrado sobre quais ativos pode valer a pena implementar uma estratégia mais real (em MT5, por exemplo), fazer um backtest mais robusto e avaliar sob pontos de vista de performance do sistema.

Periodicidade de séries temporais de preços

Encontrei um post bem interessante sobre estudo de séries temporais de preços, um modelo que relaciona uma série temporal de logaritmos de preços e associa a uma distribuição de Boltzmann. Para quem tem não tem dificuldade com equações diferenciais, esse post me parece promissor de algumas idéias novas. 


[]s,
Rego.

segunda-feira, 22 de agosto de 2016

Deterioração de Estratégias

Estava lendo o post do Kirill Eremenko Forex Strategy Deterioration: You should be monitoring these statistical parameters! em que ele sugere alguns pontos que devem ser monitorados o tempo todo no seu sistema automatizado. A idéia é que como o mercado sempre está mudando, é natural que ao longo do tempo seu sistema perca eficiência, então monitorar esses parâmetros é uma boa forma de você saber quando precisa reajustar seus parâmetros para o "novo" mercado. Até porque optimizar os sistemas novamente normalmente pode não ser muito trivial (sem falar no tempo e recurso que consome), então é melhor não ficar tentando optimizar tudo a cada minuto. 

Mas vamos ao ponto. Ele sugere que os sistemas devem ter sempre Profit Factor igual ou melhor que 1.6, e Recovery Factor igual ou melhor que 2.0. Isso dá uma zona de conforto para você ir percebendo quando o sistema começa a se deteriorar.

Eu ainda acrescentaria um outro parâmetro a ser observado, mas isso depende de como você inclui o seu sistema como um todo. Um bom sistema deve ter Sharpe Ratio acima de 1.0 para dever ser rodado em modo autônomo. Digo que depende, porque às vezes você possui alguns sistemas que não alcançam Sharpe Ratio acima desse valor, mas que em conjunto (aka Sistema Composto) eles atingem ou ficam acima disso. Por isso essa regra deve ser utilizada, como tudo na vida, com uma boa dose de bom senso. 

Para quem não lembra o que são Profit Factor, Recovery Factor e Sharpe Ratio, as definições são as seguintes.

Profit Factor = Total Soma dos Ganhos / Total Soma das Perdas

Recovery Factor = Ganho Final / Máximo Drawdown Histórico

Sharpe Ratio = Ganho Médio / Desvio Padrão dos Ganhos

O Profit Factor indica quanto o ganho é maior do que as perdas. O Recovery Factor indica quanto a estratégia arrisca para obter o ganho que obtém. E o Sharpe Ratio caracteriza a estabilidade da estratégia.

Então resumindo, ao optimizar (e observar) os parâmetros dos sistemas, é bom ter foco em manter os seguintes valores:

Profit Factor > 1.6
Recovery Factor > 2.0
Sharpe Ratio > 1.0

É isso. 
[]s

quarta-feira, 17 de agosto de 2016

Ferramenta de Arbitragem de Bitcoin

Só passando para comentar sobre ferramenta que encontrei no github para fazer arbitragem de Bitcoin: bitcoin-arbitrage - opportunity detector and automated trading. O código é bem interessante, vale a pena dar uma olhada. 

[]s

quinta-feira, 11 de agosto de 2016

Confiança na Execução do Trade System

Hoje vou falar um pouco sobre auto-confiança na execução de um trade system automático. 

Digamos que uma ideia muito boa surgiu em um belo dia em que você acordou pensando em uma estratégia nova que iria alavancar sua carteira. Eufórico, você começou a implementar seu trade system logo que acordou, e alguns dias depois terminou seu processo de construção do sistema. A simulação foi excelente, optimizado seu sistema alcançou índice de Sharpe maior do que 3, insample maior que 3 anos, outsample maior que 1 ano, máximo drawdown histórico que nao te incomoda, e com um fator de oportunidade que vai proporcionar bons lucros em pouco tempo. E juntando seus outros sistemas que já rodam muito bem, ele só agrega: diminui o drawdown, aumenta o lucro, etc. Você termina satisfeito com sensação de sucesso, e com certeza de ter feito a tarefinha de casa de modo correto.

Aí você põe o sistema para rodar logo em seguida. Nos primeiros trades, o sistema perde dinheiro. Tudo bem, foi o mercado. Mais algumas barras, perde novamente. Pouquinho, mas perde. No final do dia perde pouco, mas perde. Passa o dia seguinte, perde novamente, e novamente, por algumas vezes. Perde pouco.  Só que aos poucos ele vai chegando perto daquele drawdown que antes era não incomodava, e cujo valor em si continua não incomodando, mas os dias vão passando enquanto surge aquela angústia de o sistema não ter iniciado ainda a render aqueles ganhos fantásticos da simulação. Você comeca a se perguntar se mesmo tendo tomado tantos cuidados na construção do sistema, ainda assim o sistema está overfit, ou possui algum hindsight, e aquela sensação de sucesso vai sendo substituída por uma progressiva sensação de insegurança, medo, raiva, ou tudo junto. Você revê os trades, simula novamente e compara com o real; exatamente igual a menos do slippage. 

Mas então o que fazer?
a) Faz alguns ajustes para ver se melhora;
b) Muda tudo, gasta mais alguns dias repetindo tudo o que fez, só que melhor; 
d) Canibaliza o sistema (desliga ele) e desiste;
e) Dá um tempo, volta a rodar alguns dias depois;
f) Você admite o medo, mas prefere observar o sistema por mais tempo, mesmo perdendo;
g) Você é psicologicamente inatingível ("não me faça perder tempo, medo é para fracos") e deixa rodar sem nem questionar ... esquece, esse caso não se enquadra aqui.

Realmente não tem resposta certa. Se você fez seu trabalho de construção corretamente, há uma chance muito boa de que o seu sistema esteja se comportando corretamente, e que depois dessa maré de desilução, venham aqueles bons retornos que sua simulação prometeu. E com certeza essa chance é muito maior do que se você não tivesse construído o sistema da maneira correta. E sempre é claro existe uma probabilidade de que, mesmo contrariando todas as estatísticas que você montou sobre os inúmeros cenários em que o seu sistema deveria funcionar corretamente, o mercado dê uma guinada, e que tudo mude. Mas felizmente a probabilidade de contrariar a estatística completamente é muito baixa.

Certo, mas e se o problema não está no sistema, onde está? Eu creio que o problema maior quando se tem um sistema novo, é simplesmente o fato de ele ser novo. Você não o viu funcionar direito, suas estatísticas são todas baseadas em dados do passado, e leva tempo para se ganhar confiança. 

Então eu acredito que uma forma simples de se evitar esse tipo de coisa, é utilizar um parâmetro que vi poucas pessoas utilizarem para fim de se medir a performance dos trade systems. O profit rate, ou taxa de trades positivos. 

O profit rate é calculado em cima de uma base de trades simulados, como sendo a razão entre o número de trades válidos (com volume diferente de zero) com lucro acima de zero, e o número total de trades válidos. A idéia é rodar o novo sistema em modo paper trade, sem enviar ordens à corretora, até o profit rate para o sistema em paper trade atingir um valor próximo ao valor do profit rate para o sistema simulado. Isso quer dizer que o sistema no mercado real se aproxima do sistema operando no mercado do histórico passado.

Um exemplo. Seja um sistema X optimizado sobre uma base de dados históricos, e o mesmo sistema X' que rodará com dados reais. Em simulação com base de dados de 3 anos, o sistema X atingiu um profit rate de 39%. Isso quer dizer que em média para cada 100 trades, ele acertou 39, a partir da base de dados históricos. Se o sistema foi construído da forma correta, em um infinito tangível ele convergirá para esse valor deprofit rate. Vamos assumir que esse infinito tangível é de 100 trades. Quando completar esse infinito tangível, há uma chance grande de que o sistema X' tenha profit rate tendendo a 39%. Mas antes de ele atingir esse número de trades, provavelmente o profit rate dele será menor ou muito menor do que o valor para o sistema X.

A tabela e figura abaixo mostram um exemplo real de sistema que bateria nos nervos logo no início, mas que rapidamente convergiu para valores próximos desse profit rate de simulação.




Você costuma fazer diferente? Deixe seu comentário.

[]s
Rego.

segunda-feira, 1 de agosto de 2016

Blog: Robot Wealth

Esta semana estava procurando alguns tópicos de estudo sobre estratégias de Mean Reverting, e me deparei com um blog que me chamou muito a atenção: Robot Wealth, do Christopher Longmore. De cara há um post muito legal sobre Machine Learning, e logo embaixo há uma lista muito boa sobre leitura recomendável. Já adicionei alguns títulos à minha listinha de próximos livros a ler. Ainda não tive tempo de ler o blog desde o início, mas está na fila.

Na seção Tools of the Trade, ele fala também de um forum/agregador, que também me chamou bastante a atenção, o Quantocracy, até pelo comentário do Longmore: "The web’s number one trading and finance blog aggregator, Quantocracy is a curated mashup of blogs that deal in the quantitative and empirical. A fantastic source of ideas and inspiration, and a strong and growing community. Daily updates available via email.". Ok... tive que adicionar também à lista. No Quantocracy inclusive tem mais uma lista imensa de outros links recomendados. Vale a pena ver.

[]s.
Rego.