O modelo calcula a probabilidade de cada time ser campeão, ser rebaixado ou se classificar à Libertadores e SulAmericana. Para a Série B, calcula a probabilidade de ser campeão da série, subir para a Série A ou ser rebaixado para a Série C.
O processo é feito em VBA, simulando os resultados a partir de uma distribuição Poisson, pelo Método de Monte Carlo.
A partir dos resultados dos jogos que já ocorreram, são feitas quatro médias para cada time:
- LMP = Gols feitos em casa
- LVP = Gols feitos visitando
- LMC = Gols levados em casa
- LVC = Gols levados visitando
Cada um destes quatro valores é limitado inferiormente em 1, para não estrangular a projeção. Estes valores não serão alterados a cada rodada projetada, permanecendo sempre fixos enquanto a simulação estiver sendo feita, para reduzir o tempo de execução do programa.
Essas médias são utilizadas para simular duas variáveis aleatórias, Xj e Yj, para cada jogo j que ainda não foi realizado, após serem feitas as seguintes transformações e considerando os parâmetros de cada time:
λj,X = PGF × LMPX + PGL × LVCY
λj,Y = PGF × LVPY + PGL × LMCX
Sendo PGF o peso dos gols feitos e PGL o peso dos gols levados, com ambos entre 0% e 100%, e PGL = 1 – PGF. Para esta versão do modelo, os valores escolhidos para PGF e PGL são 80% e 20%, respectivamente, subjetivamente.
Desta forma,
Xj ~ Poisson(λj,X)
Yj ~ Poisson(λj,Y)
Após todos os jogos ainda não realizados terem sido simulados, é feito um snapshot da posição final de cada time, e esta tabela é somada aos runs anteriores, considerando todas as respostas buscadas.
Em seguida, os jogos simulados são limpos e uma nova simulação se inicia, se repetindo tudo (exceto a definição das médias).
Após o número de simulações ter sido atingido ou o usuário interromper o programa, o resultado final das posições é consolidado, mostrando a frequência.
Além de marcar quem está garantido na Libertadores, é possível adicionar ou remover pontos e gols relacionados a punições.
Arquivo da posição em 22/2/2021, com a Série B concluída e a Série A na 37ª rodada. As sheets funcionam da seguinte forma:
- jogos: recebe os jogos e resultados já decorridos (falaremos em outro post sobre scraping, para facilitar a coleta).
- Garantido: recebe uma marcação se algum time já tiver sido garantido na Libertadores, em decorrência de alguma outra conquista.
- Punições: dá/tira pontos ou gols para algum dos times, em função de decisões externas ao campo.
- Tabela: consolida a tabela dada a situação atual e contém os parâmetros do campeonato, assim como a quantidade de simulações. Geralmente, basta clicar em “Simular”, se nada de relevante mudar.
- classificação: resultado das simulações até o momento.
Como o Excel não é muito eficiente para Monte Carlo, e como há rápida convergência, geralmente vamos parar de rodar o modelo antes de completar todas as simulações solicitadas. Escrevi um script com “gentle quitting“, para concluir a simulação atual antes de interromper de fato. Basta pressionar [Esc] diversas vezes até ele perguntar se deseja interromper, e confirmar.
Como sempre, o código está completamente aberto e adoraríamos ver melhorias e ports para outras linguagens mais eficientes.