Octogono
← Voltar ao blog
·11 min de leitura

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.

#modelo#metodologia#transparência

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:

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:

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étricaO que medeRange típico UFC
ko_per_minTaxa de finalizações por KO/TKO que o lutador inflige0.000 – 0.080
sub_per_minTaxa de submissões que inflige0.000 – 0.050
kod_per_minTaxa a que sofre KOs0.005 – 0.060
subd_per_minTaxa a que sofre submissões0.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 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

ROI UFC+45%
ROI Bellator+77%
ROI PFL+115%
CLV médio+11%

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)

Hit rate ML62%
ROI ML−6%
CLV ML+9%

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%":

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.