Simulação de Monte Carlo de uma estratégia — o risco que um único backtest esconde

Última verificação: · Conteúdo atemporal
Aviso de risco · YMYL Este artigo tem fins exclusivamente educacionais e não constitui aconselhamento de investimento. Operar no mercado Forex envolve alto risco de perda de capital — a ESMA informa que entre 74% e 89% das contas de investidores de varejo perdem dinheiro.

Um leitor me enviou certa vez um backtest do qual se orgulhava: 55 por cento de acerto, ganho médio de 100 euros, perda média de 80 euros, cerca de 3.800 euros de lucro esperado no papel para um ano. Números sólidos o bastante, então ele abriu uma conta real, arriscou cinco por cento por operação e quebrou em seis meses. Perguntou onde estava o erro. O erro não estava na estratégia. Estava em tratar um backtest como uma única verdade, quando o Monte Carlo teria mostrado que aquela mesma vantagem, naquele tamanho de posição, tinha cerca de 25 por cento de chance de arruinar a conta. Essa conversa é a razão de eu ter escrito este texto.

O que é, de fato, uma simulação de Monte Carlo de uma estratégia

Monte Carlo é um método probabilístico que leva o nome do cassino de Mônaco. No trading a ideia é desarmadoramente simples: em vez de olhar a única curva de capital que a história produziu, você gera mil sequências novas com as mesmas estatísticas, mas em ordem diferente. Cada uma desenha um retrato distinto da conta e, juntas, formam a nuvem de possibilidades que um único backtest dentro da oficina prática nunca consegue revelar.

Um backtest isolado é uma única realização de um processo aleatório. A variância em torno dele pode ser enorme — é assim que um jogo repetido com vantagem se comporta. O Monte Carlo transforma essa variância em números concretos sobre os quais você pode agir.

Que perguntas o Monte Carlo realmente responde

A simulação lhe dá três coisas que um único backtest não dá. A primeira é um drawdown (rebaixamento da conta) realista no nível de confiança de 95 por cento — a profundidade que você não ultrapassa em 95 de 100 simulações. A segunda é a probabilidade de perder uma parte significativa da conta, digamos uma queda abaixo da metade do capital. A terceira é a amplitude de resultados anuais plausíveis enquanto a vantagem permanece constante.

No meu cenário ilustrativo (claramente hipotético), uma estratégia com 55 por cento de acerto, ganho médio de 100 euros, perda média de 80 euros e 200 operações por ano tem uma expectativa matemática (expectancy) próxima de 19 euros por operação — 3.800 euros no papel. Uma simulação de mil rodadas produziu uma mediana próxima de 3.750 euros. Os piores cinco por cento das rodadas terminaram em torno de 500 euros de lucro, o pior um por cento em uma perda de 800 euros e os melhores cinco por cento em 7.500 euros. Mesma vantagem, diferença de cinco vezes.

Como rodar a simulação no Excel

Uma versão sem macros já basta para entender a sua própria estratégia. Nas células A1 a A5 você coloca os parâmetros: porcentagem de acerto 0,55, ganho médio 100, perda média -80, número de operações 200 e capital inicial 10.000. Na célula B1 você digita =SE(ALEATÓRIO()<A1; A2; A3) — a função ALEATÓRIO do Excel devolve um valor entre zero e um e, sempre que ele cair abaixo da porcentagem de acerto, você obtém um ganho, caso contrário uma perda.

Na célula C1 você soma o capital inicial ao valor de B1, o primeiro ponto da curva de capital. B2 reutiliza a mesma fórmula, e C2 soma o valor de C1 a B2. Arraste as duas colunas para baixo até a linha 200. Isso constrói uma sequência anual completa.

Copiar as duas colunas para o lado mil vezes (B–C, D–E, F–G e assim por diante) lhe dá mil curvas de capital independentes. A partir dos valores finais você lê =PERCENTIL.INC(intervalo; 0,5) para a mediana, depois 0,05 e 0,01 para os piores cinco e um por cento. Pressionar F9 recalcula cada sorteio aleatório, de modo que cada toque vira um novo estudo de mil rodadas. Isso é genuinamente suficiente.

Como fazer o mesmo em Python com bootstrap

O Python lhe dá duas coisas que o Excel não dá. Primeiro, velocidade — milhares de rodadas levam segundos. Segundo, e mais importante, ele permite fazer bootstrap: sortear não a partir de parâmetros supostos, mas da sua lista real de operações históricas.

Você importa o NumPy, carrega 100 ou mais valores reais de P/L de um diário de trading e escreve new_sequence = np.random.choice(history, size=200, replace=True). A função np.cumsum transforma a lista de valores de P/L em uma curva de capital, e um laço em torno dela lhe dá mil rodadas independentes. Você lê os percentis com np.percentile e usa o Matplotlib para desenhar um spaghetti plot (gráfico de espaguete) — todas as mil curvas sobrepostas, com a mediana e a faixa do percentil 5 ao 95 destacadas.

O bootstrap preserva as caudas reais da sua distribuição — perdas gordas, movimentos agrupados, o eventual ganho recorde em uma semana volátil. As suposições paramétricas não preservam, porque não assumem a distribuição que suas operações de fato têm.

"As relações risco-retorno quase não fazem sentido sem incluir o dimensionamento de posição na equação. Através do dimensionamento de posição, você pode atingir quase qualquer objetivo que desejar." — Van K. Tharp, Trade Your Way to Financial Freedom, McGraw-Hill, 2007

Os limites honestos — o que o Monte Carlo não vai fazer

Uma simulação paramétrica se apoia em duas hipóteses: as operações são independentes e a distribuição de resultados é estacionária. As duas se quebram nos mercados reais ao mesmo tempo. As perdas se agrupam — quando o regime muda, várias operações seguidas se movem na mesma direção, e um modelo que sorteia amostras independentes não consegue reproduzir isso. Drawdowns reais frequentemente parecem piores do que o percentil de 1 por cento do Monte Carlo, não melhores.

O segundo problema é que a simulação usa a mesma história que você lhe forneceu. Se as suas 100 operações cobrem apenas uma tendência de alta no EUR/USD, o Monte Carlo não lhe dirá nada sobre como a estratégia se comporta durante uma longa consolidação ou um movimento brusco de 200 pips após um dado dos EUA. Por isso vale a pena combinar a simulação com a análise walk-forward e gestão de risco, que testa a estratégia em janelas móveis e capta o desgaste da vantagem.

Os drawdowns mais sombrios muitas vezes cavam mais fundo do que o percentil de 1 por cento de uma rodada limpa de Monte Carlo. Trate a simulação como um piso probabilístico, não um teto, e leia-a ao lado do material aprofundado de gestão de risco na ForexMechanics para o contexto de formato longo.

O que fazer agora

  1. Extraia um histórico de pelo menos 100 operações encerradas do seu diário ou da exportação da plataforma. Qualquer coisa abaixo de 100 deixa as estatísticas ruidosas demais para o Monte Carlo dizer algo útil sobre as caudas. Se você tiver menos, opere mais seis a doze semanas e volte a este exercício com uma amostra mais cheia.
  2. Abra uma planilha Excel em branco e monte a versão paramétrica descrita acima. Insira a sua própria porcentagem de acerto, ganho médio, perda média e capital, copie as colunas mil vezes, pressione F9 e estude a dispersão dos valores finais. Essa hora de trabalho revela o quão ampla a faixa realmente é por trás do seu "ano médio".
  3. Leia o percentil de 5 por cento do drawdown máximo a partir dessas mil simulações. Se ele apontar para uma queda de 30 por cento enquanto a sua tolerância psicológica termina por volta de 15 por cento, o problema não é a estratégia, mas o tamanho da posição. Reduza pela metade o risco por operação e rode de novo até o piso de 5 por cento caber dentro do seu limiar de dor.
  4. Depois de um ano de trading real, rode a simulação novamente com o novo histórico e compare-a com a do ano anterior. Se a mediana escorregou e as caudas se alargaram, a sua vantagem está se degradando — esse é o momento de perguntar se a estratégia ainda funciona, não apenas como continuar a remendá-la.
Jarosław Wasiński
Sobre o autor

Jarosław Wasiński

Editor-chefe do MyBank.pl · Analista financeiro e de mercados

Analista e profissional independente com mais de 20 anos de experiência no setor financeiro. Fundador e editor-chefe do portal MyBank.pl, em atividade desde 2004. Análise fundamentalista dos mercados de câmbio e macroeconômicos desde 2007. Escreve a partir da perspectiva dos mercados globais, com atenção ao quadro regulatório europeu (ESMA) e brasileiro (CVM).

Fontes e bibliografia

  1. Bank for International Settlements Minimum capital requirements for market risk (d457) · Bazylejski standard pokazujący, jak instytucje liczą ryzyko rynkowe za pomocą expected shortfall i historycznej symulacji — analog Monte Carlo dla portfela. www.bis.org ↗
  2. Van Tharp Institute About Van K. Tharp · Strona biograficzna potwierdzająca autorstwo książki „Trade Your Way to Financial Freedom" (McGraw-Hill) i jego pracę nad position sizingiem oraz symulacją Monte Carlo dla traderów detalicznych. www.vantharp.com ↗
  3. NumPy Developers numpy.random.choice — Random sampling · Oficjalna dokumentacja funkcji losowania z powtórzeniami; podstawowe narzędzie do bootstrap resampling listy transakcji w Pythonie. numpy.org ↗
  4. Python Software Foundation random — Generate pseudo-random numbers · Oficjalna dokumentacja biblioteki standardowej Pythona z funkcjami random.choices i random.sample, używanymi do prostych symulacji Monte Carlo bez NumPy. docs.python.org ↗

Perguntas frequentes

O que é a simulação de Monte Carlo de uma estratégia de trading?

Monte Carlo é um método probabilístico que leva o nome do cassino de Mônaco. No trading você pega uma lista das suas operações históricas ou os parâmetros da estratégia — porcentagem de acerto, ganho médio, perda média — e, em vez de olhar a única curva de capital que a história produziu, gera mil sequências novas em ordem aleatória. Cada uma tem as mesmas estatísticas, mas uma ordem diferente de ganhos e perdas, então desenha um retrato distinto da conta. Para quê?: um backtest isolado é uma única realização. A variância em torno dele pode ser enorme. A mesma estratégia com uma expectativa matemática de cerca de 19 euros por operação e 200 operações por ano pode produzir, nas simulações de Monte Carlo, uma mediana próxima de 3.750 euros, mas o pior percentil de 5 por cento cai para 500 euros e o melhor 5 por cento dispara para 7.500 euros. A faixa é ampla mesmo quando a vantagem permanece constante. O equívoco mais comum: «no ano passado a estratégia rendeu 5.000 euros, então neste ano deve render algo parecido». O Monte Carlo mostra que, com a vantagem constante, a faixa realista pode ir de 1.000 a 10.000 euros — e não há nada de patológico nisso. É simplesmente variância.

Como fazer uma simulação de Monte Carlo no Excel?

A versão mais simples não precisa de macros nem de VBA. Nas células A1 a A5 você escreve os parâmetros: porcentagem de acerto da estratégia (por exemplo 0,55), ganho médio (por exemplo 100), perda média (por exemplo menos 80), número de operações na sequência (por exemplo 200) e capital inicial (por exemplo 10.000). Na célula B1 você escreve a fórmula =SE(ALEATÓRIO()<A1; A2; A3), que simula uma operação: a função aleatória do Excel devolve um número entre zero e um e, se cair abaixo da porcentagem de acerto, você obtém um ganho; caso contrário, uma perda. Na célula C1 você soma o capital inicial ao resultado de B1. As fórmulas de B2 e C2 são construídas de forma análoga, mas C2 se refere a C1. Arraste para baixo até a linha 200. Assim surge uma sequência anual completa. Duplicando essas duas colunas para o lado mil vezes você obtém mil curvas de capital independentes. A partir dos valores finais você calcula =PERCENTIL.INC(intervalo; 0,5) para a mediana, e com 0,05 e 0,01 para ver os piores 5 por cento e 1 por cento. A tecla F9 recalcula todos os valores aleatórios, então cada toque dá um novo conjunto de mil simulações. O Excel gerencia isso sem problemas e isso basta para entender a sua própria estratégia.

Como implementar Monte Carlo em Python?

O Python faz o mesmo trabalho mais rápido e permite fazer bootstrap (reamostragem com reposição) a partir de um histórico real de operações, e não só de parâmetros. Você importa o NumPy, define os parâmetros da estratégia e escreve uma função que gera uma sequência de resultados: uma tabela aleatória de valores entre zero e um comparada com a porcentagem de acerto dá um vetor de zeros e uns, e a função np.where converte esse vetor em ganhos e perdas médios. A função np.cumsum converte a lista de lucros e perdas (P/L) individuais em uma curva de capital. Você executa essa função em um laço mil vezes, recolhe os valores finais e calcula os percentis com np.percentile. Com uma lista de 100 ou mais operações reais, você usa np.random.choice(history, size=200, replace=True) para fazer bootstrap: extrai uma sequência nova de 200 operações com reposição do seu próprio histórico, preservando assim as caudas reais da distribuição que as suposições paramétricas não reproduzem. A biblioteca Matplotlib permite desenhar um spaghetti plot (gráfico de espaguete), ou seja, as 1.000 curvas sobrepostas com a mediana e a faixa do percentil 5 ao 95 destacadas: uma única imagem diz mais sobre o risco da estratégia do que dez tabelas.

Quais são as limitações do Monte Carlo no trading?

O Monte Carlo não é adivinhação e convém dizê-lo com clareza. A hipótese básica de uma simulação paramétrica é a independência das operações e a estacionariedade da distribuição de resultados. No mercado real ambas as condições se quebram ao mesmo tempo. As perdas tendem a se agrupar: quando o regime de mercado muda, várias operações seguidas podem se mover na mesma direção, algo que um modelo que extrai amostras independentes da mesma distribuição não reproduz. Por isso os drawdowns (rebaixamentos máximos) mais sombrios no real costumam parecer piores do que o percentil de 1 por cento do Monte Carlo, não melhores. O segundo problema é que a simulação usa as mesmas estatísticas que você extraiu da história. Se essa história abrange apenas uma tendência de alta no EUR/USD, o Monte Carlo não lhe dirá nada sobre o comportamento da estratégia em uma fase de consolidação. A consequência prática: trate o resultado do Monte Carlo como um piso probabilístico, não como um teto. Se o pior cenário de 5 por cento fala em uma queda de 30 por cento, assuma que no combate você verá uma mais profunda. Ajuste o tamanho da posição a esse piso probabilístico e não ao resultado esperado médio: assim um revés real não o deixa fora de jogo.

Aprofunde-se · o guia completo