Calendarios y sesiones¶
Qué vas a aprender¶
- Qué es un calendario de sesión y qué información contiene.
- Cómo son los calendarios XNYS (Nueva York), XMAD (Madrid) y FX.
- Por qué un calendario equivocado produce resultados falsos sin que nada falle.
El mercado tiene horario¶
Un mercado de acciones no abre 24 horas: tiene sesiones. Una sesión tiene una
apertura, un cierre, y hay días que no existe (festivos) o que es más corta (cierres
anticipados). Un calendario es la tabla que responde a cuatro preguntas; en el
código son las cuatro operaciones de CalendarSpec:
| Operación | Pregunta |
|---|---|
session_id_for |
¿A qué sesión pertenece este instante? (AAAAMMDD) |
is_regular_session |
¿Este día hay sesión normal? |
session_bounds |
¿Cuándo abre y cierra esta sesión? |
sessions_between |
¿Qué sesiones hay entre dos fechas? |
Figura 1. Sesión regular de Nueva York y de Madrid, sus medias sesiones y los huecos legítimos (fin de semana, festivo de la tabla).
Además, cada calendario tiene un fingerprint (huella) que entra en la identidad del dato.
Analogía
Un calendario es como el horario de un tren. Si calculas la puntualidad de un tren
de Madrid con el horario de Nueva York, todos los trenes llegarán «seis horas tarde»
y nadie verá un error: solo números absurdos. Por eso get_calendar de un id no
registrado lanza, en vez de caer a XNYS por defecto.
Los tres calendarios del banco¶
- Versión
XNYS-1999-2026.v1(finazbench/data/calendar.py). - Sesión regular 09:30–16:00 hora de Nueva York; última barra de 1 min
[15:59, 16:00). - Cambio de hora real (vía
zoneinfo): apertura 14:30 UTC en invierno y 13:30 UTC en verano. - Festivos en tabla explícita, incluidos cierres extraordinarios (11–14/09/2001, 02/01/2007, 29–30/10/2012, 05/12/2018, 09/01/2025).
- Cierres anticipados a las 13:01.
- Validado contra el dato: los 63 días hábiles sin barras de NVDA entre 2020-03-24 y 2026-09-14 coinciden exactamente con la tabla de festivos.
- Versión
XMAD-2015-2026.v1(finazbench/data/calendar_xmad.py). - Mercado continuo 09:00–17:30 hora de Madrid; medias sesiones el 24 y 31 de diciembre con cierre a las 14:00.
- Validado: los 59 días hábiles sin barra comunes a BBVA.MC, SAN.MC y TEF.MC coinciden con la tabla de festivos, salvo dos huecos del proveedor que no se añadieron como festivos (2018-09-20 y 2026-09-07 parcial).
- Sesión definida como
[D 00:00, D+1 00:00)enEurope/London: todas duran 24 h exactas (el Reino Unido cambia la hora en domingo, y el domingo no es sesión). - Un par de divisas no reparte dividendos:
adjclose == close.
¿Por qué 13:01 y no 13:00?
El cierre es el extremo abierto del intervalo. En una sesión corta, la última barra que emite el proveedor empieza a las 13:00 y es la subasta de cierre: NVDA el 29/11/2024 movió 26,4 millones de acciones en ese minuto, trece veces un minuto normal. Cerrar en 13:00 dejaría fuera justo la barra con el precio oficial de cierre.
Por qué importan tanto¶
flowchart TD
C["Calendario"] --> R["Remuestreo<br/>(anclaje de cubos)"]
C --> P["Particionado por año<br/>(hora local)"]
C --> H["Detección de huecos<br/>(se cuentan, no se rellenan)"]
C --> A["Anualización<br/>(√252 en XNYS)"]
C --> F["Barras operables<br/>(is_tradable)"]
- Remuestreo: los cubos de 5 min, 1 h… se anclan a la apertura de sesión.
- Particionado: el año se calcula en hora local del mercado (una barra de las 15:59 del 31 de diciembre no puede ir a la carpeta del año siguiente).
- Huecos: un día hábil sin barras es una anomalía que se cuenta; nunca se rellena ni se supone festivo.
- Anualización: la volatilidad anual usa el número de sesiones del calendario (√252 en XNYS). Vive en la política, no en la feature.
- Barras no operables: una barra de subasta o halt existe pero no admite fill;
el ledger lo sabe por
is_tradable(ver Backtesting causal).
Festivo frente a hueco
Los tres CSV de BME traen una barra el 2019-12-25, festivo, con
open=high=low=close y volumen 0: la «vela plana» que no se debe operar. El
calendario la deja fuera de sesión sin reglas ad hoc. Y al revés: un día en que
BME operó pero el proveedor no entregó dato no se convierte en festivo, porque
eso sería una afirmación falsa sobre el mercado.
En la capa de datos de la plataforma¶
La capa de datos de la plataforma tiene su propio paquete de calendarios (packages/finaz_calendars/) y una regla
PIT explícita: huecos = anomalía, nunca festivo implícito. Lo verás en
Capa de datos de la plataforma y en el detalle de
calendarios de la Parte II.
Resumen¶
- Un calendario define sesiones, festivos, cierres anticipados y zona horaria, y tiene huella.
- XNYS 09:30–16:00 NY (cierre corto 13:01), XMAD 09:00–17:30 Madrid, FX 24 h en Londres.
- Los calendarios están validados contra el dato; los huecos del proveedor no se disfrazan de festivos.
- Un calendario equivocado no falla: produce números falsos. Por eso no hay calendario por defecto.
Para practicar¶
- ¿A qué hora UTC abre XNYS el 15 de enero? ¿Y el 15 de julio?
- Explica con tus palabras por qué
get_calendar("XMAD")sin registrar debe lanzar y no devolver XNYS. - Un activo tiene 64 días hábiles sin barras y la tabla de festivos tiene 63. ¿Qué haces?