- ¿Qué es el xG en el fútbol y por qué se necesita el servicio de análisis de xG?
- Datos abiertos y APIs gratuitas para estadísticas de fútbol para modelos de xG.
- Cómo elegir y conectar una API de eventos deportivos para el cálculo de xG.
- Cómo construir un modelo de xG basado en eventos de partidos a partir de datos abiertos.
- Arquitectura del servicio de análisis de xG: almacenamiento, procesamiento y actualización de datos.
- Cómo crear una API pública para el servicio de xG e integrarla con el sitio web y aplicaciones.
- Visualización de estadísticas de xG: paneles, gráficos e informes para usuarios.
¿Qué es el xG en el fútbol y por qué se necesita el servicio de análisis de xG?
El xG (goles esperados) es una métrica que evalúa la probabilidad de que un tiro específico a puerta resulte en un gol. Para cada tiro, el modelo de xG asigna un valor de 0 a 1, donde 0 significa un momento casi sin esperanza, y 1 significa un gol prácticamente garantizado. A nivel final, el xG de un equipo para un partido o temporada muestra cuántos goles el equipo debería haber anotado en función de la calidad de las oportunidades creadas, en lugar del resultado real en el marcador.
Los servicios de análisis de xG te permiten ver lo que está oculto detrás del marcador: la verdadera calidad del juego, la estabilidad del estilo, la efectividad del ataque y la defensa. Los clubes utilizan el xG para evaluar entrenadores y jugadores, los cazatalentos lo utilizan para seleccionar refuerzos, los medios lo utilizan para análisis de partidos en profundidad, y los operadores de apuestas y pronosticadores lo utilizan para construir modelos de pronóstico avanzados. A diferencia de las estadísticas simples de tiros o posesión, el xG tiene en cuenta el contexto del momento: la zona de tiro, el tipo de pase, la posición de los defensores, la posición del portero y otros factores (en modelos avanzados).
Un servicio de análisis de xG separado convierte estos cálculos en un producto: paneles interactivos, gráficos de xG durante el partido, mapas de tiros, clasificaciones de equipos y jugadores a lo largo del tiempo. Tal servicio puede monetizarse a través de suscripciones, acceso B2B, asociaciones con medios y casas de apuestas. Para que el servicio de xG sea sostenible y escalable, debe depender de una fuente de datos confiable — principalmente de API de eventos deportivos, que proporciona de manera consistente partidos, eventos y estadísticas en un formato legible por máquina conveniente.
Datos abiertos y APIs gratuitas para estadísticas de fútbol para modelos de xG.
Puedes comenzar a trabajar en un servicio de xG con datos abiertos: protocolos de partidos disponibles públicamente de ligas y federaciones, archivos CSV de entusiastas, planes de demostración gratuitos o API gratuitas. Sin embargo, tales fuentes a menudo proporcionan una cantidad limitada de información: el marcador final, goles, autores y a veces estadísticas básicas del equipo. Para construir un modelo de xG sostenible, esto generalmente no es suficiente, especialmente si deseas tener en cuenta la calidad de los momentos, las zonas de tiro, o crear métricas avanzadas como xGOT (goles esperados a puerta) y xA (asistencias esperadas).
Las APIs gratuitas generalmente están limitadas en el número de solicitudes por día, el número de torneos o la profundidad de la historia. Para un prototipo, esto puede ser suficiente, pero para un servicio comercial de xG, necesitas disponibilidad garantizada, escalabilidad y datos detallados del partido. Aquí, es más conveniente depender de soluciones especializadas a nivel de por el API de eventos deportivos api-sport.ru, que combinan un amplio conjunto de torneos, historia de temporadas y estadísticas detalladas de partidos en un formato unificado.
Por ejemplo, incluso a nivel de estadísticas de equipo, puedes recopilar características importantes de xG: el número de tiros a puerta, tiros desde el área penal, «grandes oportunidades», amenazas de jugadas a balón parado, etc. Todo esto está disponible a través de una única solicitud HTTP a la API. Un ejemplo simple de una solicitud para partidos por fecha utilizando la API de Eventos Deportivos podría verse así:
fetch('https://api.api-sport.ru/v2/football/matches?date=2025-09-03', {
headers: {
'Authorization': 'YOUR_API_KEY'
}
})
.then(res => res.json())
.then(data => {
console.log('Всего матчей:', data.totalMatches);
// здесь вы можете отфильтровать нужные турниры и дальше забирать детали по каждому матчу
});
Basado en tales respuestas, formas un conjunto de datos en bruto: partidos, torneo, equipos, marcador, estadísticas básicas. Luego puedes enriquecerlo con eventos (goles, tiros, tarjetas) y construir tu modelo de xG sobre esta capa. La principal ventaja del enfoque de API es que los datos llegan en una forma estructurada y están listos para ser cargados directamente en el almacenamiento sin etiquetado manual y análisis HTML.
Cómo elegir y conectar una API de eventos deportivos para el cálculo de xG.
Al elegir una API de eventos deportivos para tareas de xG, varios criterios son importantes: la profundidad de las estadísticas de partidos, la cobertura de torneos, la estabilidad de operación, así como la disponibilidad de datos históricos y actualizaciones en vivo. Para casos de xG, los campos con estadísticas avanzadas sobre tiros y momentos son especialmente útiles. En la API de Eventos Deportivos, estos datos están disponibles a través de la entidad estadísticasDelPartido, que se puede obtener al solicitar una lista de partidos o información detallada sobre un juego específico.
El algoritmo para la selección y conexión generalmente se ve así: primero, pruebas la funcionalidad en varias ligas, evalúas la estructura de las respuestas y la completitud de las estadísticas, luego organizas el acceso y configuras la carga automática. En el caso del servicio cuenta personal API-Sport permite obtener rápidamente una clave API y gestionarla (restricciones, estadísticas de uso, cambio de clave). Luego, la clave se pasa simplemente en el encabezado Autorización con cada solicitud.
A continuación se muestra un ejemplo de cómo obtener información detallada sobre un partido por su ID, incluidos eventos y estadísticas, que luego se pueden utilizar en cálculos de xG:
const matchId = 14570728;
fetch(`https://api.api-sport.ru/v2/football/matches/${matchId}`, {
headers: {
'Authorization': 'YOUR_API_KEY'
}
})
.then(res => res.json())
.then(match => {
const stats = match.matchStatistics;
const odds = match.oddsBase; // коэффициенты букмекеров для беттинг-моделей
const events = match.liveEvents; // голы, карточки, другие события
console.log('Статистика матча для xG-модели:', stats);
});
Es importante que en la misma respuesta recibas no solo estadísticas (la base para xG) sino también cuotas de casas de apuestas a través de oddsBase. Esto te permite construir modelos híbridos que comparan el puntaje «justo» por xG con las estimaciones del mercado y la dinámica de la línea.
Cómo construir un modelo de xG basado en eventos de partidos a partir de datos abiertos.
El modelo de xG es esencialmente un algoritmo que produce la probabilidad de un gol basado en un conjunto de características del momento (disparo). Idealmente, la entrada incluye las coordenadas del disparo, tipo de pase, parte del cuerpo, situación (juego/tiro libre), presión de los defensores y otras características detalladas. Si tienes tal nivel de datos de eventos de fuentes abiertas, puedes entrenar un modelo de regresión logística, un modelo de boosting por gradientes o una arquitectura de red neuronal. Sin embargo, incluso sin coordenadas, puedes construir una estimación útil de xG del equipo a nivel de estadísticas agregadas disponibles a través de la API de Eventos Deportivos.
Por ejemplo, en estadísticasDelPartido hay grupos Disparos, Ataque, Resumen del partido, que contienen características que correlacionan fuertemente con los goles esperados: totalDisparosALaPortería, disparosALaPortería, totalDisparosDentroDelÁrea, granOportunidadCreada, granOportunidadMarcada, golpeóElTravesaño y otros. En el conjunto de datos históricos de partidos, puedes ajustar los pesos para estas métricas y obtener una aproximación del xG del equipo sin datos de seguimiento. Este enfoque ya permite construir clasificaciones de equipos y comparar la calidad del juego a lo largo del tiempo.
Un ejemplo de un cálculo simplificado del xG del equipo en Python basado en estadísticas de partidos obtenidas a través de la API:
import requests
API_KEY = 'YOUR_API_KEY'
MATCH_ID = 14570728
resp = requests.get(
f'https://api.api-sport.ru/v2/football/matches/{MATCH_ID}',
headers={'Authorization': API_KEY}
)
match = resp.json()
stats = match['matchStatistics']
all_period = next(p for p in stats if p['period'] == 'ALL')
shots_group = next(g for g in all_period['groups'] if g['groupName'] == 'Shots')
values = {item['key']: (item['homeValue'], item['awayValue']) for item in shots_group['statisticsItems']}
# Примитивная линейная модель xG на агрегатах
weights = {
'totalShotsInsideBox': 0.10,
'shotsOnGoal': 0.08,
'bigChanceCreated': 0.30,
}
def calc_team_xg(side_index):
xg = 0.0
for key, w in weights.items():
if key in values:
xg += values[key][side_index] * w
return xg
home_xg = calc_team_xg(0)
away_xg = calc_team_xg(1)
print('Ожидаемые голы (упрощенная модель):', home_xg, away_xg)
Tal ejemplo está lejos de los modelos académicos avanzados, pero demuestra el enfoque en sí: utilizas agregados estables de la API y ajustas los pesos basados en datos históricos. A medida que el servicio evoluciona, puedes agregar características adicionales (por ejemplo, posesión, número de penetraciones en el tercio final, tipos de ataques), así como conectar modelos de IA para predicciones de probabilidad más precisas, incluyendo sobre nuevas capacidades que aparecen en los proveedores de API.
Arquitectura del servicio de análisis de xG: almacenamiento, procesamiento y actualización de datos.
Un servicio de xG completo no es solo un modelo, sino también una arquitectura de datos. En una solución típica, se distinguen varias capas: una capa de ingestión de datos de APIs externas, una capa de almacenamiento (OLTP/OLAP), una capa de cálculo (por lotes y casi en tiempo real), y una capa de entrega (tu API pública o interna). Los partidos históricos se cargan en lotes, mientras que los nuevos juegos se programan o están en modo casi en vivo, para que los usuarios puedan ver gráficos de xG actuales durante el partido.
La API de Eventos Deportivos es conveniente de usar como una única fuente de datos. Para la historia, pasas por temporadas y torneos, para en vivo — consultas regularmente los endpoints /v2/fútbol/partidos con estado en progreso y luego tomas los detalles de los partidos que te interesan. En un futuro cercano, las suscripciones de WebSocket están apareciendo activamente en las infraestructuras de tales proveedores, incluyendo api-sport.ru, lo que te permite abandonar la consulta frecuente y recibir eventos en modo «push» — esto es especialmente importante para gráficos de xG en vivo y escenarios de apuestas.
A continuación se muestra un ejemplo de un simple «trabajador» en Node.js que actualiza regularmente los datos sobre partidos en vivo y los escribe en tu almacenamiento (función designada condicionalmente guardarPartido):
const API_KEY = 'YOUR_API_KEY';
async function loadLiveMatches() {
const res = await fetch('https://api.api-sport.ru/v2/football/matches?status=inprogress', {
headers: { 'Authorization': API_KEY }
});
const data = await res.json();
for (const match of data.matches) {
// здесь можно дополнительно забрать события или статистику, если нужно
await saveMatch(match); // сохранение в БД
}
}
// простой планировщик: обновляем каждые 30 секунд
setInterval(loadLiveMatches, 30_000);
En una arquitectura real, agregarías una cola de tareas, reintentos en errores, almacenamiento en caché y un circuito separado para la carga histórica. Una capa importante separada son los cálculos de xG: el modelo puede ejecutarse tanto periódicamente (por lotes para partidos completados) como en modo casi en vivo (cálculo después de cada actualización de estadísticas). A medida que aparecen canales de WebSocket y herramientas de IA en APIs de terceros, podrás simplificar aún más este circuito al descargar parte de la lógica a procesamiento en streaming.
Cómo crear una API pública para el servicio de xG e integrarla con el sitio web y aplicaciones.
Cuando los cálculos de xG ya se están realizando regularmente y los datos se almacenan, el siguiente paso es crear tu propia API de servicio público de xG. Por lo general, se implementan varios endpoints principales: xG por partido (a nivel de equipo y de jugador), agregados por torneos y temporadas, clasificaciones de equipos y jugadores, así como líneas de tiempo para construir gráficos durante el juego. Tal API debe ser simple y predecible: URLs estables, esquema de respuesta claro, autenticación conveniente (claves API u OAuth) y límites de solicitud.
La API pública de xG se integra bien tanto con sitios web como con aplicaciones móviles, paneles analíticos y plataformas de apuestas. En el lado del backend, la API de xG puede combinar datos de su propia base de datos con información actualizada recibida en tiempo real de la API deportiva api-sport.ru — por ejemplo, mezclando cuotas en vivo de casas de apuestas de oddsBase o actualizando el estado del partido. A continuación se muestra un ejemplo simplificado de una ruta en Node.js (Express) que devuelve xG por partido junto con información básica sobre el juego en sí:
const express = require('express');
const fetch = require('node-fetch');
const app = express();
const API_KEY = 'YOUR_API_KEY';
app.get('/api/xg/match/:id', async (req, res) => {
const matchId = req.params.id;
// 1. Берем предрасчитанный xG из своей БД
const xgData = await loadXgFromDb(matchId);
// 2. Подмешиваем актуальную информацию о матче из Sport Events API
const matchRes = await fetch(`https://api.api-sport.ru/v2/football/matches/${matchId}`, {
headers: { 'Authorization': API_KEY }
});
const match = await matchRes.json();
res.json({
matchId,
matchInfo: {
status: match.status,
score: {
home: match.homeScore.current,
away: match.awayScore.current
}
},
xg: xgData
});
});
Tal capa de abstracción permite no revelar a los usuarios externos los detalles de la integración con la fuente de datos y la estructura de las tablas internas. El sitio web o la aplicación simplemente llama a tu xG-API, recibe una respuesta unificada y construye la visualización en el frontend. Para un producto comercial, puedes agregar facturación, análisis de uso y diferentes niveles de acceso (por ejemplo, solo xG previo al partido o acceso a gráficos en vivo y APIs de casas de apuestas sobre tu propio xG).
Visualización de estadísticas de xG: paneles, gráficos e informes para usuarios.
El punto fuerte de cualquier servicio de xG es la visualización. A los usuarios no solo les importan los números, sino también las formas visuales: gráficos de xG por minutos de partido, gráficos de barras comparativas de equipos, mapas de tiros, tablas de clasificación y reportes en PDF/HTML. Basado en tu API pública de xG y datos obtenidos de la API de Eventos Deportivos, se pueden construir paneles interactivos: los usuarios seleccionan un torneo, partido, equipo o jugador y reciben una historia visual de la calidad del juego.
El frontend generalmente recupera datos agregados de tu xG-API y los renderiza a través de bibliotecas de visualización (Chart.js, D3.js, ECharts, etc.). En modo en vivo, los datos se actualizan a través de WebSocket o mediante solicitudes periódicas. Es importante pensar en el formato de respuesta para que sea conveniente para ti construir tanto gráficos clásicos de xG como representaciones avanzadas — por ejemplo, combinando xG con la dinámica de cuotas de casas de apuestas o combinando xG con un mapa de posesión por zonas.
Un ejemplo de una solicitud simple del frontend a tu endpoint de xG para construir un gráfico de goles esperados por franjas horarias:
async function loadMatchXgTimeline(matchId) {
const res = await fetch(`/api/xg/match/${matchId}/timeline`);
const data = await res.json();
// data = { points: [{ minute: 5, homeXg: 0.1, awayXg: 0 }, ...] }
const labels = data.points.map(p => p.minute);
const homeSeries = data.points.map(p => p.homeXg);
const awaySeries = data.points.map(p => p.awayXg);
renderXgChart(labels, homeSeries, awaySeries); // функция отрисовки графика на Canvas или SVG
}
Para usuarios comerciales (clubes, medios, empresas de apuestas), también es importante poder generar informes automáticos: después de cada ronda o partido, su servicio puede generar reseñas listas con métricas clave de xG, gráficos y conclusiones textuales.




