🎯 Algoritmo: Arbitragem Spot vs Futuros (Alta Precisão)

1. Identificar o par spot desejado

Exemplo: LTCBTC, ETHBTC, etc.

2. Buscar o preço do par no mercado Spot

Chamada na API Spot para o par:
GET /api/v3/ticker/24hr?symbol=LTCBTC
Obter:
  • lastPrice
  • bidPrice
  • askPrice
Calcular o preço médio (midPrice) do Spot:
spotMidPrice = (bidPrice + askPrice) / 2

3. Identificar os dois pares equivalentes no mercado futuro

🔍 Regra Geral para Conversão:

Se você tem o par Spot BASE/QUOTE:
  1. Verifique se BASE/USDT e QUOTE/USDT existem nos futuros
  2. Calcule: BASE/QUOTE = (BASE/USDT) / (QUOTE/USDT)

📋 Exemplos Práticos:

Par Spot: LTCBTC
  • Futuros: LTCUSDT, BTCUSDT
  • Resultado: LTCBTC_futuros = LTCUSDT / BTCUSDT
Par Spot: ETHBTC
  • Futuros: ETHUSDT, BTCUSDT
  • Resultado: ETHBTC_futuros = ETHUSDT / BTCUSDT
Par Spot: SOLBTC
  • Futuros: SOLUSDT, BTCUSDT
  • Resultado: SOLBTC_futuros = SOLUSDT / BTCUSDT
Par Spot: DOGEETH
  • Futuros: DOGEUSDT, ETHUSDT
  • Resultado: DOGEETH_futuros = DOGEUSDT / ETHUSDT

🧠 Lógica Matemática:

// Para qualquer par BASE/QUOTE
spotPrice = BASE/QUOTE
futurePrice = (BASE/USDT) / (QUOTE/USDT)

// Comparação
spread = (spotPrice - futurePrice) / futurePrice

📊 Tabela de Referência Rápida:

Par SpotFuturo 1Futuro 2Cálculo Futuro
LTCBTCLTCUSDTBTCUSDTLTCUSDT / BTCUSDT
ETHBTCETHUSDTBTCUSDTETHUSDT / BTCUSDT
SOLBTCSOLUSDTBTCUSDTSOLUSDT / BTCUSDT
DOGEETHDOGEUSDTETHUSDTDOGEUSDT / ETHUSDT
ADAETHADAUSDTETHUSDTADAUSDT / ETHUSDT
LINKBTCLINKUSDTBTCUSDTLINKUSDT / BTCUSDT
DOTBTCDOTUSDTBTCUSDTDOTUSDT / BTCUSDT

4. Buscar os preços nos futuros perpétuos

Chamada na API de Futuros:
GET /fapi/v1/ticker/bookTicker?symbol=LTCUSDT
GET /fapi/v1/ticker/bookTicker?symbol=BTCUSDT
Obter:
  • bidPrice, askPrice de cada um
Calcular o preço médio (midPrice) dos dois:
midLTC = (bidLTC + askLTC) / 2
midBTC = (bidBTC + askBTC) / 2

5. Calcular o preço sintético do par nos futuros

futuroLTCBTC = midLTC / midBTC

6. Comparar os preços Spot e Futuros

spread = (spotMidPrice - futuroLTCBTC) / futuroLTCBTC

7. Avaliar se há oportunidade de arbitragem

Definir um limiar mínimo de spread para compensar:
  • Taxas de negociação
  • Slippage
  • Funding Rate (no mercado futuro)
  • Custo de transferência (se houver)
Exemplo:
Se spread > 0.25%, considerar arbitragem

8. Consultar o funding rate atual (se relevante)

Chamada:
GET /fapi/v1/premiumIndex?symbol=LTCUSDT
Obter:
  • lastFundingRate
Avaliar:
  • Se estiver positivo, posições long pagam funding
  • Se estiver negativo, posições short pagam funding

9. Definir estratégia com base na diferença

Se spot > futuro:
  • Vender no spot (ou short no spot se possível)
  • Comprar no futuro (long)
Se futuro > spot:
  • Comprar no spot
  • Vender no futuro (short)

10. Executar ordens com gerenciamento de risco

  • Verificar saldo disponível
  • Verificar limites de posição
  • Executar ordens simultaneamente (ou o mais próximo disso)
  • Monitorar posições até convergência ou realização do lucro

📊 Exemplo Prático

Dados Spot:
  • Bid: 0.001234
  • Ask: 0.001236
  • Mid: 0.001235
Dados Futuros:
  • LTCUSDT Bid: 45.50, Ask: 45.52
  • BTCUSDT Bid: 36800, Ask: 36802
  • LTCUSDT Mid: 45.51
  • BTCUSDT Mid: 36801
Cálculo:
  • Futuro LTCBTC = 45.51 / 36801 = 0.001237
  • Spread = (0.001235 - 0.001237) / 0.001237 = -0.16%
Resultado: Spread negativo indica que o futuro está mais caro que o spot.

⚠️ Considerações Importantes

  1. Funding Rate: Pode eliminar lucros se não for considerado
  2. Liquidez: Ordens grandes podem causar slippage
  3. Tempo de execução: Diferenças de timing podem afetar resultados
  4. Correlação: Mercados spot e futuros podem se mover juntos
  5. Regulamentação: Diferentes regras podem aplicar em cada mercado

🔧 Implementação Técnica

def calculate_spot_future_arbitrage(symbol):
    # 1. Buscar dados spot
    spot_data = get_spot_ticker(symbol)
    spot_mid = (spot_data['bidPrice'] + spot_data['askPrice']) / 2
    
    # 2. Decompor símbolo
    base, quote = decompose_symbol(symbol)
    
    # 3. Buscar dados futuros
    base_future = get_future_ticker(f"{base}USDT")
    quote_future = get_future_ticker(f"{quote}USDT")
    
    # 4. Calcular preço sintético
    base_mid = (base_future['bidPrice'] + base_future['askPrice']) / 2
    quote_mid = (quote_future['bidPrice'] + quote_future['askPrice']) / 2
    future_synthetic = base_mid / quote_mid
    
    # 5. Calcular spread
    spread = (spot_mid - future_synthetic) / future_synthetic
    
    return {
        'symbol': symbol,
        'spot_mid': spot_mid,
        'future_synthetic': future_synthetic,
        'spread': spread,
        'opportunity': abs(spread) > 0.0025  # 0.25%
    }