Vscode / PRECISION_REVIEW.md
Erinaldorodrigues's picture
Release Safe Bet AI v2.2 Precision
888ef7f
|
Raw
History Blame Contribute Delete
8.38 kB

Revisão profunda de precisão — v2.1-precision

Documento histórico da revisão v2.1. Para as mudanças atuais, consulte RELEASE_NOTES_v2.2.md.

Esta revisão focou em erros silenciosos que podem produzir uma confiança artificialmente alta.

1. Correções críticas

1.1 Tempo regulamentar em mata-mata

O código antigo usava score.fullTime. Em partidas com prorrogação, isso pode representar 120 minutos e classificar como vitória algo que foi empate no mercado 1X2 de 90 minutos.

A versão nova usa:

  1. score.regularTime, quando existe;
  2. score.fullTime como fallback.

1.2 Histórico não é mais global

O código anterior criava um catálogo global de equipes e tentava fazer fuzzy matching entre todas as ligas. Isso permitia casar nomes semelhantes de competições diferentes.

Agora cada evento do The Odds API possui um mapeamento explícito para o código do football-data.org:

  • EPL → PL
  • EFL Championship → ELC
  • Bundesliga → BL1
  • Serie A Itália → SA
  • La Liga → PD
  • Ligue 1 → FL1
  • Brasileirão → BSA
  • Eredivisie → DED
  • Primeira Liga → PPL
  • Champions League → CL

O matching ocorre somente dentro da competição correta.

1.3 Matching de times mais rígido

O motor usa:

  • ID da equipe no football-data.org quando disponível;
  • nome oficial;
  • shortName;
  • TLA;
  • aliases;
  • score mínimo;
  • diferença mínima entre o melhor e o segundo candidato.

Se o nome for ambíguo, o evento é rejeitado.

1.4 Odds agregadas corretamente

A versão anterior fazia a mediana das odds e só depois removia a margem. Isso mistura preços de bookmakers diferentes e pode criar uma probabilidade sintética incoerente.

Agora:

  1. cada bookmaker precisa ter Casa/Empate/Fora completos;
  2. a margem é removida dentro de cada bookmaker;
  3. probabilidades de-vigadas são agregadas robustamente;
  4. odds de referência continuam sendo medianas;
  5. bookmakers com timestamp muito velho são descartados;
  6. dispersão entre casas é calculada e entra no Risk Gate.

1.5 Mercado como prior

Mercados líquidos contêm informação que um modelo gratuito sem escalações/xG não possui.

A nova versão não ignora isso. O modelo interno (Dixon-Coles + Elo + forma) é combinado com o consenso de mercado. Quanto menor a qualidade dos dados, mais forte o shrinkage para o mercado.

Isso reduz overconfidence.

2. Modelo de gols

O Poisson foi refeito.

O código antigo fazia médias lineares simples de gols marcados e sofridos. A versão nova:

  • separa casa/fora;
  • usa half-life de recência;
  • calcula tamanho efetivo da amostra;
  • aplica shrinkage para a média da liga;
  • combina ataque e defesa geometricamente para evitar explosões;
  • ajusta placares 0-0, 1-0, 0-1 e 1-1 com Dixon-Coles;
  • estima o rho da competição a partir da taxa recente de empates, quando existe amostra suficiente.

3. Elo e forma

Elo continua sendo um modelo lento/estrutural.

Forma é separada e recebe peso menor. Jogos antigos perdem peso progressivamente. Assim uma sequência curta não domina o sistema.

3.1 Tuning walk-forward dos pesos

Os pesos Poisson/Elo/Forma não ficam mais totalmente fixos. Para cada competição, o motor reencena uma janela histórica em ordem temporal:

  1. escolhe uma partida histórica de avaliação;
  2. treina/calcula usando somente partidas anteriores;
  3. guarda as três probabilidades dos modelos;
  4. repete para dezenas de partidas;
  5. procura uma grade grossa de pesos que minimize Brier Score;
  6. encolhe os pesos aprendidos de volta para um prior conservador.

A grade é propositalmente grossa e o peso aprendido nunca é aceito se piorar o Brier do prior. Isso evita otimização excessiva em amostra pequena.

3.2 Brier Skill fora da amostra

A v2.1 acrescenta uma segunda verificação. Em cada partida de validação, o motor cria também uma climatologia temporal usando apenas os resultados conhecidos antes daquela partida. O ensemble recebe um Brier Skill Score contra essa referência.

Esse skill não serve para inflar a probabilidade. Ele funciona como regulador de confiança:

  • skill forte + amostra suficiente → o modelo interno pode ter mais influência;
  • skill fraco ou ainda desconhecido → a probabilidade é puxada mais para o consenso de mercado;
  • componentes Poisson/Elo que não sustentam o favorito podem bloquear uma seleção mesmo que o posterior agregado pareça alto.

Assim, concordância interna deixa de ser confundida com habilidade preditiva real.

4. Probabilidade conservadora

O código antigo chamava uma penalização heurística de “limite conservador”, mas a fórmula parecia um intervalo estatístico sem ter distribuição amostral válida.

Agora é explicitamente reliability shrinkage:

  • qualidade dos dados;
  • concordância dos modelos;
  • profundidade/estabilidade do mercado;
  • confiança do matching de nomes;
  • habilidade walk-forward do ensemble na competição.

A probabilidade é puxada em direção a 50% conforme a confiabilidade cai.

Isso é mais honesto e mais robusto.

5. Calibração forward

Depois que a mesma versão acumula amostra suficiente de palpites liquidados, o sistema aplica uma correção fraca baseada no desempenho real próximo daquela faixa de probabilidade.

Proteções:

  • só usa resultados já encerrados;
  • só usa a mesma model_version;
  • exige amostra efetiva mínima;
  • correção máxima de ±5 pontos percentuais;
  • prior forte centrado na previsão atual.

Não há “autoaprendizado” agressivo em meia dúzia de apostas.

6. Histórico e métricas

O histórico agora:

  • registra uma única recomendação por evento;
  • não cria duas apostas opostas se a seleção mudar em outro scan;
  • liquida por competição + horário + ambos os nomes;
  • mede win rate;
  • ROI;
  • Brier Score;
  • Log Loss;
  • ECE de calibração;
  • gap previsão x resultado;
  • drawdown máximo em unidades.

7. Bilhetes

Multiplicar probabilidades assume independência. Em jogos diferentes a aproximação é útil, mas não perfeita.

A v2 adiciona um stress conservador para múltiplas pernas da mesma competição, principalmente quando ocorrem em horários próximos. O painel mostra:

  • odd total;
  • se o alvo foi atingido;
  • probabilidade conjunta;
  • probabilidade conjunta sob stress;
  • EV estimado;
  • fator de dependência.

8. APIs e cota

football-data.org

A versão v2 busca por competição/temporada e mantém cache local. Quando a temporada atual ainda possui poucos jogos, busca a temporada anterior. Há um rate guard com folga abaixo do limite gratuito.

The Odds API

Antes de gastar quota em /odds, consulta a lista /sports para descobrir ligas ativas. Essa chamada é gratuita segundo a documentação oficial.

9. Limitações que permanecem

Para manter o projeto gratuito:

  • não há xG premium universal;
  • escalações/lesões não são garantidas em todas as ligas;
  • a Betano não é raspada automaticamente;
  • a odd Betano deve ser digitada no painel;
  • calibração forte precisa de meses de forward tracking;
  • uma freebet odd 10 continua sendo de risco alto, independentemente do nome “SAFE”.

O sistema prefere dizer “nenhuma seleção aprovada” a fabricar confiança.

10. Validação executada

Na revisão final:

  • python -m compileall -q app tests → OK
  • pytest -q24 passed
  • FastAPI /api/health → HTTP 200
  • FastAPI /api/state → HTTP 200
  • painel / → HTTP 200
  • GET /api/cron/daily → HTTP 405 e POST sem segredo → HTTP 401
  • JavaScript do painel validado com node --check
  • validação walk-forward inclui baseline temporal e nunca recebe partidas futuras
  • simulação sintética de favorito forte → probabilidade final ficou entre modelo interno e mercado, como projetado
  • stress sintético adicional → 250 previsões em 10 competições, todas normalizadas e sem exceções; tuning concluído em ~1,4 s no ambiente de revisão

As integrações reais não foram chamadas com as chaves do usuário nesta revisão. O primeiro scan no Space continua sendo a validação de integração final. A tentativa de instalar um ambiente virtual novo também não pôde ser concluída porque o container de revisão não tinha acesso DNS externo; os testes foram executados com as bibliotecas já instaladas no ambiente.