Spaces:
Sleeping
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:
score.regularTime, quando existe;score.fullTimecomo 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:
- cada bookmaker precisa ter Casa/Empate/Fora completos;
- a margem é removida dentro de cada bookmaker;
- probabilidades de-vigadas são agregadas robustamente;
- odds de referência continuam sendo medianas;
- bookmakers com timestamp muito velho são descartados;
- 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
rhoda 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:
- escolhe uma partida histórica de avaliação;
- treina/calcula usando somente partidas anteriores;
- guarda as três probabilidades dos modelos;
- repete para dezenas de partidas;
- procura uma grade grossa de pesos que minimize Brier Score;
- 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→ OKpytest -q→ 24 passed- FastAPI
/api/health→ HTTP 200 - FastAPI
/api/state→ HTTP 200 - painel
/→ HTTP 200 GET /api/cron/daily→ HTTP 405 ePOSTsem 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.