Simulação de Monte Carlo em estratégias de trading

Kaio Valente
Data Hackers
Published in
4 min readMay 13, 2020

A simulação de Monte Carlo é um método estatístico usado para gerar amostragens aleatórias baseadas em grandes quantidades de dados. Seu nome é originado de testes feitos para calcular probabilidade em jogos de cassinos, como o de Monte Carlo.

Em estratégias de investimento, podemos utilizar esse tipo de simulação para estimar possíveis resultados em execuções de operações futuras. Neste estudo foi utilizado uma base de 5 anos de operações realizadas em backtest por um robô, de forma automatizada, no ativo mini índice da bolsa brasileira.

https://unsplash.com/photos/o59Gt5O4QZ4

O que é um Backtest?

Ao realizar um backtest executamos em cima de dados históricos, regras objetivas para determinar pontos de compra ou venda de um determinado ativo assim como pontos de saída com lucro ou prejuízo de cada operação. Ao final temos os resultados e estatísticas da execução. É uma boa prática realizar a validação em uma base de teste em seguida aplicar a mesma configuração em dados não otimizados - isto é, que não fizeram parte do conjunto de dados de teste. Este processo tenta evitar o overfitting de uma estratégia para o período testado.

Porém o que garante que essa estratégia irá performar bem no futuro, com dados nunca vistos?

Como podemos observar que os resultados do teste não foram frutos do puro acaso?

Podemos tentar responder estas questões executando uma simulação de Monte Carlo. Neste cenário, iremos obter todas as operações feitas de 01/01/2015 até 30/12/2019,organizá-las de forma aleatória e gerar um novo de conjunto de dados, porém com as mesmas informações e mesmos resultados. Todos as operações continuam sendo operações reais, de fato foram feitas pela estratégia no passado, mas serão reordenadas de forma diferente. Iremos repetir este processo 1000 vezes para gerar diferentes curvas de capital. Vamos entender o processo

Dataframe inicial com operações realizadas de 01/01/2015 a 30/12/2019

Calculamos o saldo de cada operação e removemos as que tiveram saldo igual a zero, obtendo um total de 7918 operações, com lucro ou prejuízo.

Dataframe com saldo por operação

Em seguida, definimos a função que calcula o saldo acumulado por operação somando a coluna ‘Dif’

Dataframe com saldo acumulado

Por fim, executamos a função “sample” em nosso dataframe. Esta função é responsável por reorganizar de forma aleatória todas as linhas do conjunto de dados. Este processo é repetido 1000 vezes, gerando novos dataframes com ordenação totalmente aleatória.

Exemplo de dataframe com dados organizados de forma aleatória com aplicação da função sample

Ao finalizar todas as 1000 simulações, quero saber qual seria o resultado depois de 3 meses, em seguida, 1 ano de execução aleatória da estratégia, respectivamente. Ao todo temos um total de 7918 operações. Logo, 3 meses de operações seria equivalente a 396 trades e 1 ano a 1584 trades. Vamos ver os resultados:

Todas as curvas de capital geradas na simulação foram plotadas no gráfico:

Curvas de capital após 1 ano

Curvas de capital com resultado negativo após aproximadamente 1 ano:

Curvas de capital negativas após 1 ano

Conclusão

Com a simulação de Monte Carlo podemos observar um excelente resultado para esta estratégia, ao final de 3 meses teríamos a probabilidade de 83.6% de resultados positivos e ao término de 1 ano a probabilidade aumenta para 98.1%. Podemos estender este estudo para obter inúmeras outras informações relevantes, como detectar qual foi rebaixamento máximo da estratégia para todas as simulações ou calcular sua volatilidade média. Se tratando de mercado financeiro, essas informações valem ouro.

O código completo deste estudo pode ser encontrado no meu github.

--

--