Um Monte Carlo de um backtest reordena ou reamostra os resultados do histórico milhares de vezes e observa quanto mudam as quedas. Serve para ver a dispersão do risco que uma única ordem de operações esconde. Não é um segundo teste da estratégia: trabalha com os mesmos dados, com a sua sorte e com os seus vieses. Aqui você vê o que ele responde, o que não responde e o que o relatório do Rigor calcula, com um exemplo sintético que se reproduz com a sua semente.
O que é reamostrar operações ou uma curva
Um backtest entrega uma sequência: operações fechadas ou retornos por período da curva de capital. Reamostrar é construir históricos novos com essas mesmas peças. Embaralhar muda apenas a ordem e mantém cada resultado. O bootstrap sorteia peças com reposição, de modo que um histórico pode repetir umas e omitir outras. O bootstrap estacionário sorteia blocos de períodos consecutivos, de comprimento aleatório, para conservar parte da dependência entre dias próximos.
Cada método repete o sorteio milhares de vezes e resume o resultado: a queda máxima mediana, a que aparece em 1 em cada 20 históricos ou a proporção de históricos que cai mais que um limite. O nome Monte Carlo se refere a esse uso de sorteios repetidos. Não acrescenta informação que o histórico não tenha; organiza a que já existe.
O que responde: a dispersão se a ordem for intercambiável
A queda máxima de um backtest depende da ordem em que as perdas chegaram. Com os mesmos resultados, outra ordem teria dado uma queda mais leve ou mais profunda, e uma sequência de perdas mais curta ou mais longa. Um Monte Carlo responde a essa pergunta concreta: que faixa de quedas e sequências esses resultados produzem se a ordem for intercambiável, isto é, se qualquer ordem era igualmente provável.
Essa suposição marca o limite da resposta. Se as perdas dependem do regime de mercado, de posições abertas ao mesmo tempo ou de mudanças de tamanho, a ordem não é intercambiável e embaralhar disfarça isso. O bootstrap por blocos conserva a dependência dentro de cada bloco, mas não reconstrói regimes que o histórico não contém.
Um exemplo calculado com a sua semente
Declarado · Uma série sintética de 500 retornos diários, gerada com NumPy com semente 20261008, média de 0,05 % e desvio de 1 % ao dia. Na ordem gerada, sua queda máxima é de 12,2 %. Com shuffled_drawdown, 1.000 ordens aleatórias dos mesmos retornos com semente 20260926, a pior queda vai de 7,5 % a 16,2 % em 9 de cada 10 ordens, com mediana de 10,6 %.
Declarado · Com drawdown_risk, o bootstrap estacionário do relatório (2.000 históricos de 252 dias, bloco esperado de 5 dias e semente 12345), a queda máxima em um ano tem mediana de 8,5 % e chega a 15,5 % em 1 em cada 20 históricos. Ao todo, 32,9 % dos históricos caem pelo menos 10 % e 0,8 %, pelo menos 20 %.
Os dois números medem coisas diferentes: o primeiro percorre os 500 dias da série; o segundo, um ano. Nenhum é uma medição de uma estratégia nem uma previsão. O código do artigo fixa a semente e os parâmetros, então o mesmo cálculo sempre dá esses números.
O que não responde: o sobreajuste e a busca
Um Monte Carlo não distingue um resultado com vantagem de um escolhido por sorte entre muitos. Reamostra o que existe: se o que existe é o melhor de cem tentativas, reamostra essa sorte. Também não diz como a estratégia se comportaria com dados que não viu, nem desconta os custos que o backtest omitiu.
Para a busca de configurações existe outra ferramenta: o Sharpe deflacionado compara o Sharpe observado com o que as tentativas feitas dariam por acaso. Para o ajuste ao passado, um trecho fora da amostra fixado antes de olhar os resultados. Os artigos vinculados sobre o Sharpe deflacionado e sobre o que fazer depois do backtest explicam os dois; a calculadora de sorte vinculada faz a primeira conta com números declarados.
Por que o Monte Carlo de um backtest otimizado herda o seu viés
O otimizador escolhe a configuração cujo histórico saiu melhor. Por causa dessa seleção, o histórico tem mais sequências favoráveis e quedas mais leves que as do processo que o gerou. A reamostragem parte desses mesmos retornos, então seus históricos herdam a média inflada e as quedas suavizadas. Um leque de curvas estreito e ascendente pode ser apenas a marca da escolha.
Declarado · Geramos 100 séries sintéticas de 250 retornos diários com média zero e desvio de 1 % (semente 20261009) e ficamos com a de maior resultado final. Com drawdown_risk e os mesmos parâmetros, sua queda máxima em um ano tem mediana de 7,4 %, e 15,6 % dos históricos caem pelo menos 10 %. Outros 5.000 dias do mesmo gerador (semente 20261010) dão mediana de 14,8 %, com 83,4 % dos históricos caindo pelo menos 10 %. Nenhuma série tinha vantagem: a diferença vem da seleção.
O que o relatório do Rigor calcula
O relatório chama isso de risco reamostrado em um ano. A função drawdown_risk monta milhares de históricos de um ano com blocos dos retornos do seu arquivo, com um bootstrap estacionário cujo bloco esperado parte de 5 períodos e aumenta quando os retornos se agrupam. Mostra a queda máxima mediana, a de 1 em cada 20 e a de 1 em cada 100, a probabilidade de cair pelo menos 10, 20, 30 ou 50 % e os períodos seguidos abaixo do máximo. A semente é fixa e o relatório a imprime.
Ao lado, shuffled_drawdown compara a pior queda do arquivo com a dos mesmos retornos em ordens aleatórias, que mantêm o Sharpe, a volatilidade e o resultado final. Se a queda do arquivo é mais leve que em quase todas as ordens, as perdas se seguiram menos do que o acaso daria, como numa curva suavizada; se é mais profunda, chegaram em sequências. Com operações fechadas, loss_streak_review faz a mesma comparação com a maior sequência de perdas, e o simulador de desafios percorre históricos reamostrados da mesma forma com as regras de cada desafio.
Uma reamostragem entra na classe: o percentil 5 do Sharpe num bootstrap estacionário faz parte do teste contra o acaso. O risco reamostrado, as ordens aleatórias e as sequências são informativos e não mudam a classe. Todos descrevem o histórico fornecido; nenhum é uma previsão.
Veja no relatório de exemplo
Abra o relatório de exemplo vinculado para ver o risco reamostrado com dados sintéticos e depois compare com o do seu próprio arquivo.
Perguntas frequentes
Um Monte Carlo favorável descarta o sobreajuste?
Não. Reamostra o histórico que já existe; se esse histórico saiu da escolha da melhor de muitas configurações, a reamostragem conserva o viés. Para a busca serve o Sharpe deflacionado e, para o ajuste ao passado, um trecho fora da amostra fixado antes de olhar.
Quantas simulações são necessárias?
Mais simulações refinam os percentis, mas não mudam o que é reamostrado. O relatório usa milhares de históricos com semente fixa para que o mesmo arquivo dê os mesmos números. O limite principal é a duração e a representatividade do histórico, não o número de sorteios.