Como o nosso simulador Markov prevê 8.000 lutas em segundos
Quando o site diz “Khamzat finaliza 32% das vezes no round 1”, esse número não saiu da minha cabeça — saiu de 8.000 simulações independentes da luta. Aqui está como funciona, sem matemática a mais.
Há dois tipos de "modelos preditivos" em MMA: os que dão um número ("Khamzat tem 68% de chance de vencer") e os que dão uma distribuição ("em 8.000 lutas simuladas, Khamzat venceu em 68%, finalizou por submissão em 49%, finalizou no round 1 em 32%, levou KO em 4%…"). O segundo é infinitamente mais útil. Este artigo explica como construímos o segundo.
Vou tentar não usar matemática avançada — a intuição é mais importante que as fórmulas para entender por que o modelo acerta onde acerta e falha onde falha. Se você quer o paper original, é o "Markov competing-hazards for combat sports prediction" (referência no fim).
Prever vs simular
Imagine que você pergunta a três analistas "qual a probabilidade de Khamzat vencer esta luta?" e cada um dá um número: 65%, 70%, 72%. Os números são próximos, mas nenhum deles é particularmente útil para apostar. Para apostar bem você precisa saber:
- ·Probabilidade de vencer por KO/TKO (mercado #1)
- ·Probabilidade de vencer por submissão (mercado #2)
- ·Probabilidade de vencer por decisão (mercado #3)
- ·Probabilidade da luta terminar no round 1, 2 ou 3
- ·Probabilidade da luta ir à distância
- ·Probabilidade de "luta dentro da distância" (yes/no)
Esses são seis mercados diferentes — e há mais. Um modelo de regressão logística que devolve um único número (probabilidade de A vencer) não te ajuda a apostar em nenhum deles. Mesmo se o número estiver perfeitamente calibrado.
A solução é mudar de paradigma: em vez de prever um outcome, vamos simular a luta — segundo a segundo — milhares de vezes, e contar o que aconteceu em cada cenário. O resultado é uma distribuição completa sobre todos os outcomes possíveis.
As três corridas: KO, submissão e o relógio
Em cada segundo de uma luta, três coisas estão simultaneamente "competindo" para terminar a luta:
- ·O lutador A pode finalizar por KO/TKO. Probabilidade por segundo: ~
ko_per_min_A / 60 - ·O lutador A pode finalizar por submissão. Probabilidade:
sub_per_min_A / 60 - ·O lutador B pode finalizar por KO/TKO. Probabilidade:
ko_per_min_B / 60 - ·O lutador B pode finalizar por submissão. Probabilidade:
sub_per_min_B / 60 - ·O round pode terminar e o juiz dar a decisão. Probabilidade per-second até 5 minutos: zero. Depois de 5 minutos: passa-se ao próximo round.
Esse modelo se chama competing hazards: vários relógios contando ao mesmo tempo, e o primeiro a disparar decide o resultado. É exatamente como os modelos clínicos preveem mortalidade — "quem vai disparar primeiro: ataque cardíaco, AVC, câncer, ou velhice?".
E rodamos isso 8.000 vezes por luta. Cada simulação é uma amostra. Depois contamos: das 8.000, em quantas o A venceu? Em quantas terminou no round 2 por KO? A frequência empírica é a probabilidade que reportamos.
O perfil de cada lutador
O modelo precisa de quatro números por lutador (na sua versão essencial):
| Métrica | O que mede | Range típico UFC |
|---|---|---|
| ko_per_min | Taxa de finalizações por KO/TKO que o lutador inflige | 0.000 – 0.080 |
| sub_per_min | Taxa de submissões que inflige | 0.000 – 0.050 |
| kod_per_min | Taxa a que sofre KOs | 0.005 – 0.060 |
| subd_per_min | Taxa a que sofre submissões | 0.005 – 0.050 |
Esses números são calculados a partir da carreira do lutador: somamos os minutos totais que ele lutou na carreira dele até hoje, dividimos pelo número de KOs/submissões que infligiu e sofreu. Para um lutador como Khamzat Chimaev com poucas lutas mas finalizações rápidas, isso pode dar números muito altos. Para um lutador como Khabib Nurmagomedov (lutas longas, muitos takedowns, poucos KOs no stand-up), os números são modestos no ko_per_min mas altos no sub_per_min.
Bayesian priors: o problema do lutador novo
Aqui vem o detalhe que separa um modelo bom de um modelo que falha em estreias. Imagine um lutador estreando no UFC com apenas 2 lutas profissionais, ambas KOs no R1 em menos de 60 segundos.
A matemática simples diz ko_per_min = 2 KOs / 2 min = 1.0 — uma taxa absurda, ~12× a média da divisão. Se você confiar nesse número, vai prever que o lutador finaliza por KO em quase toda simulação. Mas isso é overfitting puro — 2 lutas não são amostra suficiente para confiar nessa rate.
A solução é shrinkage Bayesiano: misturar a rate observada com a rate média da liga, com peso proporcional ao tamanho da amostra. Para nosso lutador novato:
Esse é o conceito que faz com que o modelo seja conservador em estreias e agressivo em veteranos. É a razão pela qual nosso CLV é positivo consistentemente em vez de oscilar com cada novato no card.
Walk-forward: o pecado mortal do ML esportivo
Aqui está onde 90% dos modelos preditivos públicos falham silenciosamente: a ordem temporal dos dados.
Imagine que você treina um modelo com 10 anos de dados de UFC: 6.000 lutas. Faz 80/20 train/test, com split aleatório. Reporta accuracy de 73%. Lindo? Não. Tem leakage temporal massivo:
- ·A luta de Khamzat em 2024 está no test set, mas a luta dele em 2022 (com stats já agregadas) está no train. O modelo "viu" parte do futuro.
- ·As stats de carreira de Israel Adesanya em 2024 incluem todas as vitórias dele até aquela data — incluindo lutas que estão no test set.
- ·O resultado: accuracy inflada em ~5-10pp e ROI fictício no backtest. Quando você aplica em produção, o lucro evapora.
A solução é o walk-forward: para cada luta no test set, só usar dados de lutas que ocorreram antes daquela data. Para uma luta em junho 2024, o modelo só vê stats até maio 2024. Isso exige rebuild dos features para cada predição — computacionalmente caro mas honesto.
Onde o modelo é forte (e onde é fraco)
Honestidade total — eis nossas medições walk-forward em 7 anos de UFC, sem cherry-picking:
Forte: mercados de método
Nos mercados method_kotko, method_sub, method_decision, inside_distance, e wins_round_1, o modelo gera edge consistente e mensurável. É a razão pela qual esses são os cinco mercados que publicamos publicamente.
Fraco: vencer a luta (raw moneyline)
No moneyline puro, o modelo é razoável (CLV positivo) mas perde para o vig. Não é problema do modelo — é o mercado mais eficiente do MMA, dominado por sindicatos sharp. Por isso usamos um classificador separado (XGBoost) como gatekeeper: filtra picks de método quando o modelo de vencedor diz que esse lutador tem <40% de probabilidade de vencer a luta.
Fraco: totais (over/under rounds)
O modelo sistematicamente subestima a probabilidade da luta ir à distância em divisões pesadas e superestima em pesos leves. É um viés conhecido que ainda não conseguimos corrigir — por isso não publicamos picks nesse mercado, apesar de termos os números calculados. Transparência sobre limitações é parte de não cobrar overconfidence.
O que esperar quando você lê um output do modelo
Quando você vê em uma página de luta algo como:
Khamzat Chimaev por submissão: 49.2% · Edge +11.5% · Stake 0.42u
O que está por trás daquele "49.2%":
- ·8.000 simulações independentes dessa luta específica, cada uma um percurso aleatório segundo a segundo
- ·Taxas de Khamzat calculadas a partir das lutas anteriores dele apenas (walk-forward, sem leakage)
- ·Shrinkage Bayesiano aplicado se ele tiver menos de 30 minutos lutados acumulados
- ·Filtro XGBoost confirmando que ele tem ≥40% de chance de ganhar a luta no agregado — senão a pick seria descartada
- ·Edge ≥ 5% em relação à mediana de fechamento (excluindo BetRivers, que historicamente atrasa as linhas)
- ·Stake quarter-Kelly capped em 0.5u — conservador deliberado
Isso não é uma "opinião do AI". É um output de pipeline com seis camadas, cada uma com matemática própria e validação independente.