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 -q`**24 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.