Quant500 Academy

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

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:

Lo que pagas cuando no pagas

Gratis nunca significa gratis: significa que el pago no es en dinero. La factura llega en cinco monedas:

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.

El resto de Quant500

Lo que estás aprendiendo, aplicado al índice todos los días:

La cartera del modelo, cada semana en tu correo

Cada sábado, su semana en un minuto: cómo fue, lo mejor y lo peor, y qué directivos compraron con su dinero. Y el día que el modelo se rehace, qué entra y qué sale. Es una simulación, no un consejo. Como mucho un correo a la semana, sin publicidad y sin cuenta; te das de baja con un clic. Lo hace una persona: Pol Gracia.

Cartera modelo con resultados simulados, no una recomendación personalizada. Tu correo se usa solo para esto: privacidad.

Detrás de la Academia y del resto de Quant500 hay una sola persona: Pol Gracia Serrahima.