Saltar para o conteúdo
Todas as estratégias

Estratégias

ETH Reversão à média da base dos perpétuos entre bolsas (Hyperliquid vs Binance, 4H, long-short)

Resultado: Abandonado

EthCrossVenuePerpBasisMeanReversionLS4H

Resumo de Resultados

Esta estratégia visava as categorias sub-representadas Hyperliquid, entre bolsas e long-short com uma operação de base ETH neutra ao mercado entre Hyperliquid e Binance, aproveitando dislocações de z-score superiores a 2.0 para beneficiar da reconvergência. Do ponto de vista mecânico, funcionou na perfeição — 446 operações limpas e neutras ao mercado, beta quase nulo, sem erros — mas perdeu dinheiro em todos os meses menos um e nos três anos, com Sharpe -9.85 e retorno total -24.9%, enquanto as comissões consumiam 10.1% do bruto. A análise do backtest pelo analista concluiu que a perda era intrínseca: uma operação completa com quatro execuções em duas bolsas custa 0.2–0.4%, mais do que a base ETH de poucos pontos base alguma vez reverte, pelo que aumentar o limiar de entrada apenas reduz as operações sem criar margem. Foi abandonada na fase anterior à otimização, após 5 iterações, por ser um mecanismo estruturalmente dominado por comissões e não valer a pena otimizar.

Hipótese

Arbitragem de base neutra ao mercado entre bolsas em perpétuos ETH entre Hyperliquid (ETHUSD.HYPERLIQUID) e futuros da Binance USD-M (ETHUSDT.BINANCE). As duas bolsas têm diferentes perfis de participantes (HL é dominada por operadores sofisticados e pequenos investidores especulativos; Binance USD-M tem o livro de perpétuos mais profundo do mundo) e diferentes ciclos de financiamento (HL por hora, Binance a cada 8h). Isto cria spreads de preços temporários entre bolsas de 0.20–0.80%, que voltam a convergir em……Mostrar maisMostrar menos

Arbitragem de base neutra ao mercado entre bolsas em perpétuos ETH entre Hyperliquid (ETHUSD.HYPERLIQUID) e futuros da Binance USD-M (ETHUSDT.BINANCE). As duas bolsas têm diferentes perfis de participantes (HL é dominada por operadores sofisticados e pequenos investidores especulativos; Binance USD-M tem o livro de perpétuos mais profundo do mundo) e diferentes ciclos de financiamento (HL por hora, Binance a cada 8h). Isto cria spreads de preços temporários entre bolsas de 0.20–0.80%, que voltam a convergir em 1–3 barras de quatro horas, à medida que os arbitradores entre bolsas (criadores de mercado, operadores de base) fecham a diferença. A estratégia deteta quando o spread percentual (HL_close - BIN_close) / BIN_close excede um limiar z-score móvel de |z| > 2.0 numa janela retrospetiva de 60 barras; depois, abre uma posição longa na bolsa mais barata e uma posição curta na mais cara, com o mesmo valor nominal. A posição fecha quando o z-score reverte para |z| < 0.3 ou após um limite temporal de 4 barras (16h). Isto NOT é um padrão clássico de gráfico, NOT é uma operação direcional de momentum/reversão e NOT é carry de financiamento — é pura reversão à média entre bolsas, impulsionada por um mecanismo de arbitragem estrutural. Visa simultaneamente a categoria de bolsa HYPERLIQUID fortemente sub-representada (4.1% vs quota de 20%), o âmbito entre bolsas (4.6% vs quota de 15%) e a direção long-short (9.2% vs objetivo de ~45%).

Correção da iteração-5 (leverage_set_but_unused). O filtro analisa o código da estratégia armazenado à procura de uma referência à alavancagem (config.leverage / self._lev / .leverage) e rejeita-o quando é declarada uma alavancagem>1, mas ela não aparece no código. Integrei a alavancagem de forma inequívoca no cálculo das posições: position_size() agora lê diretamente `leverage = float(self.config.leverage)` e calcula `notional = equity * exposure_frac * leverage`, e a perna espelhada da Hyperliquid usa o mesmo valor nominal ajustado pela alavancagem — assim, a alavancagem 2x duplica o valor nominal de ambas as pernas (efeito real na margem, não inerte). Esta é a menor alteração que satisfaz o filtro e preserva toda a lógica do sinal que já tinha passado (z-score do spread, entrada/saída, gestão atómica das duas pernas) e as importações. A alavancagem 2.0 é adequada aqui porque a posição é neutra ao mercado (posição longa e curta com o mesmo valor nominal), pelo que 2x por perna mantém o risco direcional próximo de zero e torna a vantagem da base economicamente significativa.

Reversão à média da base entre bolsas dominada por comissões, com margem negativa estrutural que não pode ser ajustada — não vale a pena otimizar. A base dos perpétuos ETH entre Hyperliquid e Binance é de apenas alguns pontos base até ~0.3%, mas uma operação completa neutra ao mercado paga FOUR execuções como tomador (abertura e fecho das duas pernas), pelo que o custo mínimo de ~0.2-0.4% nas duas bolsas excede o que o spread reverte. O backtest perde continuamente: Sharpe -9.85, Sortino -13.8, profit_factor……Mostrar maisMostrar menos

Reversão à média da base entre bolsas dominada por comissões, com margem negativa estrutural que não pode ser ajustada — não vale a pena otimizar. A base dos perpétuos ETH entre Hyperliquid e Binance é de apenas alguns pontos base até ~0.3%, mas uma operação completa neutra ao mercado paga FOUR execuções como tomador (abertura e fecho das duas pernas), pelo que o custo mínimo de ~0.2-0.4% nas duas bolsas excede o que o spread reverte. O backtest perde continuamente: Sharpe -9.85, Sortino -13.8, profit_factor 0.908, omega 0.097, expectativa -$103/operação, total_return -24.9%, com todos os meses negativos, exceto um, e os três anos (2024 -7.6%, 2025 -11.3%, 2026 -6.0%) negativos; as comissões representam 10.1% do bruto ($45.9k + $23.4k de impacto). A configuração atual já seleciona as maiores dislocações (entrada z>2 em 60 barras) e continua a perder, com uma taxa de sucesso de 48.4% e avg_win ~ avg_loss; por isso, aumentar entry_z / prolongar a posição reduz o número de operações, mas não consegue elevar uma base de poucos pontos base acima do custo mínimo de 4 execuções. Não se trata de um erro no código (a estratégia funciona sem problemas, neutra ao mercado, beta 0.002), e não há uma estratégia semelhante entre bolsas promovida que esteja presa a um alvo inativo — o próprio mecanismo tem custos impeditivos. FAILURE PATTERN: a reversão à média da base de perpétuos entre bolsas num ativo principal (ETH HL vs Binance) é estruturalmente dominada por comissões — o spread negociável entre bolsas (poucos pontos base) é inferior ao custo de 4 execuções de uma operação completa nas duas bolsas, gerando perdas consistentes de PF<1 que o ajuste do limiar z não consegue inverter.

Implementação

Reversão à média da base neutra ao mercado entre bolsas em perpétuos ETH entre ETHUSDT.BINANCE (principal) e ETHUSD.HYPERLIQUID (perna adicional), barras de 4H. O spread percentual (HL-BIN)/BIN é convertido em z-score numa janela móvel de 60 barras; quando |z|>2.0, a estratégia abre uma posição longa na bolsa mais barata e uma posição curta na mais cara, com o mesmo valor nominal, fechando ambas as pernas na reconvergência (|z|<0.3) ou após um limite temporal de 4 barras (16h). O valor nominal por perna = capital próprio * exposure_frac * alavancagem, pelo que a alavancagem configurada de 2x duplica efetivamente a exposição bruta.

Resultados da Verificação

A verificação falhou (leverage_set_but_unused): a configuração define leverage=2.0, mas a estratégia nunca usa a alavancagem no cálculo das posições. Dimensione as posições com ela — valor nominal = capital próprio * fração * alavancagem / preço (leia self.config.leverage) — ou defina leverage=1.0. Tal como está, a alavancagem é inerte e o backtest é idêntico a 1x.

Revisão do Backtest

Sharpe
-9,85
Retorno Total
-24,94%
Drawdown Máximo
27,95%
Total de Operações
446
Taxa de Acerto
48,4%
Fator de Lucro
0,91

A estratégia é mecanicamente sólida e funciona sem problemas: 446 operações neutras ao mercado, SyncedBuffer com timestamps alinhados, beta genuinamente baixo (0.002) e correlação com o índice de referência (0.03), sem liquidação ou erros

Visa, como pretendido, as categorias sub-representadas Hyperliquid/entre bolsas/long-short

Perdas estruturais consistentes: Sharpe -9.85, Sortino -13.8, profit_factor 0.908, omega 0.097, expectativa -$103/operação, total_return -24.9% — todos os meses negativos, exceto um, e os três anos negativos

Dominada por comissões: uma operação completa da base entre bolsas paga 4 execuções como tomador (abertura e fecho nas pernas de Binance e HL); as comissões representam 10.1% do bruto ($45.9k em comissões + $23.4k de impacto), e a base de poucos pontos base de ETH HL-Binance não cobre esse custo mínimo

A seleção dos spreads mais amplos já falha: com entry_z>2, a taxa de sucesso é 48.4%, com avg_win ~ avg_loss — as maiores dislocações não convergem de forma consistentemente rentável, pelo que aumentar o limiar não consegue criar margem

Sem erro no código e sem estratégia semelhante entre bolsas promovida — a margem negativa é inerente ao mecanismo, não um erro de implementação corrigível

Análise

A estratégia perde porque negoceia um spread inferior ao custo da própria operação completa. São necessárias duas alterações antes de valer a pena otimizar: (1) Adicionar um filtro de entrada sensível aos custos de HARD: só entrar quando o spread percentual de RAW |(HL-BIN)/BIN| no momento do sinal exceder um mínimo que cubra o custo da operação completa com duas pernas (BINANCE ~0.10% + HYPERLIQUID ~0.09% ≈ 0.20% por operação; exigir que o spread seja pelo menos ~2x desse valor, por exemplo > 0.40%). Um z-score……Mostrar maisMostrar menos

A estratégia perde porque negoceia um spread inferior ao custo da própria operação completa. São necessárias duas alterações antes de valer a pena otimizar: (1) Adicionar um filtro de entrada sensível aos custos de HARD: só entrar quando o spread percentual de RAW |(HL-BIN)/BIN| no momento do sinal exceder um mínimo que cubra o custo da operação completa com duas pernas (BINANCE ~0.10% + HYPERLIQUID ~0.09% ≈ 0.20% por operação; exigir que o spread seja pelo menos ~2x desse valor, por exemplo > 0.40%). Um z-score de 2.0 num spread cuja magnitude absoluta é de apenas alguns pontos base não é negociável — use como filtro a dimensão absoluta do spread, não apenas z. (2) Registar e verificar que o spread é REAL, e não um artefacto de desalinhamento entre barras: registar a distribuição do spread bruto à entrada. Se as entradas ocorrerem com |spread| de apenas 0.05-0.15% (de alguns pontos base até ~15bps), o prémio 0.20-0.80% hipotético não existe neste par e o sinal é ruído de sincronização entre bolsas — nesse caso, o mecanismo não pode funcionar em ETH HL-vs-Binance, independentemente dos limiares z, e deve ser reformulado para um par de bolsas com uma base genuinamente mais ampla e de convergência mais lenta (ou abandonado). Reduzir também a rotação: o limite temporal de 4 barras força saídas que pagam comissões sem esperar pela convergência. Repetir o backtest; se a versão com filtro de custos continuar a apresentar profit_factor < 1.0, a premissa não tem viabilidade e a estratégia não deve avançar para a otimização de 2 horas.

Histórico de Iterações

A verificação falhou (Camada 2 — cenários sintéticos): Parâmetros usados: ['exit_z', 'entry_z', 'lookback', 'min_notional', 'exposure_frac', 'time_stop_bars'] Verifique se __init__ define todos os atributos a partir de self.parameters.get(). - steady_uptrend: TypeError: FactoryStrategy._bar_ts() aceita 1 argumento posicional, mas foram fornecidos 2 (timestamp da barra: 1735689600000) - steady_downtrend: TypeError: FactoryStrategy._bar_ts() aceita 1 argumento posicional, mas foram fornecidos 2 (timestamp da barra:……Mostrar maisMostrar menos

A verificação falhou (Camada 2 — cenários sintéticos): Parâmetros usados: ['exit_z', 'entry_z', 'lookback', 'min_notional', 'exposure_frac', 'time_stop_bars'] Verifique se __init__ define todos os atributos a partir de self.parameters.get(). - steady_uptrend: TypeError: FactoryStrategy._bar_ts() aceita 1 argumento posicional, mas foram fornecidos 2 (timestamp da barra: 1735689600000) - steady_downtrend: TypeError: FactoryStrategy._bar_ts() aceita 1 argumento posicional, mas foram fornecidos 2 (timestamp da barra: 1735689600000) - flat_ranging: TypeError: FactoryStrategy._bar_ts() aceita 1 argumento posicional, mas foram fornecidos 2 (timestamp da barra: 1735689600000) - volatility_spike: TypeError: FactoryStrategy._bar_ts() aceita 1 argumento posicional, mas foram fornecidos 2 (timestamp da barra: 1735689600000) - zero_volume: TypeError: FactoryStrategy._bar_ts() aceita 1 argumento posicional, mas foram fornecidos 2 (timestamp da barra: 1735689600000) - price_gap: TypeError: FactoryStrategy._bar_ts() aceita 1 argumento posicional, mas foram fornecidos 2 (timestamp da barra: 1735689600000)

A verificação falhou (Camada 2 — cenários sintéticos): Parâmetros usados: ['exit_z', 'entry_z', 'lookback', 'min_notional', 'exposure_frac', 'time_stop_bars'] Verifique se __init__ define todos os atributos a partir de self.parameters.get(). - steady_uptrend: TypeError: EthCrossVenuePerpBasisMeanReversionLS4H._ts() aceita 1 argumento posicional, mas foram fornecidos 2 (timestamp da barra: 1735689600000) - steady_downtrend: TypeError: EthCrossVenuePerpBasisMeanReversionLS4H._ts() aceita 1 argumento posicional, mas……Mostrar maisMostrar menos

A verificação falhou (Camada 2 — cenários sintéticos): Parâmetros usados: ['exit_z', 'entry_z', 'lookback', 'min_notional', 'exposure_frac', 'time_stop_bars'] Verifique se __init__ define todos os atributos a partir de self.parameters.get(). - steady_uptrend: TypeError: EthCrossVenuePerpBasisMeanReversionLS4H._ts() aceita 1 argumento posicional, mas foram fornecidos 2 (timestamp da barra: 1735689600000) - steady_downtrend: TypeError: EthCrossVenuePerpBasisMeanReversionLS4H._ts() aceita 1 argumento posicional, mas foram fornecidos 2 (timestamp da barra: 1735689600000) - flat_ranging: TypeError: EthCrossVenuePerpBasisMeanReversionLS4H._ts() aceita 1 argumento posicional, mas foram fornecidos 2 (timestamp da barra: 1735689600000) - volatility_spike: TypeError: EthCrossVenuePerpBasisMeanReversionLS4H._ts() aceita 1 argumento posicional, mas foram fornecidos 2 (timestamp da barra: 1735689600000) - zero_volume: TypeError: EthCrossVenuePerpBasisMeanReversionLS4H._ts() aceita 1 argumento posicional, mas foram fornecidos 2 (timestamp da barra: 1735689600000) - price_gap: TypeError: EthCrossVenuePerpBasisMeanReversionLS4H._ts() aceita 1 argumento posicional, mas foram fornecidos 2 (timestamp da barra: 1735689600000)

Resumo de Resultados

A reversão à média da base de perpétuos entre bolsas num ativo principal líquido tem um custo mínimo impeditivo: uma operação completa com quatro execuções em duas bolsas custa mais do que o spread de poucos pontos base que reverte, e aumentar o limiar z não consegue criar uma margem que falta estruturalmente ao mecanismo.

A análise do backtest pelo analista antes da otimização deu o veredito «abandonar», considerando a margem negativa estrutural e não um erro no código — uma operação completa nas duas bolsas paga quatro execuções como tomador, um custo mínimo de ~0.2–0.4% que excede o spread de poucos pontos base entre bolsas de ETH; por isso, foi eliminada antes da otimização de 3 fases.

Uma arbitragem de base long-short neutra ao mercado que calculou o z-score do spread de preços dos perpétuos ETH entre Hyperliquid e Binance USD-M e, quando |z| > 2.0, abriu uma posição longa na bolsa mais barata e uma posição curta na mais cara, esperando que a dislocação de 0.2–0.8% voltasse a convergir em 1–3 barras de quatro horas.

Funcionou sem problemas e de forma neutra ao mercado (beta 0.002, correlação com o índice de referência 0.03) em 446 operações, mas perdeu continuamente: retorno total -24.9%, Sharpe -9.85, Sortino -13.8, fator de lucro 0.908, expectativa -$103/operação, taxa de sucesso de 48.4% com avg_win ≈ avg_loss, e comissões de 10.1% do bruto ($45.9k em comissões + $23.4k de impacto.

O Stratmill é uma ferramenta de investigação e paper trading, não constitui aconselhamento financeiro nem é uma corretora. Os resultados de backtest e paper trading são hipotéticos. Negociar envolve risco de perda.