1. De dónde salen los datos y qué pagas si son gratis
Nivel 1: De dónde vienen y qué traen dentro
Hay una pregunta que casi nadie se hace antes de escribir la primera línea de una estrategia: quién ha tocado este número antes de llegar a mi disco duro. Un precio no aparece por generación espontánea dentro de un CSV. Ha pasado por una cadena de manos, y cada mano cobra algo, filtra algo o retrasa algo. Entender esa cadena es lo que separa un backtest que significa algo de un backtest que solo significa que sabes usar pandas.
Los cuatro eslabones de la cadena
- El mercado. NYSE, Nasdaq, Cboe, BME, Eurex. Es donde ocurre el hecho: dos órdenes se cruzan y nace un precio. El mercado es el propietario original de ese dato y lo licencia. Para los grandes operadores de bolsa, la venta de información es una línea de negocio importante, del mismo orden de magnitud que los ingresos por negociación, y eso explica bastante de lo que viene después.
- El consolidador. En Estados Unidos existe una infraestructura regulada que recoge las operaciones y las mejores cotizaciones de todos los centros de negociación y publica una cinta única. En Europa la consolidación ha sido históricamente más fragmentada, y durante años no hubo una cinta consolidada equivalente.
- El proveedor. Compra o licencia el dato, lo normaliza, le pega identificadores, lo limpia, lo empaqueta en una API y te lo vende. Aquí viven desde los terminales caros hasta las APIs de suscripción mensual.
- Tú. El último eslabón: el que paga, o el que acepta las condiciones de quien no le cobra.
Cada salto añade latencia, coste y una oportunidad más de introducir un error. Cuando dos fuentes no coinciden, casi siempre es porque han recorrido caminos distintos por esta cadena. Conviene además saber en qué eslabón te has enganchado: un proveedor que consolida por su cuenta a partir de varias cintas directas no te dará lo mismo que otro que revende la cinta consolidada oficial, aunque ambos te vendan una columna llamada igual.
La licencia limita más que el precio
Un error de principiante es comparar proveedores por euros al mes. Lo que de verdad decide si puedes usar una fuente son sus condiciones:
- Redistribución. Casi ninguna licencia barata te deja mostrar el dato a terceros. Si tu proyecto es un panel público o un boletín con precios, estás redistribuyendo, aunque no cobres.
- Uso comercial frente a personal. Muchas APIs gratuitas son explícitamente para uso personal y no comercial. Operar tu propio dinero suele caber; gestionar el de otro, casi nunca.
- Peticiones por minuto y por día. El límite de peticiones define tu arquitectura entera: con cinco peticiones por minuto no vas a refrescar 500 valores del índice cada minuto, punto.
- Retención y derivados. Algunas licencias te prohíben almacenar el histórico o publicar cifras derivadas de él.
- Uso no visual. Si un algoritmo consume el dato sin que un humano lo mire, muchos mercados aplican tarifas específicas, y suelen ser más altas que la tarifa de pantalla.
Lo que pagas cuando no pagas
Gratis nunca significa gratis: significa que el pago no es en dinero. La factura llega en cinco monedas:
- Retraso. Quince minutos es el estándar del dato retrasado. Para una estrategia diaria puede dar igual; para cualquier cosa intradía es letal.
- Cobertura incompleta. Faltan valores pequeños, mercados no estadounidenses y, sobre todo, empresas que dejaron de cotizar.
- Sin historial de revisiones. Te dan la foto de hoy, no la que se veía entonces.
- Sin la hora correcta. Muchas fuentes gratuitas no te dicen cuándo se publicó el dato, solo a qué periodo corresponde.
- Sin garantía de continuidad. Nadie te debe nada. El servicio puede cambiar de formato o desaparecer un martes.
Lo primero que debería hacer cualquier script serio es medir el retraso real de su fuente en vez de fiarse del folleto:
import pandas as pd
import requests
# Marcador: la clave nunca va escrita en el codigo ni subida a un repositorio.
CLAVE = "tu_clave_aqui"
def ultima_marca(simbolo):
"""Hora de la ultima vela que la fuente admite tener."""
r = requests.get(
"https://api.proveedor-ejemplo.com/v1/intradia",
params={"symbol": simbolo, "interval": "1min", "apikey": CLAVE},
timeout=10,
)
r.raise_for_status()
velas = pd.DataFrame(r.json()["values"])
velas["datetime"] = pd.to_datetime(velas["datetime"], utc=True)
return velas["datetime"].max()
ultima = ultima_marca("AAPL")
ahora = pd.Timestamp.utcnow()
print("Ultimo dato:", ultima)
print("Retraso aparente en minutos:", (ahora - ultima).total_seconds() / 60)Y lo segundo, auditar la serie histórica antes de construir nada encima. Un hueco de tres sesiones seguidas en mitad de un año no es un festivo: es una caída del servicio que alguien no rellenó nunca.
precios = pd.read_csv("aapl_gratis.csv", parse_dates=["date"], index_col="date").sort_index()
esperados = pd.bdate_range(precios.index.min(), precios.index.max())
faltan = esperados.difference(precios.index)
print("Sesiones esperadas:", len(esperados))
print("Sesiones recibidas:", len(precios))
print("Ausentes (incluye festivos):", len(faltan))
# Bloques de dias ausentes consecutivos: los largos huelen a corte de servicio.
huecos = pd.Series(faltan)
bloques = (huecos.diff() != pd.Timedelta(days=1)).cumsum()
resumen = huecos.groupby(bloques).agg(["min", "max", "count"])
print(resumen[resumen["count"] >= 3])Caso real: los martes en que se rompieron miles de scripts
En mayo de 2017, Yahoo Finance retiró sin aviso previo el punto de descarga de históricos en CSV que llevaba una década siendo el estándar de facto de la comunidad. Cualquier proyecto que dependiera de la función de Yahoo de pandas-datareader dejó de funcionar de un día para otro; la reacción fue un enjambre de librerías no oficiales de ingeniería inversa, una de las cuales acabó siendo yfinance.
Menos de un año después, en abril de 2018, Quandl anunció que su conjunto WIKI de precios diarios de acciones estadounidenses dejaba de estar mantenido activamente. No se borró: siguió ahí, congelado. Ese es el fallo peor de los dos, porque es silencioso: un script que apuntaba a WIKI seguía descargando, seguía devolviendo un DataFrame y seguía produciendo un backtest con aspecto normal, solo que sobre datos que ya no avanzaban ni se corregían.
Ninguna de las dos fuentes incumplió nada: no había contrato que incumplir. Esa es exactamente la moneda con la que se paga lo gratuito. Todo esto es formación, no asesoramiento financiero.