Saltar a contenido

Ejercicios

Ejercicios por parte, con la solución esbozada plegada. Intenta resolverlos antes de abrirla. Los que requieren ejecutar algo indican dónde.

Parte I · Fundamentos

I.1 Una barra tiene open=10, high=12, low=9, close=12,5. ¿Qué hace el banco?

Solución

Viola close ≤ high. La política clean.v1 la repara (no la excluye) y la marca is_synthetic = True, dejando constancia en el informe de validación.

I.2 Calcula la EMA(2) con semilla SMA de [2, 4, 6, 8].

Solución

α = 2/3. t=0 null; t=1 semilla = (2+4)/2 = 3; t=2: 2/3·6 + 1/3·3 = 5; t=3: 2/3·8 + 1/3·5 = 7. Resultado [null, 3, 5, 7], first_valid_index = 1.

I.3 Una política decide +1 al cierre del viernes; el lunes es festivo en XNYS. ¿Cuándo hay fill?

Solución

En la apertura del martes (primera apertura operable). El lunes no es sesión, así que no hay barra que ejecutar.

I.4 Comisión de comprar 100 acciones a 50,00 USD con 5 bps.

Solución

100 · 50 · 0,0005 = 2,50 USD, redondeado half-even a la unidad mínima (0,01): 2,50.

I.5 ¿A qué hora UTC abre XNYS el 15 de enero y el 15 de julio?

Solución

14:30 UTC en invierno (EST, UTC−5) y 13:30 UTC en verano (EDT, UTC−4).

Parte II · Datos

II.1 ¿Por qué el lector filtra por data_available_ns y no por market_open_ns?

Solución

Porque «desde el día X» significa «desde que se pudo saber algo». Filtrar por apertura dejaría entrar la barra cuyo OHLC aún no se conocía al empezar la ventana.

II.2 Un día hábil sin barras en BME que no es festivo. ¿Se añade a la tabla de festivos?

Solución

No. Es un hueco del proveedor (caso 2018-09-20): se documenta como anomalía. Meterlo como festivo sería una afirmación falsa sobre el mercado.

Parte III · Motores

III.1 P16 nativo diverge en features barra 19; P18 nativo en fills barra 63. ¿Son fallos del banco?

Solución

No: son divergencias documentadas de los indicadores nativos de Nautilus (semilla en P16; redondeo int(sqrt) de la HMA en P18). Se informan con contexto ±5 y nunca se publican como PASS. Los carriles comparables cierran con 0 PARITY_FAIL.

III.2 ¿Qué carril usarías para medir solo el coste de ejecución de Nautilus?

Solución

NT_INTENT_REPLAY: recibe features y objetivos ya calculados y solo ejecuta.

Parte IV · Indicadores

IV.1 El catálogo lista 386 indicadores y la API calcula 375, pero solo 33 con garantías canónicas. Explica la diferencia.

Solución

386 son las entradas del catálogo. 39 son primitivas del proyecto (implementadas, verificadas y aprobadas); 33 de ellas se calculan por la API en modo canónico y las otras 6 leen series derivadas o paneles y solo se usan dentro de estrategias. De las 347 solo de motor, 342 se calculan por paso directo al motor, sin fórmula canónica ni paridad (siguen en discovered), y 5 no son ejecutables. En total, 375 ejecutables y 11 no ejecutables con motivo.

Parte V · Estrategias

V.1 ¿Por qué P01 conserva el objetivo anterior cuando EMA(f) == EMA(s)?

Solución

Poner 0 en el empate generaría un cierre y una reapertura (dos fills y dos comisiones) que la regla no pide.

V.2 Una política usa EMA(20) y EMA(50). ¿first_decision_index?

Solución

49: el máximo de los first_valid_index (19 y 49).

Parte VI · API de backtesting y análisis

VI.1 Lanza un backtest de P01 sobre KO 5min en 2024 con engine: both. ¿Qué campos miras primero?

Solución

window_resolved (barras, warmup), parity.verdict, y speedup.published. Ejemplo real en examples/api/04_backtest_p01_ko.*.json (19 551 barras, PASS). Ojo: su data_hash es el mismo que el de NVDA; hoy firma la versión del dataset, no el activo (capítulo VI.3, sección 6).

VI.2 Un sweep devuelve 422 INSUFFICIENT_DISTINCT_CANDIDATES. ¿Qué haces?

Solución

Cambiar la rejilla para tener más puntos distintos. El banco no repite puntos para inflar K.

Parte VII · Runtime causal, streaming y modelos

VII.1 Describe el camino de un POST /platform/v1/runs hasta el resultado.

Solución

La API valida token y rol, registra el run QUEUED y un evento en outbox (PG); el worker-batch lo reclama con lease y fence, calcula, escribe el artefacto (CAS) y publica con commit en PG (SUCCEEDED); GET /platform/v1/results/{ref} lo sirve.

VII.2 ¿Qué garantiza el fencing si dos workers creen ser dueños del mismo stream?

Solución

Solo escribe el que tiene el fence más alto; el antiguo falla con STREAM_FENCE_OBSOLETO sin escribir diario ni emit (drill G3 del 2026-09-22).

Parte VIII · Operación

VIII.1 El servidor muere a las 14:15 UTC. ¿Cuánto dato pierdes como máximo?

Solución

Hasta la captura de las 08:20 UTC: casi 6 h de escrituras (RPO máximo teórico = 6 h). La siguiente captura habría sido a las 14:20.

VIII.2 ¿Por qué docker compose down -v no es un rollback válido?

Solución

Borra volúmenes (artefactos, jobs, modelos) y pararía otros servicios vivos. El rollback correcto recrea solo api por digest con up -d --no-deps.

VIII.3 Un token válido llega con x-finaz-roles: deployer. ¿Respuesta?

Solución

401: la identidad nunca la aporta el cliente.