¿Cómo entrenar un modelo para predecir el número de esquinas?

Factores que influyen en el número de córners en el fútbol para una predicción precisa

El número de córners en un partido se describe mejor no por «suerte» o aleatoriedad, sino por un conjunto de patrones tácticos y de juego estables. Los equipos que se centran en ataques por las bandas, con un alto número de centros y tiros a puerta, generan más momentos que terminan en despejes y saques de esquina. En contraste, los equipos que controlan cuidadosamente el balón en el centro del campo y rara vez finalizan ataques con tiros crean menos prerrequisitos para córners. Por lo tanto, al construir un modelo, es importante traducir las características tácticas en indicadores medibles: tiros, centros, posesión, número de entradas en el tercio final y otras métricas que se pueden obtener fácilmente a través de estadísticas de partidos.

El escenario del juego afecta significativamente el número de córners. Un equipo outsider, tras haber concedido un gol temprano, se ve obligado a abrirse y a menudo finaliza ataques con tiros o centros bajo presión defensiva, lo que aumenta la probabilidad de despejes para córners. Un líder, defendiendo una ventaja mínima, puede sentarse conscientemente en su portería, lo que también aumenta el número de despejes y tiros bloqueados. Además, la diferencia en la clase de los oponentes, el factor de local, las especificidades del torneo y la densidad del calendario son importantes. Todos estos factores se reflejan en los números: indicadores como totalDisparosALaPortería, totalDisparosDentroDelÁrea, accurateCross están disponibles en la API de Eventos Deportivos., entradasEnElTercerCuarto, posesiónDelBalón, así como una métrica separada tiros de esquina desglosada por anfitriones e invitados.

Para una predicción precisa, el modelo debe considerar todo el contexto del partido, no solo el número promedio de córners de la temporada. A nivel de datos, esto significa que la muestra debe incluir la forma de los equipos en los últimos N partidos, el estilo de juego típico de los oponentes, el torneo y la etapa de la temporada, estadísticas de ataque y defensa, así como el estado del partido (en casa o fuera). Con la correcta formalización de factores en características numéricas, es posible construir modelos robustos que predicen tanto el número total de córners como el desglose por equipos y mitades, basándose en datos reales en lugar de intuiciones.

Qué datos se necesitan para la predicción de córners y cómo obtener estadísticas a través de la API

Para entrenar el modelo de predicción de córners, se requiere un conjunto de datos históricos de partidos con estadísticas detalladas post-partido. La variable objetivo que se utiliza generalmente es el número total de córners (en casa + fuera), o córners para cada equipo por separado. En API de Eventos Deportivos basado en por el API de eventos deportivos api-sport.ru este valor está disponible en el conjunto de datos estadísticasDelPartido, donde la métrica con la clave tiros de esquina contiene valores numéricos costoLocal и costoVisitante. Así, para cualquier partido histórico, es posible obtener el número exacto de córners y usarlo como objetivo para el modelo de aprendizaje automático.

Además de la variable objetivo, es importante reunir el conjunto de características más informativas. Para las predicciones de córners, son adecuadas las siguientes: el número de tiros a puerta y fuera del objetivo (totalDisparosALaPortería, tirosFueraDeLaPortería), tiros desde el área penal (totalDisparosDentroDelÁrea), posesión del balón (posesiónDelBalón), el número de centros y córners (accurateCross están disponibles en la API de Eventos Deportivos.), entradas en el tercio final (entradasEnElTercerCuarto), el número de duelos ofensivos y defensivos. Todos estos indicadores están disponibles en estadísticasDelPartido por período TODO, y si es necesario, con un desglose por mitades. Al combinar varias temporadas para las principales ligas, se forma una muestra de miles de partidos, lo que es suficiente para construir modelos estables.

Además, se pueden tener en cuenta las expectativas del mercado utilizando cuotas y líneas sobre el total de córners de la API de los bookmakers disponible a través de la infraestructura api-sport.pro. Un modelo que no solo ve estadísticas «brutas» sino también la evaluación del mercado a menudo proporciona predicciones más precisas y ayuda a identificar ineficiencias en las cuotas. Como resultado, un conjunto de datos completo para córners consiste en tres niveles de datos: hecho (córners reales y estadísticas del partido), forma y estilo del equipo (indicadores agregados de partidos recientes) y expectativas del mercado (líneas y cuotas), todos los cuales se pueden recopilar automáticamente a través de solicitudes HTTP a la API.

Las mejores APIs de eventos deportivos para estadísticas de córners en el fútbol

Al construir modelos para predecir córners, es importante confiar en una fuente confiable de estadísticas en lugar de raspar sitios web o exportaciones manuales. Una API de eventos deportivos de calidad debe proporcionar una amplia cobertura de ligas, profundidad histórica y estadísticas detalladas post-partido, incluyendo el número de córners, tiros, centros, posesión, faltas y otros métricas. Además, la estabilidad de disponibilidad, la estructura de datos predecible y la documentación clara son críticas para que los desarrolladores puedan integrar fácilmente el servicio en sus sistemas de análisis, bots y plataformas de apuestas internas.

API de Eventos Deportivos de api-sport.ru combina todos estos requisitos y está específicamente dirigida a desarrolladores y analistas. A través de una única interfaz, se pueden obtener partidos de fútbol y otros deportes, filtrados por fecha, torneo, temporada o equipo, y extraídos de inmediato estadísticasDelPartido con el indicador tiros de esquina. Además de córners, la API devuelve docenas de métricas avanzadas sobre tiros, pases, duelos y acciones defensivas, lo que permite la construcción de modelos multidimensionales complejos. Bloque oddsBase añade cuotas de bookmakers para varios mercados, incluyendo totales, a las estadísticas del partido y permite la evaluación del mercado al entrenar el modelo.

Una ventaja adicional de la API de Eventos Deportivos es la disponibilidad de torneos recomendados torneosPredeterminados, lo que simplifica el inicio si deseas reunir rápidamente un corpus de datos sobre ligas populares. El desarrollo continuo del servicio es una parte clave del producto: en un futuro cercano, se planea el soporte para WebSocket para transmitir eventos en vivo e integración de herramientas de IA, lo que ayudará a acelerar el desarrollo de tus propios modelos. Para los usuarios, esto significa que una vez que configures la integración con la API, recibirás no solo datos históricos sobre córners, sino también infraestructura para análisis en línea y soluciones híbridas en la intersección de estadísticas e inteligencia artificial.

Conectando a la API y extrayendo datos de córners: ejemplos de solicitudes

Para comenzar a trabajar con datos de córners, necesitas una clave API personal. Se puede obtener en tu cuenta personal en api-sport.ru después del registro. La clave se pasa en el encabezado Autorización con cada solicitud. La URL base para eventos deportivos — https://api.api-sport.ru, seguida de la versión y tipo de deporte. Por ejemplo, para fútbol, se utiliza la ruta /v2/fútbol/partidos, donde especificas la fecha, torneos, estados de partidos y otros filtros a través de parámetros de consulta. En la respuesta, recibes una lista de partidos con el objeto estadísticasDelPartido, del cual se extrae el indicador tiros de esquina.

A continuación, se muestra un ejemplo básico en Python que solicita partidos de fútbol completados para una fecha seleccionada y extrae el número de córners para cada juego:

import requests
API_KEY = "ВАШ_API_КЛЮЧ"
BASE_URL = "https://api.api-sport.ru/v2/football/matches"
params = {
    "date": "2025-09-03",   # дата матчей
    "status": "finished"    # нужны только завершённые игры
}
headers = {
    "Authorization": API_KEY
}
response = requests.get(BASE_URL, params=params, headers=headers)
response.raise_for_status()
data = response.json()
for match in data.get("matches", []):
    stats_periods = match.get("matchStatistics", [])
    all_period = next((p for p in stats_periods if p.get("period") == "ALL"), None)
    if not all_period:
        continue
    total_corners = None
    for group in all_period.get("groups", []):
        for item in group.get("statisticsItems", []):
            if item.get("key") == "cornerKicks":
                home_corners = item.get("homeValue", 0)
                away_corners = item.get("awayValue", 0)
                total_corners = home_corners + away_corners
    if total_corners is not None:
        print(f"Match ID {match['id']}: total corners = {total_corners}")

De manera similar, los partidos se pueden filtrar por torneo (torneo_id), temporada (temporada_id) o equipo (equipo_id). El conjunto resultante de partidos con el número de córners y estadísticas extendidas se puede guardar convenientemente en una base de datos o archivos para un procesamiento posterior. Estos datos se utilizan luego para calcular agregados (promedio de córners en los últimos N partidos, indicadores de actividad ofensiva, etc.) y para formar una muestra de entrenamiento para el modelo, que se discutirá en las secciones siguientes.

Preparación de datos y selección de características para el modelo de predicción de córners

Después de exportar datos en bruto de la API, el primer paso es la limpieza y normalización. Es necesario filtrar partidos sin estadísticas completas, estandarizar formatos de fecha, identificadores de torneos y equipos, y manejar valores faltantes en las métricas. Se debe prestar especial atención a la estabilidad de los torneos: para ligas muy bajas, donde las estadísticas pueden ser incompletas o irregulares, es mejor asignar un modelo separado o excluirlas en la etapa de entrenamiento. Para cada partido, la variable objetivo necesita ser calculada explícitamente, por ejemplo total_corners = home_corners + away_corners, donde los valores se toman de la métrica tiros de esquina periodo TODO.

A continuación, se forman características a nivel de equipo y partido. En la práctica, los agregados de los últimos 5–10 partidos funcionan bien: número promedio de córners por partido, promedio de tiros a puerta y desde el área penal, frecuencia de centros (accurateCross están disponibles en la API de Eventos Deportivos.), entradas en el tercio final (entradasEnElTercerCuarto), porcentaje de posesión del balón (posesiónDelBalón), número de duelos ofensivos. Estos indicadores se calculan por separado para equipos locales y visitantes, y luego se añaden características derivadas adicionales: la diferencia en el promedio de córners entre oponentes, la diferencia en tiros y posesión, indicadores de partidos en casa/fuera, y pertenencia a ligas superiores. Como resultado, cada fila del conjunto de datos describe un partido a través de docenas de características numéricas que reflejan el estilo y la fuerza ofensiva de los equipos.

A continuación se muestra un ejemplo de cómo formar características básicas en pandas basado en una lista de partidos ya compilada, asumiendo que previamente has extraído valores numéricos de estadísticas de estadísticasDelPartido:

import pandas as pd
# matches_df содержит колонки:
# match_id, home_team_id, away_team_id, date, 
# home_corners, away_corners, home_shots, away_shots, ...
matches_df["total_corners"] = matches_df["home_corners"] + matches_df["away_corners"]
# сортируем по дате, чтобы считать скользящие средние корректно
matches_df = matches_df.sort_values("date")
# функция для расчёта агрегатов по команде
rolling_window = 10
for side in ["home", "away"]:
    team_col = f"{side}_team_id"
    for metric in ["corners", "shots", "shots_inside_box"]:
        col = f"{side}_{metric}"
        rolling_mean = matches_df.groupby(team_col)[col] \
            .rolling(rolling_window, min_periods=3).mean().reset_index(level=0, drop=True)
        matches_df[f"{side}_{metric}_avg_{rolling_window}"] = rolling_mean
# удаляем первые матчи, где мало истории
train_df = matches_df.dropna(subset=["home_corners_avg_10", "away_corners_avg_10"])

Este enfoque permite transformar el flujo de partidos de la API en un conjunto de datos de entrenamiento estructurado, donde cada fila contiene tanto los córners reales como el contexto: forma del equipo, actividad ofensiva y otros factores. En el futuro, se pueden agregar características del mercado (líneas y cuotas de las APIs de las casas de apuestas), indicadores de torneos y etapas de la temporada a este conjunto de datos, lo que mejorará aún más la calidad de la predicción.

Cómo entrenar un modelo para predecir el número de córners en Python utilizando datos de la API

Una vez que los datos están preparados y las características están formadas, se puede proceder al entrenamiento del modelo. En la práctica, predecir el número de córners se resuelve de manera conveniente como una tarea de regresión: se introduce un vector de características del partido y el modelo devuelve el número esperado de córners. Este enfoque permite convertir fácilmente el resultado en probabilidades de superar varios totales (8.5, 9.5, 10.5, etc.). Algoritmos como el boosting por gradientes o los bosques aleatorios, que funcionan bien con dependencias no lineales y características heterogéneas sin una normalización manual compleja, son adecuados para el entrenamiento.

A continuación se muestra un ejemplo de un pipeline básico en Python utilizando scikit-learn. Se asume que ya tienes un dataframe train_df con la variable objetivo total_corners y un conjunto de características numéricas formadas en el paso anterior:

from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error, mean_squared_error
import numpy as np
# список признаков (пример — используйте свои колонки)
FEATURES = [
    "home_corners_avg_10", "away_corners_avg_10",
    "home_shots_avg_10", "away_shots_avg_10",
    "home_shots_inside_box_avg_10", "away_shots_inside_box_avg_10",
    "home_possession_avg_10", "away_possession_avg_10",
    "home_crosses_avg_10", "away_crosses_avg_10",
]
X = train_df[FEATURES]
y = train_df["total_corners"]
X_train, X_valid, y_train, y_valid = train_test_split(
    X, y, test_size=0.2, shuffle=False  # для временных рядов лучше не перемешивать
)
model = RandomForestRegressor(
    n_estimators=400,
    max_depth=8,
    random_state=42,
    n_jobs=-1
)
model.fit(X_train, y_train)
y_pred = model.predict(X_valid)
mae = mean_absolute_error(y_valid, y_pred)
rmse = mean_squared_error(y_valid, y_pred, squared=False)
print(f"MAE: {mae:.3f}, RMSE: {rmse:.3f}")

En el uso práctico, es conveniente construir métricas derivadas sobre tal pronóstico de regresión. Por ejemplo, puedes evaluar la probabilidad de superar un total de 9.5 córners modelando la distribución del error o utilizando simulaciones, y a este nivel, comparar tus estimaciones con las líneas de las APIs de las casas de apuestas. A medida que llegan nuevos partidos de la API de Eventos Deportivos, el modelo debe ser reentrenado regularmente con datos frescos para tener en cuenta los cambios en los estilos de los equipos, cambios de entrenadores y otros factores reflejados en las estadísticas de córners.

Evaluando la calidad del modelo de predicción de córners y mejorando la precisión de la predicción

La evaluación del modelo para predecir el número de córners debe considerar tanto la precisión de la predicción numérica como su utilidad práctica. Para la regresión, se utilizan comúnmente métricas como MAE y RMSE, que muestran el error promedio en valor absoluto y en escala «cuadrática». En el contexto de las apuestas y la gestión de riesgos, es importante entender con qué frecuencia el modelo comete errores de 1-2 córners y cuál es la proporción de fallos brutos. Para datos de series temporales, es preferible aplicar una división considerando la cronología (por ejemplo, división de entrenamiento/validación basada en el tiempo) para evitar la fuga de información del futuro y obtener una evaluación honesta de la calidad en partidos aún no vistos.

Además de las métricas generales, tiene sentido analizar la calidad del modelo por segmentos: por torneos individuales, tipos de equipos (favorito/underdog), rangos totales y temporadas. A menudo resulta que el modelo funciona bien en las ligas superiores, donde las estadísticas son más ricas y estables, pero peor en divisiones inferiores. En tales casos, se puede entrenar modelos separados por grupos de ligas o agregar indicadores de nivel de torneo a las características y calibrar las predicciones. Es útil estudiar la importancia de las características en árboles de decisión y boosting: esto ayuda a entender qué estadísticas (tiros, centros, posesión, forma reciente) contribuyen más a las predicciones de córner y dónde más se puede fortalecer la señal.

Para mejorar aún más la precisión, se pueden utilizar varios enfoques. Primero, agregar información del mercado de las API de casas de apuestas al modelo: las líneas y cuotas sobre el total de córners a menudo contienen una opinión de mercado concentrada y complementan bien las estadísticas «brutas». Segundo, implementar actualizaciones del modelo en línea a medida que llegan nuevos datos de la API de Eventos Deportivos, y en el futuro — del flujo de WebSocket cuando esté disponible en la infraestructura de api-sport.ru. Tercero, considerar algoritmos más avanzados (boosting por gradientes en árboles de decisión, redes neuronales) y conjuntos de varios modelos. Combinar datos de córner de calidad, evaluación de calidad precisa y mejoras reflexivas del modelo permite reducir gradualmente el error y construir un sistema de predicción resistente a los cambios en el panorama del fútbol.