A premissa
A maioria dos bots entrega uma estratégia e assume que funciona. Este assume o contrário e gasta o esforço justamente na diferença: quais estratégias sobrevivem a dados em que nunca foram ajustadas. A pesquisa lê histórico real de candles da API pública da Binance; ordens e saldos vêm da Spot Testnet, com dinheiro fictício. Os dois são separados de propósito, porque o histórico da própria testnet é raso e em parte sintético.
market history (Binance public API, up to 5000 candles)
|
v
research sweep -> optimise parameters on the first 65% of history
| score on the held-out 35% (out-of-sample)
v
leaderboard -> only candidates that stay profitable out-of-sample,
| beat buy-and-hold, and earn money across sub-periods
| are marked "aprovada"
v
walk-forward -> the same parameters re-run over eight rolling quarters,
| judged on how many they won, not on the total
v
live engine -> runs the chosen strategies on the testnet,
one position per symbol, acting on closed candles onlyUma candidata precisa merecer o "aprovada"
Os parâmetros são ajustados nos 65% mais antigos da história e a classificação sai só dos 35% que o otimizador nunca viu. Nessa fatia escondida, a candidata precisa:
- ser lucrativa
- ter Sharpe acima de 0,3
- ter pelo menos 3 trades
- bater buy-and-hold na mesma janela
- dar lucro em pelo menos metade de oito subperíodos iguais
Um backtester que se recusa a se elogiar
Toda premissa é contra a estratégia. O sinal é executado na abertura do candle seguinte, então nunca vê o preço em que opera; quando um candle toca stop e alvo, assume-se que o stop veio primeiro; o motor ao vivo só age em candle fechado e só entra na transição do sinal, então uma alocação nova nunca compra um movimento que começou dias atrás. As taxas são lidas de volta da corretora em vez de assumidas, e isso importa justamente porque a testnet não cobra nenhuma: os 0,2% por round trip apareceriam pela primeira vez com dinheiro de verdade.
# every simulated trade is charged on both sides
FEE = 0.001 # 0.1%, the same rate paper trading charges
SLIPPAGE = 0.0005 # 0.05% assumption
# and the backtester refuses to flatter itself:
# the position decided at bar t's close is filled at bar t+1's open
# when a bar touches both the stop and the target, the stop hits first
# after a protective exit the strategy stands aside until its signal
# drops and turns long againWalk-forward, e depois três livros
Uma divisão treino/teste testa uma única virada de regime, então as sobreviventes são reexecutadas em oito trimestres móveis e julgadas por quantos venceram, não pelo total. Medido nas alocações ao vivo deste projeto, manter os parâmetros em produção ganhou de reotimizar a cada janela em cinco de seis; 365 candles diários não sustentam uma grade de 500 pontos.
O painel roda três livros lado a lado com ledgers separados: o validado, baseado em regras; um experimento de machine learning que ranqueia o universo todo dia; e um experimento de saída que entra igual e sai de quatro formas diferentes, resolvendo por medição uma discussão que costuma ser resolvida por opinião.
Como ele reporta
- Painel local em 127.0.0.1, sem build step
- Patrimônio, P&L realizado e não realizado, win rate, profit factor, drawdown, Sharpe
- Cada entrada e saída com os valores dos indicadores que dispararam
- Dezessete alocações em candles de 4h e 1d, quase sempre paradas, de forma legível
Um pipeline Spark como documento JSON: escrito, gerado, ou desenhado num canvas.