Type/to search
2
Follow
484
Followers
Estratégia quantitativa de filtragem por média móvel: uma prática quantitativa do pensamento do Harness Engineer
Discussions
Created 2026-04-17 11:55:34  Updated 2026-04-21 09:00:18
 0
 374

img

Introdução: O Pensamento Harness Engineer

Recentemente, na comunidade de engenharia de IA/ML, uma forma de pensar tem sido cada vez mais discutida — Harness Engineer.

Sua ideia central é simples:

Em vez de dar respostas baseadas em suposições, crie uma estrutura para que os dados e experimentos encontrem as respostas por si mesmos.

A abordagem do engenheiro tradicional é: "Acho que o parâmetro A é bom, vou escrever código para implementar A". A abordagem do Harness Engineer é: "Não sei se A, B ou C são bons, vou criar uma estrutura para que A, B e C sejam executados simultaneamente, e os dados me darão a resposta".

O engenheiro define o espaço de busca e os critérios de avaliação; o sistema é responsável por otimizar automaticamente dentro desse espaço. Essa ideia corresponde, em ML, à walk-forward optimization e AutoML; em quant trading, também tem aplicações naturais.

img

Moedas Anormais: O Campo de Batalha com Tendências Mais Evidentes

No mercado de contratos de criptomoedas, há um tipo de moeda que merece atenção especial — as chamadas "moedas anormais" (ou "moedas selvagens"), com alto volume de negociação.

Essas moedas compartilham algumas características:

  • Capital altamente concentrado, com comportamento evidente de grandes players (baleias)
  • Continuidade de tendência relativamente forte, geralmente durando mais tempo quando iniciam um movimento
  • Alta volatilidade; algumas moedas de alto volume mostram forte tendência em períodos específicos, e estratégias de médias móveis historicamente apresentam desempenho relativamente bom nesses ativos

Por isso, usar a clássica estratégia de cruzamento de duas médias móveis nessas moedas é um ponto de partida simples e razoável. Quando a média rápida cruza acima da lenta, a tendência começa, e você entra; quando a rápida cruza abaixo da lenta, a tendência se reverte, e você sai. A lógica é simples, mas historicamente, em ativos com tendências claras, o desempenho não é ruim.

A questão é apenas uma: Quais moedas são anormais? E quais parâmetros de médias móveis usar?

Essas duas perguntas, se respondidas manualmente, são muito subjetivas. Outra pessoa pode dar respostas completamente diferentes. Além disso, o mercado é dinâmico: a moeda anormal de hoje pode não ser a de amanhã, e os parâmetros eficazes hoje podem falhar amanhã.

É aí que o pensamento Harness Engineer entra em cena.

Em vez de selecionar moedas e ajustar parâmetros manualmente, deixe ambas as questões para a estrutura resolver: defina os critérios de avaliação, deixe os dados históricos rodarem dentro do espaço candidato e obtenha as respostas. O ser humano só precisa decidir quais métricas usar para medir o bom ou ruim; o resto fica por conta do sistema.

Com base nessa ideia, toda a estratégia foi projetada como uma estrutura de seleção rolante, operando em três camadas.

img

Arquitetura da Estratégia: Mecanismo de Corrida de Cavalos em Duas Camadas

Primeira Camada: Construção do Pool de Ativos

A partir de todos os contratos do mercado, selecione os 150 principais em ordem decrescente de volume em dólar (USD) como pool candidato.

Por que volume em dólar? Porque onde há alto volume, o capital está mais concentrado, as tendências se formam mais facilmente e as moedas anormais são mais densas. Esta etapa não envolve julgamento subjetivo; apenas deixa o capital do mercado votar — quanto maior o volume de negociação, maior a chance de entrar no pool.

javascript
const filtered = tickers .filter(t => t.Symbol.endsWith('USDT.swap')) .map(t => ({ symbol: t.Symbol, quoteVolume: t.Last * t.Volume })) .sort((a, b) => b.quoteVolume - a.quoteVolume) .slice(0, topN) .map(t => t.symbol);

A lógica é direta: filtre contratos USDT, calcule o volume em dólar, ordene decrescente, pegue os N primeiros. Nenhum julgamento subjetivo — o capital do mercado vota por si só.

Segunda Camada: Seleção por Corrida de Cavalos Dupla

Esta é a parte mais central de toda a estratégia e onde o pensamento Harness é mais evidente.

A ordem correta de execução é a seguinte:

img

⚠️ Nota: Usar a pontuação do melhor parâmetro para representar a capacidade de uma moeda carrega inerentemente algum risco de overfitting — o parâmetro que teve melhor desempenho no passado pode não ser igualmente eficaz no futuro. Essa limitação será discutida mais adiante no artigo.

Processo de Backtest

Para cada moeda no pool candidato, execute simultaneamente múltiplas combinações de parâmetros MA (médias móveis). Cada combinação é executada de forma independente nos candles históricos, simulando a lógica real de cruzamento de abertura e fechamento:

javascript
// Loop para cada moeda × cada combinação de parâmetros for (const params of maParamsList) { const bt = backtest_MA(records, params.fast, params.slow); // Cada backtest gera independentemente: taxa de acerto, razão ganho/perda, drawdown máximo, número de sinais }

A lógica central de cada backtest é o cruzamento padrão de duas médias móveis:

javascript
const crossUp = fastMA[i-1] <= slowMA[i-1] && fastMA[i] > slowMA[i]; const crossDown = fastMA[i-1] >= slowMA[i-1] && fastMA[i] < slowMA[i]; if (crossUp) position = { side: 'long', entryPrice: records[i].Close }; if (crossDown) position = { side: 'short', entryPrice: records[i].Close };

Pontuação Composta

Após o backtest, os resultados de cada combinação de parâmetros são avaliados em uma pontuação composta. A pontuação é composta por duas partes:

Pontuação de Pesos Normalizados (coeficiente total 0.80):

javascript
const score = Math.min(bt.winRate * 100, 100) * 0.30 // Taxa de acerto, limite máximo 100 + Math.min(bt.profitFactor * 20, 60) * 0.30 // Razão ganho/perda, limite máximo 60 + Math.max(0, 1 - bt.maxDrawdown / maxMDD) * 100 * 0.20 // Controle de drawdown máximo + volPct * volPctBonus // Bônus de percentil de volatilidade

Bônus de Percentil de Volatilidade: O último termo volPct × volPctBonus (coeficiente padrão 10) é um bônus independente do sistema de pesos, usado para, em condições de pontuação iguais, favorecer moedas cuja volatilidade atual está em um percentil histórico elevado — pois essas moedas tendem a ter tendências mais ativas.

Vale notar que esses pesos e coeficientes de bônus são definidos empiricamente, não otimizados, e podem ser ajustados conforme o ambiente de mercado na prática.

Primeira Disputa: Competição de Parâmetros

Para uma mesma moeda, múltiplas combinações de parâmetros geram pontuações; a maior pontuação é usada como a pontuação representativa da moeda e seu melhor parâmetro:

javascript
if (score > bestScore) { bestScore = score; bestResult = bt; bestParams = params; // Registra a combinação de parâmetros com melhor desempenho histórico atual }

Segunda Disputa: Competição entre Moedas

Todas as moedas apresentam suas melhores pontuações; após ordenar, as Top N entram na whitelist:

javascript
results.sort((a, b) => b.score - a.score); const whitelist = results.slice(0, topCoins).map(r => r.coin);

O resultado final é um parâmetro de média móvel ótimo e exclusivo para cada moeda na whitelist, não um conjunto único de parâmetros aplicado a todas.

Terceira Camada: Execução ao Vivo e Gerenciamento de Risco

Use a configuração selecionada para negociar ao vivo, com múltiplas camadas de controle de risco:

Gatilho de Sinal: Monitore em tempo real o estado de cruzamento das médias móveis das moedas na whitelist; cruzamento dourado (fast acima de slow) para comprar, cruzamento da morte (fast abaixo de slow) para vender:

javascript
const crossUp = fastPrev <= slowPrev && fastCur > slowCur; const crossDown = fastPrev >= slowPrev && fastCur < slowCur; if (crossUp) longList.push(sym); if (crossDown && allowShort) shortList.push(sym);

Stop Dinâmico (Trailing): Ativado quando o lucro flutuante atinge um limiar; o limiar de retração (drawdown) aperta dinamicamente conforme o lucro aumenta. Três níveis são definidos empiricamente — a lógica central é que quanto maior o lucro flutuante, menor a tolerância a retrações, para proteger lucros acumulados:

javascript
function getDynamicTrailDrawdown(maxPnl) { if (maxPnl >= 7) return 3; // Lucro alto, tolerância a retração mais apertada if (maxPnl >= 4) return 2; return 1.5; // Lucro baixo, dá mais espaço para o movimento }

Percepção do Estado do Mercado: Detecte o percentil de volatilidade do BTC; em ambientes de alta volatilidade, reduza automaticamente o coeficiente de tamanho de posição; em condições extremas, proíba totalmente vendas a descoberto:

javascript
if (marketState === 'volatile') positionScaleDown = 0.5; else if (marketState === 'high_vol') positionScaleDown = 0.8; else if (marketState === 'low_vol') positionScaleDown = 0.7;

Todo o processo de seleção é executado ciclicamente de forma rolante, não se fixa a uma única configuração, atualizando dinamicamente a whitelist e os parâmetros conforme o mercado.


Suposição Subjacente: Continuidade das Tendências

Para que essa estrutura funcione, depende de uma suposição central:

Moedas e parâmetros que tiveram bom desempenho na história recente tendem a manter essa continuidade no curto prazo seguinte.

Isto não é metafísica; há uma certa lógica de mercado por trás — a inércia dos fluxos de capital, a continuidade do sentimento do mercado e a consistência do comportamento dos grandes players fazem com que a tendência se mantenha válida dentro de uma certa janela temporal.

No entanto, é preciso ser honesto: essa suposição não passou por uma verificação estatística rigorosa; é mais um julgamento empírico. Se o framework se manterá eficaz na negociação real, só os dados reais de trading poderão comprovar.


Qual a verdadeira diferença para um Harness Engineer?

É preciso deixar isso claro.

Esta estratégia tem a forma de um Harness, mas ainda há uma diferença significativa em relação ao sistema real de Harness Engineer:

DimensãoHarness genuínoEsta estratégia
Divisão de amostrasConjunto de treino + validação + holdout de testeBacktest com todos os dados históricos, sem validação fora da amostra
Proteção contra overfittingTeste explícito de generalizaçãoDepende em parte da diversidade de parâmetros para compensar, mas incompleto
Isolamento experimentalCada variante executa de forma independente, sem interferênciaCompartilha os mesmos candles K, com acoplamento implícito
Requisito para produçãoPrecisa passar pela validação antes de ser implantadoO de maior pontuação vai diretamente para produção, sem camada de verificação secundária
Acumulação de errosAvaliação independente em cada camadaAs duas camadas de competição se baseiam no ótimo histórico, com erros acumulados

A diferença central está em: um verdadeiro Harness questiona "esse resultado ainda se mantém fora da amostra?", enquanto esta estratégia seleciona os "ótimos" através de duas camadas de competição que, no fundo, são ótimos históricos — overfitting no nível de parâmetros combinado com overfitting no nível de moedas. Se isso continuará válido no futuro é uma questão eternamente em aberto.


Considerações finais: Procurar uma espada marcando o barco, ou vale a pena tentar?

No mundo quantitativo, prever sempre foi extremamente difícil.

Muitos dirão que usar dados históricos para selecionar parâmetros e depois ir para o mercado real é, essencialmente, procurar uma espada marcando o barco — a espada já caiu na água, e a marca que você fez no barco não vai ajudá-lo a encontrá-la. O mercado muda, parâmetros eficazes se tornam obsoletos, a moeda anormal de hoje pode se tornar comum amanhã, a média móvel ótima de ontem pode ser apenas ruído hoje.

Essa crítica não é infundada.

Mas, por outro lado, as tentativas que devem ser feitas, ainda devem ser realizadas.

A essência da quantificação nunca foi encontrar uma resposta eternamente correta, mas sim aumentar sistematicamente a taxa de acerto em meio à incerteza. Mesmo que seja procurar uma espada marcando o barco, você primeiro precisa de um barco e fazer a marca — localizar a estratégia (o barco) já é o início da quantificação.

Claro, o framework em si não garante lucro. Ter um framework é apenas o ponto de partida; o verdadeiro valor está na execução e iteração contínuas: a lista de permissões pode ser ajustada, os pesos de pontuação podem ser alterados, o espaço de parâmetros pode ser expandido, o stop de lucro e perda pode ser otimizado. Cada ajuste é um novo experimento, aproximando cada vez mais este framework de um verdadeiro Harness.

O caminho se faz ao andar, não ao imaginar.

Código-fonte da estratégia: Harness Engineer Estratégia Quantitativa de Seleção de Médias Móveis

Comment
All comments (0)
No data
No data
  • 1
iPhone Download
Forums
PINE Language
© 2015 - ∞ INVENTOR PTE LTD (SG)