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 perceber porque o modelo acerta onde acerta e falha onde falha. Se queres o paper original, é o "Markov competing-hazards for combat sports prediction" (referência no fim).
Prever vs simular
Imagina que perguntas 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 precisas 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)
Estes 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 a "competir" 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.
Este modelo chama-se competing hazards: vários relógios a contar em simultâneo, e o primeiro a disparar decide o resultado. É exatamente como modelos clínicos prevêem mortalidade — "quem vai disparar primeiro: ataque cardíaco, AVC, cancro, ou velhice?".
E corremos isto 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 |
Estes números são calculados a partir da carreira do lutador: somamos os minutos totais que ele lutou na sua carreira 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, isto pode dar números muito altos. Para um lutador como Khabib Nurmagomedov (longas lutas, 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. Imagina um lutador a fazer a estreia 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 confiares neste número, vais prever que o lutador finaliza por KO em quase toda a simulação. Mas isto é 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 o nosso lutador novato:
Este é o conceito que faz com que o modelo seja conservador em estreias e agressivo em veteranos. É a razão pela qual o nosso CLV é positivo consistentemente em vez de oscilar com cada novato no card.
Walk-forward: o pecado mortal do ML desportivo
Aqui está onde 90% dos modelos preditivos públicos falham silenciosamente: a ordem temporal dos dados.
Imagina que treinas um modelo com 10 anos de dados de UFC: 6.000 lutas. Fazes 80/20 train/test, com a split aleatória. Reportas accuracy de 73%. Lindo? Não. Há leakage temporal massivo:
- ·A luta de Khamzat em 2024 está no test set, mas a sua luta de 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 suas vitórias até essa data — incluindo lutas que estão no test set.
- ·O resultado: accuracy inflada em ~5-10pp e ROI fictício no backtest. Quando aplicas 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. Isto requer rebuild dos features para cada predição — computacionalmente caro mas honesto.
Onde o modelo é forte (e onde é fraco)
Honestidade total — eis as 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 estes 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 sub-estima a probabilidade da luta ir à distância em divisões pesadas e sobre-estima em pesos leves. É um viés conhecido que ainda não conseguimos corrigir — por isso não publicamos picks neste mercado, apesar de termos os números a serem calculados. Transparência sobre limitações é parte de não cobrar overconfidence.
O que esperar quando lês um output do modelo
Quando vês na nossa página de uma 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 desta luta específica, cada uma um percurso aleatório segundo-a-segundo
- ·Taxas de Khamzat calculadas a partir das suas lutas anteriores apenas (walk-forward, sem leakage)
- ·Shrinkage Bayesiano aplicado se ele tiver menos de 30 minutos lutados acumulados
- ·Filtro XGBoost a confirmar que ele tem ≥40% de chance de ganhar a luta no agregado — senão a pick seria descartada
- ·Edge ≥ 5% face à mediana de fecho (excluindo BetRivers, que historicamente atrasa as linhas)
- ·Stake quarter-Kelly capped a 0.5u — conservador deliberado
Isto 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.