Logo hamster-bot
RU EN PT

Carregando…


hw98_console_prompt.avif Teste de estratégias de trading em dados históricos

Backtest de portfólio confiável. Nível de pesquisa quant quant

Primeira execução do testador video primeira execução do testador Visão geral das atualizações e otimizador de parâmetros video visão geral das atualizações e otimizador de parâmetros Varredura e análise. Construção de mapas de calor e 3d Surface video Varredura e análise. construção de mapas de calor e 3d surface Testador de estratégias de trading. Instruções para rodar os testes. Varredura de pares. video instruções para rodar os testes. varredura de pares Testador de estratégias de trading. Guia da nova interface web do testador. video guia da nova interface web do testador

hamster-bot/tester - uma ferramenta avançada para testar seus sistemas de trading em dados históricos.

Recursos do backtester:

Implementado como um conector separado para uma "exchange" (um objeto mock que substitui a exchange). Assim é possível testar todo o código já escrito do bot. O bot acha que está operando em uma exchange real (envia ordens, recebe saldo e informações de posições). E essa exchange virtual simulada calcula tudo e gera o relatório.

Dados de mercado para teste

As exchanges de criptomoedas compartilham publicamente dados históricos de mercado. O testador baixa sozinho o intervalo de dados necessário, monta a partir deles velas de 1 minuto e, a partir desses minutos, forma as barras do timeframe necessário para o bot. Nenhuma ação manual ou cadastro é necessário.
Além disso, são baixados WarmupDays dias antes do início do teste, para que todos os indicadores de AT da estratégia já estejam calculados em StartDate.

Exchanges suportadas. A exchange é obtida do arquivo de configurações da estratégia: settings.exchange.name.

Se for indicada uma exchange para a qual não há downloader, o testador usa os dados da BYBIT.

Armazenamento. Os dados são salvos na pasta tester/data/{exchange}/{symbol} — um arquivo de velas de 1 minuto por dia no formato Parquet (2026-02-03_1m.parquet, na BitMEX 20260203_1m.parquet). Os arquivos são comprimidos e ocupam menos espaço que CSV. Os arquivos de operações baixados são apagados após a conversão, para não ocupar espaço. Dias já baixados não são baixados de novo: nos testes seguintes o testador baixa apenas os dias que faltam (se UpdateData = true). Com UpdateData = false o teste roda apenas com os dados que já estão na pasta.
Na varredura paralela os processos não atrapalham uns aos outros: o mesmo par é baixado por apenas um processo de cada vez, os demais esperam e usam os arquivos já prontos.
Ao iniciar o teste, são lidos apenas os arquivos diários do período do teste (com o aquecimento). Arquivos sem data no nome não são lidos.

Dados no formato CSV antigo. Os dados baixados por versões anteriores do bot (*_1m.csv) não precisam ser baixados de novo: no primeiro teste de um par o testador converte os arquivos CSV dele para Parquet e apaga o CSV. Para converter de uma vez toda a pasta tester/data, use run_convert_data.bat (no macOS, run_convert_data_mac.sh) na pasta do bot: ele executa o bot com a flag --convert-data. Pode ser executado também enquanto o testador está rodando.

Seus próprios dados. Você pode colocar seus dados no formato CSV na pasta tester/data/{exchange}/{symbol}. No primeiro teste desse par (ou via run_convert_data.bat) o testador converte os dados para Parquet e apaga o CSV original, então guarde uma cópia se precisar dele. Requisitos:
— um arquivo por dia, o nome termina com a data e _1m.csv, por exemplo 2026-02-03_1m.csv (arquivos sem data no nome não são lidos);
— velas de 1 minuto (o testador percorre o histórico em passos de 1 minuto / opcionalmente é possível rodar a cada tick, mas fica lento);
— a primeira linha é o cabeçalho, seguida das colunas timestamp,open,high,low,close,volume (as demais colunas são ignoradas; se houver 9 colunas ou mais, as colunas 7–9 são lidas como buy_volume,sell_volume,trades);
— timestamp em UTC: tempo unix em segundos, milissegundos, microssegundos ou nanossegundos (o formato é detectado automaticamente), ou uma data em texto 2026-02-03 00:01:00;
— o separador de colunas é a vírgula, o separador decimal é o ponto.
Exemplo:

timestamp,open,high,low,close,volume
1770076800000,97512.5,97540.0,97480.1,97530.2,12.345
1770076860000,97530.2,97561.7,97522.0,97555.0,8.910

Download antecipado. O arquivo run_download_data.bat na pasta do bot executa o bot com a flag --download-data. Nesse modo o testador não testa nada, apenas baixa todos os dados necessários para o período do teste (+ aquecimento) de todos os pares de tester/settings_strategy, incluindo os pares da varredura parameter_mining. É prático rodar antes de uma varredura grande.

Comportamento do testador

Do ponto de vista do bot, o testador é apenas mais uma exchange. O bot se conecta a ela e começa a receber barras, enviar ordens etc. Enquanto isso, o testador apenas emula o comportamento de uma exchange real.

Tempo e velas. O testador percorre o histórico em passos de 1 minuto, de forma sincronizada em todos os pares. A partir dos minutos ele monta as velas do timeframe de trabalho da estratégia (1m, 5m, 15m, 30m, 1h, 2h, 4h, 6h, 8h, 12h, 1d, 1w) alinhadas ao UTC, como na exchange: velas de 1h começam em XX:00, de 4h — em 00:00/04:00/08:00…, de 1d — em 00:00 UTC, de 1w — na segunda-feira 00:00 UTC.
A estratégia é chamada a cada minuto, e não apenas no fechamento da vela — no timeframe de 1h são ~60 chamadas por vela. O bot recebe as barras fechadas e a vela atual em formação, cujo OHLC é atualizado a cada minuto. Por isso a lógica que depende do preço dentro da vela (trailing stops, reposicionamento de ordens, saída pelo preço atual etc.) funciona igual ao trading real.
As barras do período de aquecimento (WarmupDays) são usadas apenas para calcular os indicadores — o trading começa em StartDate. Se faltar um minuto nos dados (não houve operações), o testador insere uma vela "vazia" com o último preço.

Execução de ordens. Em cada vela de 1 minuto o testador verifica todas as ordens pendentes pelo seu High/Low:

As ordens podem ser alteradas (preço, volume, gatilho) e canceladas — como na exchange.
reduceOnly é suportado: uma ordem assim só pode reduzir a posição e nunca a inverte. As configurações da estratégia use_long/use_short são respeitadas: se uma direção está desativada, uma ordem nessa direção só pode fechar a posição oposta, e o volume "excedente" é descartado.

Posições. Modo One-Way (uma posição por par): uma compra com posição short primeiro fecha/reduz o short, e o excedente abre um long (inversão). Ao aumentar a posição, o preço de entrada é ponderado. O PnL é realizado a cada fechamento ou redução da posição.

O saldo é compartilhado entre todas as estratégias. Se comporta como os futuros da BYBIT/BINANCE com margem cruzada. O bot pode consultar o saldo Wallet ou Margin:
— Wallet — saldo realizado: saldo inicial + PnL realizado − taxas ± funding;
— Margin (equity) — Wallet + PnL não realizado de todas as posições abertas. A curva de equity e o drawdown máximo são calculados a partir dele.
A taxa é descontada do saldo imediatamente a cada execução de ordem.
Se o saldo Margin chegar a zero, o testador interrompe a execução — o depósito "quebrou", não faz sentido continuar testando.

Funding. A cada FundingIntervalHours horas (em UTC, no início da hora) é aplicado funding a todas as posições abertas: tamanho da posição × preço × FundingRate. Com taxa positiva, longs pagam e shorts recebem. Os totais aparecem no relatório (Funding paid / received / net). Para desativar o funding, defina FundingRate = 0.

Lógica do bot. No testador roda exatamente a mesma lógica do trading real: o serviço de posições, o limitador de posições abertas simultaneamente, as opções da conta (por exemplo, fechamento por lucro da margem) — tudo isso é o código de produção compartilhado do bot.

Relatório

Ao final do teste, um relatório HTML interativo detalhado é salvo na pasta tester/report/{name_comment}.
E é adicionado um registro em reports_history.csv com informações resumidas do teste, para facilitar a busca pelas melhores combinações de parâmetros ao otimizar estratégias.

Relatório do otimizador. Na varredura de parâmetros (parameter_mining), além dos relatórios de cada execução, o testador gera mais um relatório resumo, report_optimizer_*.html, com todas as execuções de uma vez. Nele os resultados da varredura são mostrados em mapas de calor e gráficos 3D surface: nos eixos X e Y — os valores dos parâmetros varridos, no eixo Z — as métricas (retorno, drawdown, Profit Factor etc.). Assim se veem de imediato os "platôs" estáveis de bons valores, e não picos isolados aleatórios. O relatório é criado automaticamente na varredura paralela (max_parallel_runs > 1) ou manualmente via run_report_optimizer.bat, mais detalhes na seção "Otimizador".

Cabeçalho do relatório — indicadores principais:

Gráficos:

Report Statistics — estatísticas detalhadas:

Details — abas com detalhamento:

Parâmetros do testador

arquivo: config_tester.json Você pode editar o arquivo em um editor de texto.
name_comment - comentário do teste. Para facilitar a organização dos relatórios. Os relatórios são salvos em uma pasta separada tester/report/{name_comment}.
InitialBalance - saldo inicial para o teste, em USDT
StartDate - data de início do teste, no formato 2026-02-03T00:00:00
EndDate - data de término do teste, no formato 2026-02-13T00:00:00
WarmupDays - número de dias de aquecimento antes do início do teste. Os dados desses dias são baixados adicionalmente antes de StartDate, para que os indicadores de AT já estejam calculados no início do teste.
MakerFee - taxa de maker (0.0001 = 0.01%) Padrão na BYBIT: 0.00036 = 0,0360%. (guia de como reduzir bastante a taxa)
TakerFee - taxa de taker (0.0001 = 0.01%) Padrão na BYBIT: 0.001 = 0,1000%
SlippagePercent - slippage para ordens a mercado (0.0001 = 0.01%)
LimitOrderVolumeCheck - verificação de volume para a execução correta de ordens limitadas (true/false). A ordem limitada é executada no máximo até o volume da vela atual: o testador "morde" da ordem o volume disponível, e o restante espera a próxima vela (execução parcial/em etapas). Se desativado — a ordem limitada é executada por inteiro ao tocar o preço.
FundingRate - Tamanho da taxa de funding (0.0001 = 0.01%)
FundingIntervalHours - Intervalo entre os pagamentos de funding, em horas (8)
maintenance_margin_rate - taxa de margem de manutenção como fração do nocional da posição (padrão 0.005 = 0,5%). Usada na linha Liquidation Level do gráfico de saldo quando a exchange não fornece níveis de risk limit (hoje eles são baixados apenas da Bybit). Não afeta o teste em si.
Janela de negociação por estratégia: adicione "tester": { "StartDate": "...", "EndDate": "..." } ao arquivo de configuração da estratégia. Antes de StartDate a estratégia não negocia; após EndDate o testador cancela suas ordens e fecha sua posição uma vez. Qualquer campo pode ser omitido.
accounts - a conta do testador. É usado o primeiro item: dele vêm close_by_margin e open_positions_limiter para todas as estratégias do teste. Chaves de API não são necessárias. Se a seção não existir, é criada uma conta padrão (opções desligadas): "accounts": [ { "name": "tester", "open_positions_limiter": 0, "close_by_margin": { "profit": 1.0, "loss": 1.0, "size": 1.0, "each": false } } ]
Os arquivos de estratégia do testador ficam na pasta própria tester/settings_strategy, separada da settings_strategy de produção. Todos os arquivos dela são testados; exchange.account é ignorado. Na interface web do bot (Tester → Tabela) é possível adicionar, copiar, editar e excluir configurações do testador, baixar dados, rodar o assistente ou a busca de parâmetros completa; a aba Arquivos é um gerenciador de tester/runs, tester/report e tester/data, onde um snapshot de execução pode ser editado e executado de novo.
UpdateData - atualizar (baixar o que falta) dos dados de mercado antes do teste (true/false)
use_logger - usar o logger. Se desativado, o teste fica mais rápido (true/false)
max_parallel_runs - número de execuções paralelas do testador ao varrer parâmetros. Cada execução é iniciada como um processo separado. Se o desempenho do computador permitir, os processos podem ser paralelizados sem perda de velocidade de cálculo. Com valor maior que 1, após o término de todas as execuções é gerado automaticamente o relatório resumo do otimizador (mapas de calor / 3D surface).
single_mode - modo de teste separado (true/false). Se ativado, cada arquivo de configuração da pasta tester/settings_strategy é testado separadamente, e não todos juntos no saldo compartilhado. Prático para avaliar cada estratégia/par separadamente em uma única execução. A varredura parameter_mining é aplicada a cada estratégia.
use_runs - executar testes a partir de snapshots salvos (true/false). Se ativado, o testador ignora as configurações atuais e executa, um após o outro, todos os arquivos *.json da pasta tester/runs. Cada arquivo é um snapshot completo (estratégias, configurações do programa e do testador, incluindo a conta do testador em accounts). Este modo funciona apenas ao iniciar pelo console (--run-tester): o botão Busca de parâmetros o ignora, e um snapshot individual é executado na interface web com o botão Executar na aba "Arquivos". O próprio testador salva esses snapshots, run_snapshot_{name_comment}.json, na pasta do relatório após uma varredura paralela — você pode copiá-los para tester/runs para repeti-los ou colocar vários testes diferentes na fila.
shuffle_miner, monte_carlo, monte_carlo_seed - modos adicionais do otimizador, descritos na seção "Otimizador".

arquivo: config_tester.json/report Configuração do conteúdo do relatório:
enable_html_report - gerar o relatório HTML (true/false). Se desativado — o HTML não é gerado, apenas uma linha com as métricas resumidas é adicionada a reports_history.csv. Acelera muito as varreduras grandes de parâmetros e economiza espaço em disco.
chart_ohlc_height - altura do gráfico OHLC em pixels
chart_balance_height - altura do gráfico de saldo em pixels
chart_position_height - altura do gráfico de tamanho das posições abertas em pixels
include_chart_ohlc - incluir o gráfico OHLC no relatório (true/false)
include_chart_balance - incluir o gráfico de saldo no relatório (true/false)
include_chart_position - incluir o gráfico de tamanho das posições abertas no relatório (true/false)
include_settings - incluir as configurações das estratégias e os parâmetros do testador no relatório (true/false)
include_trades_table - incluir as tabelas com a lista de operações de cada estratégia (true/false)
include_summary_table - incluir a tabela resumo de todas as estratégias: volume negociado, taxas etc. (true/false)
include_monthly_returns_heatmap - incluir o mapa de calor do retorno mensal (true/false)
include_position_stats - incluir as estatísticas das posições abertas: tamanho médio e máximo das posições abertas em % do saldo Margin (true/false)
enable_timing_logs - exibir no console o tempo de geração de cada etapa do relatório. Útil para diagnóstico, se os relatórios demoram para ser gerados (true/false)

Otimizador (varredura de parâmetros)

O otimizador executa o teste automaticamente muitas vezes, cada vez com uma nova combinação de valores dos parâmetros escolhidos. O resultado de cada execução é gravado como uma linha separada na tabela resumo tester/report/{name_comment}/reports_history.csv: as métricas do teste mais colunas com os valores dos parâmetros varridos. Ordenando-a, é fácil encontrar as melhores combinações.

arquivo: config_tester.json/parameter_mining Configuração do otimizador (varredor de parâmetros):
Por padrão é uma lista vazia [] — um teste único normal. A lista é preenchida com objetos como {"name": "nome_do_parametro", "start": 1, "end": 10, "step": 0.5, "values": []}. Cada objeto é um parâmetro varrido.

name - caminho do parâmetro a varrer. Você pode informar qualquer configuração do bot. O caminho começa com um dos 4 tipos de configuração:
1) settings — configurações de estratégia (arquivos .json na pasta tester/settings_strategy). Aqui configuramos: o par de trading, o timeframe, o gerenciamento do depósito e qual estratégia roda com quais configurações.
Exemplo: settings[*].mrs2.ma_long.type - varre o parâmetro type da ordem de abertura da estratégia mrs2
2) account — a conta do testador (a seção accounts do config_tester.json). Aqui configuramos o take profit geral da conta pelo saldo de margem, ou o limitador do número de posições abertas simultaneamente.
Exemplo: account[*].close_by_margin.profit - varre o parâmetro profit da opção close_by_margin
3) settings_program — configurações gerais do programa do bot (arquivo settings_program.json). Aqui configuramos o multiplicador geral do lote risk_multiplier.
Exemplo: settings_program.risk_multiplier
4) config_tester — configurações do próprio testador (arquivo config_tester.json). Por exemplo, é possível rodar testes com diferentes níveis de taxa ou de slippage.
Exemplo: config_tester.MakerFee

Escolha de uma estratégia/conta específica. Entre colchetes indica-se a quais arquivos aplicar o parâmetro:
settings[*] — a todos os arquivos de configuração de uma vez
settings[0] — apenas ao primeiro arquivo (numeração a partir de 0, na ordem de carregamento)
settings[my_set_btc] — apenas ao arquivo cujo campo name é igual a my_set_btc
O mesmo funciona para account[...] e para listas aninhadas dentro das configurações (por exemplo [*], [0] em uma lista de ordens).

start - valor inicial do parâmetro
end - valor final do parâmetro (inclusive). Também é possível varrer em ordem decrescente, se start > end
step - passo de variação do parâmetro
values - lista explícita de valores para varrer. Se a lista não estiver vazia, start/end/step são ignorados. Os valores são escritos como strings e convertidos automaticamente para o tipo do parâmetro: texto, números ("5", "10", "25"), true/false (["true", "false"]) e listas de opções (enum).
Por exemplo, para o tipo de média móvel, os valores disponíveis são:
["SMA", "EMA", "GMA", "HARMONIC", "TEMA", "DEMA", "ZLEMA", "WMA", "VWMA", "RMA", "EHMA", "THMA", "HMA", "DMA", "ATR", "H", "L", "SMA_KALMAN", "EMA_KALMAN", "GMA_KALMAN", "HARMONIC_KALMAN", "TEMA_KALMAN", "DEMA_KALMAN", "ZLEMA_KALMAN", "WMA_KALMAN", "VWMA_KALMAN", "RMA_KALMAN", "EHMA_KALMAN", "THMA_KALMAN", "HMA_KALMAN", "DMA_KALMAN", "ATR_KALMAN", "H_KALMAN", "L_KALMAN"]
Para a fonte de preço:
["open", "high", "low", "close", "hl2", "hlc3", "ohlc4", "hlcc4", "oc2"].
Para varrer uma lista de pares de trading - veja o Exemplo 1.

Verificação dos nomes. Antes de iniciar, o testador verifica cada name. Se não for encontrado um parâmetro com esse caminho (erro de digitação, estratégia inexistente etc.), é exibido no console o aviso [MINER] Обнаружены невалидные parameter_mining.name ("parameter_mining.name inválido encontrado"), e esse parâmetro não é aplicado — os testes rodam com o valor original. Sempre confira o console na primeira execução de uma varredura.


O número de execuções é o produto do número de valores de todos os parâmetros. Se você indicar dois parâmetros para varrer, por exemplo de 1 a 10 com passo 1, serão feitas 100! execuções (10 variantes do primeiro parâmetro × 10 variantes do segundo parâmetro). Os resultados de todos os testes são salvos como relatórios html separados e na tabela resumo reports_history.csv.
Dicas para uma varredura grande:
— desative os relatórios HTML (report.enable_html_report = false) e o logger (use_logger = false) — isso acelera muito as execuções e economiza espaço em disco;
— aumente max_parallel_runs de acordo com o número de núcleos do processador;
— se houver combinações demais, use monte_carlo (veja abaixo).

Modos adicionais de varredura (arquivo: config_tester.json):
single_mode - cada arquivo de configuração de tester/settings_strategy é testado separadamente, e toda a varredura parameter_mining é executada para cada um deles. Por exemplo, 5 arquivos de configuração × 20 combinações = 100 execuções. Prático quando é preciso ajustar os parâmetros de cada par de forma independente, e não do portfólio.
shuffle_miner - varredura de pares de trading sem repetição entre estratégias (true/false). Funciona quando a pasta tester/settings_strategy tem vários arquivos de configuração e parameter_mining tem um parâmetro do tipo settings[*].... (por exemplo settings[*].basic.symbol). Em vez de dar a todas as estratégias o mesmo valor, o testador distribui a elas valores diferentes da lista e percorre todas as combinações únicas. Exemplo: 3 arquivos de configuração e 10 pares em values → C(10,3) = 120 execuções, em cada uma das quais as estratégias operam pares diferentes. Permite encontrar o melhor conjunto de pares para um portfólio no saldo compartilhado.
monte_carlo - limitar o número de execuções por amostragem aleatória (0 = desativado). Se o número total de combinações da varredura for maior que esse valor, o testador escolhe monte_carlo combinações aleatórias em vez da varredura completa. Útil quando há milhões de combinações: é possível "sondar" rapidamente o espaço de parâmetros e depois estreitar os intervalos em torno dos melhores resultados.
monte_carlo_seed - valor inicial (seed) do gerador de números aleatórios para o Monte Carlo (por padrão 42). Com o mesmo seed a amostra se repete; altere-o para obter outra amostra.

arquivo: config_tester.json/report_optimizer Relatório resumo do otimizador:
Após uma varredura paralela (max_parallel_runs > 1) o testador gera automaticamente, a partir de reports_history.csv, o relatório report_optimizer_*.html. Também é possível gerá-lo manualmente — por exemplo após uma varredura sequencial, ou para refazê-lo com outros z_parameters: o arquivo run_report_optimizer.bat (flag --run-report-optimizer) usa a pasta tester/report/{name_comment}, ou a pasta passada como primeiro argumento.
— se foram varridos 2 ou mais parâmetros numéricos — mapas de calor e gráficos 3D surface. Nos eixos X e Y ficam os dois parâmetros numéricos com mais valores, no eixo Z — as métricas escolhidas;
— se foi varrido 1 parâmetro numérico — gráficos de linha das métricas em função desse parâmetro;
— se pares de trading foram varridos ao mesmo tempo — os gráficos são gerados separadamente para cada par;
— se não houver dados para gerar gráficos — o relatório mostra uma tabela com todos os resultados.
chart_height - altura dos gráficos do otimizador em pixels (550)
z_parameters - lista de métricas para o eixo Z. Por padrão ["TotalPnLPercent", "MaxDrawdownPercent", "ProfitFactor"]. É possível usar quaisquer colunas numéricas de reports_history.csv: TotalPnL, TotalPnLPercent, FinalBalance, TotalTrades, WinRate, MaxDrawdown, MaxDrawdownPercent, TotalFees, PositionAvgPercent, PositionMaxPercent, ProfitFactor.


Exemplo 1: varredura de pares de trading
parameter_mining é uma lista ([]), na qual são adicionados, separados por vírgula, objetos de varredura ([{}, {}]).
Para varrer pares de trading, é usado o parâmetro do tipo string values, enquanto os campos numéricos start/end/step são definidos como 1.0 (eles são ignorados quando values não está vazio).
O parâmetro settings[*].basic.symbol será aplicado a todos os arquivos de configuração da pasta tester/settings_strategy:

"parameter_mining": [
    {
        "name": "settings[*].basic.symbol",
        "start": 1.0,
        "end": 1.0,
        "step": 1.0,
        "values": [
            "1000BONKUSDT", "1000FLOKIUSDT", "1000LUNCUSDT",
            "1000NEIROCTOUSDT", "1000PEPEUSDT", "1000TAGUSDT",
            "4USDT", "AAVEUSDT", "ACHUSDT", "ADAUSDT"
        ]
    }
]

Resultado: o testador vai rodar o teste, um de cada vez, para cada um dos 10 pares.

Exemplo 2: varredura de vários parâmetros ao mesmo tempo
Vamos adicionar, além da varredura de pares, uma varredura do valor de % do take-profit — de 0% a 10% em passos de 0.5 (21 valores no total). Número de combinações: 10 pares × 21 valores = 210 execuções.

"parameter_mining": [
    {
        "name": "settings[*].basic.symbol",
        "start": 1.0,
        "end": 1.0,
        "step": 1.0,
        "values": [
            "1000BONKUSDT", "1000FLOKIUSDT", "1000LUNCUSDT",
            "1000NEIROCTOUSDT", "1000PEPEUSDT", "1000TAGUSDT",
            "4USDT", "AAVEUSDT", "ACHUSDT", "ADAUSDT"
        ]
    },
    {
        "name": "settings[*].options.take_profit_long",
        "start": 0,
        "end": 10.0,
        "step": 0.5,
        "values": []
    }
]

Exemplo 3: configurando uma varredura
video Demonstração em vídeo

Todas as estratégias do bot também estão disponíveis em formato PineScript para testes no TradingView.