PáginasOtimização · 20 / 29
Otimização
O QuantCraft pode executar vários backtests em sequência com valores diferentes para os seus parâmetros de entrada e deixar você comparar os resultados. Configure as execuções pelo Test (Execução de código); os resultados resumidos aparecem em Resultados dos testes. Há duas estratégias de busca disponíveis:
- Brute force — testa todas as combinações dos valores que você listar.
- Genetic — usa um algoritmo genético para explorar grandes espaços de busca com muito menos execuções.
Ambos os modos são configurados na aba Script da caixa Run backtest (o botão Test) e só aparecem quando o seu script declara parâmetros por meio de quantcraft.inputs (os caminhos mais antigos quantcraft.inputs_module / ide.inputs_module ainda são reconhecidos em scripts existentes). Salve grades de otimização e outras configurações da caixa com as Predefinições de execução (.qcs) (optStep / optMax são armazenados para predefinições de backtest).
Onde encontrar
- Abra a caixa Test com o botão Test na barra de ferramentas do IDE.
- Abra a aba Script (exibida quando o seu script importa
paramsdequantcraft.inputs— ou dos caminhos mais antigosquantcraft.inputs_module/ide.inputs_module). - Ative Optimize e escolha Brute force ou Genetic.
As execuções de otimização usam as mesmas configurações de Symbol & data e Simulation de um backtest normal. Você só configura como os parâmetros variam.
Comportamento da tabela de parâmetros com a otimização ativada
A tabela Parameter values ganha duas colunas extras quando a otimização está ativada:
| Coluna | Finalidade |
|---|---|
| Parameter | O nome do seu script (somente leitura). |
| Type | int, float, bool ou str. |
| Value | Nos tipos numéricos, é o início da grade. Em bool/str, é o valor fixo. |
| Step | Somente numérico. Passo entre valores consecutivos (positivo ou negativo). |
| Max | Somente numérico. Limite superior nas grades crescentes ou limite inferior nas decrescentes. |
Comportamento por tipo:
int/float— os valores são gerados comostart, start+step, …até Max, inclusive (arredondado emint).bool— expandido automaticamente paratrueefalse(dois valores).str— mantido fixo; um parâmetro de string não varia.
Cada linha mostra um pequeno marcador (true / false ou fixed) quando o valor não pode ser expandido, para que você veja de relance quais parâmetros realmente variam.
Força bruta (grade de parâmetros)
A força bruta avalia todas as combinações dos valores que você definiu. Se você listar 5 valores para length e 4 para threshold, são 5 × 4 = 20 backtests.
Limites e validação
- O número total de combinações é limitado a 256 execuções. Acima disso, a caixa bloqueia o envio com uma mensagem explícita pedindo que você amplie os passos ou remova parâmetros da grade.
- Cada intervalo numérico precisa dos três: Value (início), Step e Max. O Step não pode ser 0.
- Se o Max não puder ser alcançado a partir do Value com o sinal de Step escolhido, a caixa explica o problema (por exemplo, início ≤ máximo para passos positivos).
O que você vê durante a execução
Quando você envia uma otimização por força bruta:
- Um banner de cabeçalho aparece na visualização Test results:
Optimization — <file> (current/total). - O painel de saída registra cada execução com a sua combinação de parâmetros, além de uma linha de cabeçalho:
Optimization (brute force): N backtest run(s). - A barra de progresso do painel de saída mostra
Run X / N. - Um botão Stop está disponível — as execuções já concluídas são mantidas e exibidas nos resultados.
O que você vê ao terminar
O painel Test Results exibe uma visualização Optimization:
- Um cabeçalho resumindo o script e quantas execuções foram concluídas.
- Uma faixa de abas com todas as execuções, cada aba rotulada com a combinação de parâmetros (por exemplo,
length=20, threshold=1.5). Quando os rótulos ficam longos, a combinação completa é mostrada acima do gráfico da execução ativa. - Selecionar uma aba mostra a visualização normal de desempenho daquela execução (gráfico de patrimônio, métricas, operações), para que você possa detalhar qualquer combinação.
- Se a execução foi interrompida antes de todas as combinações serem concluídas, um banner informa que os resultados são parciais.
Busca genética
O modo genético é a escolha certa quando a grade de força bruta seria grande demais. Em vez de testar cada combinação, ele faz evoluir uma pequena população de candidatos ao longo de várias gerações, mantendo os melhores e recombinando-os.
Hiperparâmetros
Mude a aba interna para Genetic e você verá estes campos:
| Campo | Intervalo | Observações |
|---|---|---|
| Population size | 4 – 64 | Número de candidatos avaliados por geração. Valores típicos são 8–32. Deve ser maior que Elitism. |
| Generations | 1 – 40 | Cada geração executa uma população completa de backtests. |
| Elitism | ≥ 1, < população | Melhores candidatos copiados sem alteração para a geração seguinte. |
| Crossover rate | 0 – 1 | Chance de dois pais produzirem um filho misto (caso contrário, o primeiro pai é copiado). |
| Mutation rate | 0 – 1 | Chance, por gene, de saltar aleatoriamente para outro valor discreto. |
| Fitness metric | lista suspensa | O que a busca maximiza (veja abaixo). |
| Random seed (optional) | texto | Use a mesma semente para reproduzir uma busca exatamente. |
O total de backtests executados é population × generations. Esse produto é limitado a 400 avaliações — se você o exceder, a caixa pede que reduza um dos dois valores.
Os alelos (os valores discretos que cada parâmetro pode assumir) são exatamente as mesmas grades que a força bruta construiria:
- Parâmetros numéricos usam Value / Step / Max para criar uma lista discreta.
- Parâmetros bool viram
true/false. - Parâmetros string são fixos (e não afetam a busca).
A busca genética precisa de pelo menos um parâmetro que possa variar (mais de um alelo). A caixa bloqueia o envio e pede que você amplie uma grade numérica ou inclua um
boolse todos os parâmetros forem fixos.
Métricas de aptidão
A lista suspensa oferece (quanto maior, melhor):
- Sharpe ratio (padrão)
- Sortino ratio
- Total return
- Total P/L ($)
- Profit factor
- Calmar ratio
A métrica é lida do desempenho da conta de cada backtest — as execuções que deram erro recebem a menor aptidão possível e, por isso, sempre ficam por último.
O que você vê durante a execução
- Banner de cabeçalho:
Genetic optimization — <file>comGeneration g of N, individual i of P. - O painel de saída registra a busca:
Genetic optimization: population P, N generation(s), fitness = …, depois── Gen g/N, indiv i/P: <combo> ──para cada backtest. - A barra de progresso mostra
Gen g/N · i/P. - Um painel de resultados parciais aparece assim que as primeiras execuções terminam — os candidatos já avaliados são ordenados por aptidão e listados com prefixos
G<g>·…para que você veja quem lidera sem esperar a busca inteira.
O que você vê ao terminar
- O painel Test Results mostra Genetic optimization — <file> junto com a métrica de aptidão usada e o número de execuções.
- A visualização final contém a última geração ordenada por aptidão, com a melhor no topo. Cada aba abre a visualização de desempenho completa daquela execução.
- Se você pressionar Stop, as avaliações concluídas de todas as gerações até então são exibidas ordenadas por aptidão, e um banner informa que a busca foi interrompida antes da hora.
Dicas práticas
- Comece pequeno. Uma grade de força bruta com 3 parâmetros de 10 valores cada já dá 1000 execuções — bem acima do limite de 256. Reduza os passos antes de ativar a otimização.
- Prefira o Genetic para espaços grandes. Além de ~3 parâmetros numéricos, costuma ser mais rápido e útil usar algumas gerações de busca genética do que uma pequena grade de força bruta.
- Fixe uma semente quando quiser que uma execução Genetic seja reproduzível (por exemplo, comparar duas estratégias com a mesma busca).
- Use o Stop à vontade. Ambos os modos preservam as execuções já concluídas, então você pode interromper assim que surgir um vencedor claro.
- Escolha a aptidão com intenção. Sharpe e Sortino recompensam a consistência, Total return / Total P/L perseguem o crescimento bruto, Profit factor recompensa o equilíbrio entre ganhos e perdas e Calmar penaliza drawdowns profundos.
- Inspecione cada execução. Cada aba de resultado contém o gráfico de patrimônio padrão, as métricas e o histórico de operações — você pode exportar o relatório HTML de qualquer execução individual como em um backtest único.

