Saltar a contenido

Catálogo de motores

Qué vas a aprender

  • Qué motores forman FinazTradingEngine: no solo los dos de backtesting, sino toda la familia de modelado, riesgo, optimización, datos y API de la plataforma.
  • Para cada motor: qué hace, cuándo usarlo, qué contrato consume y produce, en qué imagen corre, qué gate lo certifica y qué límites están declarados hoy.
  • Cómo elegir el motor adecuado para una pregunta concreta.

Qué llamamos «motor»

En este manual, un motor es cualquier componente que transforma un contrato de entrada en un contrato de salida con reglas verificables: un backtester, un modelo estadístico, un optimizador o un almacén con semántica propia (PIT, CAS, fencing). Todos comparten tres reglas: son causales (no usan información que no estaba disponible), son reproducibles (mismos datos y spec → mismo hash) y ninguno se anuncia como disponible sin su gate en verde.

Fuentes de este capítulo: docs/v2/MOTORES.md (fichas AG-001…AG-030), docs/v2/GATES.md (estado y limitaciones declaradas), environments/*/pyproject.toml (versiones) y deployment/v2/README.md (imágenes y perfiles). Estado a 2026-09-22 (hito 4).

El catálogo de un vistazo

# Motor Familia Entrada → salida Imagen Gate
1 NautilusTrader 1.231.0 Banco de backtesting (oráculo) Barras + política → fills, equity finaz/bench:0.2.0-x86-64-v3 H0–H4, G0-B
2 VectorTA 0.2.8 Banco de backtesting / features Series OHLCV → indicadores finaz/bench:0.2.0-x86-64-v3 H0–H4, G0-B
3 Ledger SIM-S Banco de backtesting (contabilidad) Objetivos → fills en enteros, costes, equity finaz/bench:0.2.0-x86-64-v3 H0–H4
4 ClockEngine + FlowSpec Runtime causal ClockSpec / FlowSpec → CompiledPlan core, api G1–G2
5 Runtime batch/replay/stream Runtime causal CompiledPlan + snapshot/log → ResultRef core, io G1–G3 (S5 pendiente)
6 Labels y registro de entrenamiento Entrenamiento TargetSpec / TrainingSpec → labels, splits, ModelRef quant G4
7 Ridge exacto Tabular Matriz de features → ForecastDistribution quant G4
8 CatBoost Tabular (challenger) Matriz de features → ForecastDistribution quant G4
9 ARIMA / ETS (statsmodels) Estadística Serie → previsión + intervalos quant G4
10 GARCH (arch) Estadística (volatilidad) Rendimientos → banda de volatilidad quant G4
11 AutoARIMA (statsforecast) Estadística Serie → previsión + intervalos quant G4
12 RiskEngine (Ledoit-Wolf, VaR/ES) Riesgo Rendimientos + AlphaEstimate → covarianza, VaR/ES opt G5
13 Allocation ERC / min-var / max-div Cartera OptimizationProblem → PortfolioCandidate opt G5
14 Discreto CP-SAT Discreto Pesos → DiscreteCandidate (lotes enteros) opt G6
15 ConstraintValidator Riesgo (veto) Candidate → PortfolioTarget/DiscreteTarget aprobado + ConstraintReport opt G5–G6
16 NHITS (PyTorch + neuralforecast) Redes neuronales Serie + exógenas causales → cuantiles neural:s4 G7
17 Chronos-2 Fundacional Serie → previsión zero-shot chronos G8
18 TimesFM 2.5 Fundacional Serie → previsión puntual + cuantiles timesfm25 G8
19 PostgreSQL Datos y control Runs, leases, outbox → publicación transaccional compartido (api, core) G1, S1
20 ClickHouse Datos ObservationBatch → revision log PIT compartido (io) G1, G3
21 Redpanda Datos Eventos → log durable (stream, replay) compartido (core, io) G2–G3
22 MinIO / CAS Datos Artefactos → dirección sha256 inmutable compartido (io) G1
23 API de backtesting (bench-api, /v1/...) API HTTP → backtests, paridad, indicadores del banco finaz/bench H0–H4
24 API de plataforma (/platform/v1/...) API HTTP (Bearer) → flows, runs, results api G1, S4

Las imágenes del runtime y de los modelos se llaman finaz-te-<familia> (por ejemplo finaz-te-quant) y cada una lleva solo las dependencias de su rol: la imagen api tiene prohibido importar Torch, CatBoost, Nautilus, VectorTA o solvers; core e io no llevan Torch ni solvers.

¿Qué motor necesito?

flowchart TD
    Q["¿Qué pregunta quieres responder?"] --> A{"¿Cómo habría ido<br/>una estrategia?"}
    Q --> B{"¿Qué valor tendrá<br/>una serie?"}
    Q --> C{"¿Cuánto asignar<br/>a cada activo?"}
    Q --> D{"¿Dónde vive / cómo<br/>se publica el dato?"}
    A -->|"reglas de indicador<br/>P01–P20, Q01–Q03"| A1["VectorTA + ledger SIM-S<br/>(rápido, vectorizado)"]
    A -->|"validar con un motor<br/>de eventos"| A2["NautilusTrader<br/>(paridad con VectorTA)"]
    A -->|"flujo contractual<br/>batch/replay/stream"| A3["ClockEngine + FlowSpec<br/>+ runtime causal"]
    B -->|"features tabulares"| B1["Ridge (baseline)<br/>→ CatBoost (challenger)"]
    B -->|"una serie, modelo clásico"| B2["ARIMA/ETS · AutoARIMA"]
    B -->|"volatilidad"| B3["GARCH"]
    B -->|"muchas series,<br/>exógenas causales"| B4["NHITS"]
    B -->|"sin entrenar<br/>(zero-shot)"| B5["Chronos-2 · TimesFM 2.5"]
    C -->|"riesgo de la cartera"| C1["Ledoit-Wolf + VaR/ES"]
    C -->|"pesos continuos"| C2["ERC · min-var · max-div<br/>(cvxpy + Clarabel)"]
    C -->|"lotes enteros"| C3["CP-SAT"]
    C1 --> V["ConstraintValidator<br/>(único que aprueba targets)"]
    C2 --> V
    C3 --> V
    D --> D1["PG (control) · CH (PIT)<br/>Redpanda (log) · MinIO (CAS)"]

Regla práctica

Empieza siempre por el motor más simple que responda a la pregunta y usa el más complejo como challenger: Ridge antes que CatBoost, ARIMA antes que NHITS, un baseline naive estacional antes que un modelo fundacional. Así es como están diseñados los gates G4 y G7.


Familia 1 · Banco de backtesting (oráculo de paridad)

El banco de backtesting (hitos H0–H4) es el oráculo de paridad: la referencia contra la que se mide todo lo demás. Se conserva intacto en la imagen finaz/bench:0.2.0-x86-64-v3 y su suite (2752 tests) se reprodujo en el servidor para cerrar G0-B.

1. NautilusTrader

Campo Detalle
Qué hace Motor de backtesting por eventos (versión 1.231.0): procesa ticks/barras una a una con un reloj simulado, como lo haría en vivo.
Cuándo usarlo Para validar una estrategia con un motor independiente del vectorizado, y para los carriles NT_INTENT_REPLAY, NT_FEATURES y NT_ONLINE.
Entrada → salida Barras canónicas + política → intenciones, fills (next-open) y equity.
Imagen / gate finaz/bench:0.2.0-x86-64-v3 · hitos H0–H4, baseline G0-B.
Límites hoy Más lento que VectorTA; no ejecuta directamente los 386 indicadores (solo los que tienen carril). Sin trading en vivo.
Profundizar Nautilus vs VectorTA, Carriles

2. VectorTA

Campo Detalle
Qué hace Biblioteca vectorizada de indicadores técnicos (versión 0.2.8, núcleo en Rust): calcula la serie completa de una vez.
Cuándo usarlo Para calcular features de forma masiva y para el carril VTA_CPU_LEDGER (el más rápido).
Entrada → salida Series OHLCV → series de indicador con su warmup.
Imagen / gate finaz/bench:0.2.0-x86-64-v3 (existe una variante con build AVX2) · H0–H4, G0-B.
Límites hoy 386 descubiertos; 375 ejecutables por la API: 33 con fórmula canónica y paridad verificada y 342 por paso directo al motor sin garantías canónicas; 11 no ejecutables con motivo. El paso directo (323 indicadores con VectorTA y 21 con Nautilus; 2 en ambos) devuelve los valores del motor sin paridad y no promueve el nivel de capacidad.
Profundizar Catálogo de 386, Niveles de capacidad

3. Ledger SIM-S

Campo Detalle
Qué hace Contabilidad propia del proyecto: convierte objetivos de posición en fills con cantidades enteras, costes y equity. Versión 1 en NumPy; versión 2 acelerada con Numba.
Cuándo usarlo Siempre que quieras comparar dos motores: al compartir ledger, las diferencias solo pueden venir de features o política.
Entrada → salida Objetivos (-1/0/+1 o pesos) + precios de apertura → fills, posiciones, equity, métricas.
Imagen / gate finaz/bench:0.2.0-x86-64-v3 · H0–H4 (paridad popular con 0 PARITY_FAIL en carriles comparables).
Límites hoy Coste de préstamo de cortos no modelado; 31 templates de estrategia (30 en el catálogo + Q08B), de las que 23 están implementadas (P01–P20, Q01–Q03).
Profundizar Ledger SIM-S, Paridad

Familia 2 · Runtime causal

4. ClockEngine + FlowSpec (registry y compiler)

Campo Detalle
Qué hace El ClockEngine proyecta los eventos sobre relojes de trading/sesión, volumen o valor con estado serializable. La FlowSpec describe un flujo con operadores de una allowlist; el compiler la valida (tipos, ciclos) y produce un plan por modo.
Cuándo usarlo Para cualquier cálculo que deba ser idéntico en batch, replay y stream.
Entrada → salida ClockSpec → proyección temporal; FlowSpec → CompiledPlan (batch/replay/stream).
Imagen / gate core (compilación también en api) · G1–G2.
Límites hoy La allowlist tiene 22 operadores: 2 IMPLEMENTED y 20 PROPOSED. El vertical real es snapshot → ClockEngine → EMA canónica → ResultRef.
Profundizar FlowSpec y Clock

5. Runtime batch, replay y stream (con fencing)

Campo Detalle
Qué hace Ejecuta el plan compilado en tres modos con paridad 3-modos al golden; checkpoints en CAS con restore compatible; en stream, fencing por lease PG (un solo owner válido, epochs y handoff).
Cuándo usarlo Batch para históricos, replay para reproducir un log con fallos inyectados, stream para datos en llegada.
Entrada → salida CompiledPlan + snapshot (batch) o log Redpanda (replay/stream) → ResultRef publicado en PG.
Imagen / gate core (worker-batch, worker-stream), io (replay) · G1, G2, G3 PASS.
Límites hoy S5 INCOMPLETO: el daemon worker-stream sigue en finaz-te-core:s3 sin fencing y su emit no es golden; la corrección está en :s4 y verificada por el drill G3, pendiente de promoción. Deudas del fencing: diario en fichero, event_id drenados no persistidos, leases.adquirir sin CAS sobre el fence.
Profundizar Runtime batch, replay y stream, Gates

Familia 3 · Entrenamiento, tabular y estadística (imagen quant, G4)

6. Labels, splits y registro de entrenamiento

Campo Detalle
Qué hace Construye labels con madurez y embargo, splits walk-forward cronológicos sin fuga, y registra cada entrenamiento (TrainingSpec/Run → artefactos CAS, ModelRef, EvaluationReport, PromotionDecision).
Cuándo usarlo Antes de entrenar cualquier modelo de las familias 3 y 5: es lo que garantiza que no se evalúa con el futuro.
Entrada → salida TargetSpec → labels + splits; TrainingSpec → ModelRef y decisión de promoción.
Imagen / gate quant · G4 PASS.
Límites hoy El gap "PIT real con evidencia de proveedor" sigue abierto: los datos reales usan known_at = cierre de barra.
Profundizar Walk-forward, Modelos G4–G8

7. Ridge exacto

Campo Detalle
Qué hace Regresión Ridge implementada desde cero con descomposición de Cholesky: solución cerrada, determinista y auditable.
Cuándo usarlo Como baseline de cualquier problema tabular; si un modelo complejo no le gana, no se promociona.
Entrada → salida Matriz de features + target → ForecastDistribution.
Imagen / gate quant · G4 PASS (job g4-quant-001; recupera los pesos conocidos).
Límites hoy Lineal: no captura interacciones salvo que se construyan como features.
Profundizar Modelos G4–G8

8. CatBoost

Campo Detalle
Qué hace Gradient boosting sobre árboles, como challenger del Ridge.
Cuándo usarlo Cuando se sospechan no linealidades en features tabulares.
Entrada → salida Matriz de features → ForecastDistribution.
Imagen / gate quant · G4 PASS (50 iteraciones en el job S7).
Límites hoy Va detrás de una puerta: si la dependencia falla, el motor falla; no hay fallback silencioso a otro modelo.
Profundizar Modelos G4–G8

9. ARIMA / ETS (statsmodels)

Campo Detalle
Qué hace Modelos clásicos de series temporales: autorregresivos integrados de medias móviles (ARIMA) y suavizado exponencial (ETS).
Cuándo usarlo Una serie con estructura temporal clara y pocos datos; como referencia interpretable.
Entrada → salida Serie univariante → previsión + intervalos + diagnósticos citados.
Imagen / gate quant · G4 PASS.
Límites hoy Intervalos honestos: si el modelo no los justifica, no se inventan.
Profundizar Modelos G4–G8

10. GARCH (arch)

Campo Detalle
Qué hace Modela la volatilidad condicional de los rendimientos (librería arch).
Cuándo usarlo Para estimar riesgo que cambia con el tiempo, no el nivel del precio.
Entrada → salida Rendimientos → banda de volatilidad.
Imagen / gate quant · G4 PASS.
Límites hoy Una banda de volatilidad no es un intervalo de previsión: el contrato los distingue expresamente.
Profundizar Modelos G4–G8

11. AutoARIMA (statsforecast)

Campo Detalle
Qué hace Selección automática de órdenes ARIMA con la librería statsforecast (rápida, pensada para muchas series).
Cuándo usarlo Cuando no quieres fijar a mano el orden ARIMA o tienes muchas series.
Entrada → salida Serie → previsión + intervalos.
Imagen / gate quant · G4 PASS.
Límites hoy Mismas reglas de puerta e intervalos honestos que ARIMA/ETS.
Profundizar Modelos G4–G8

Familia 4 · Riesgo, cartera y discreto (imagen opt, G5–G6)

flowchart LR
    AE["AlphaEstimate"] --> R["RiskEngine<br/>Ledoit-Wolf, VaR/ES"]
    R --> AL["Allocation<br/>ERC · min-var · max-div"]
    AL -->|"PortfolioCandidate"| DI["Discreto<br/>CP-SAT (subproceso)"]
    AL -->|"PortfolioCandidate"| CV["ConstraintValidator"]
    DI -->|"DiscreteCandidate"| CV
    CV -->|"único productor"| T["PortfolioTarget /<br/>DiscreteTarget aprobado"]

12. RiskEngine: Ledoit-Wolf y VaR/ES históricos

Campo Detalle
Qué hace Estima la matriz de covarianza con contracción de Ledoit-Wolf (implementación propia) y calcula VaR y Expected Shortfall históricos. Aplica una puerta dura al AlphaEstimate de entrada.
Cuándo usarlo Antes de cualquier asignación: la covarianza muestral es inestable con pocos datos y muchos activos.
Entrada → salida Rendimientos + AlphaEstimate → covarianza, VaR/ES y quality report.
Imagen / gate opt · G5 PASS (paridad con scikit-learn).
Límites hoy VaR/ES históricos: dependen de que la ventana contenga episodios de estrés.
Profundizar Modelos G4–G8

13. Allocation: ERC, mínima varianza y máxima diversificación

Campo Detalle
Qué hace Resuelve la asignación continua con cvxpy y el solver Clarabel: contribución igual al riesgo (ERC), mínima varianza o máxima diversificación. skfolio está disponible como referencia.
Cuándo usarlo Para pasar de estimaciones de riesgo a pesos de cartera.
Entrada → salida OptimizationProblemsolo PortfolioCandidate + diagnósticos.
Imagen / gate opt · G5 PASS (Clarabel OPTIMAL; ERC 50/50 analítico reproducido).
Límites hoy Nunca produce un target aprobado; distingue honestamente FEASIBLE de OPTIMAL.
Profundizar Cartera Q01–Q03, Modelos G4–G8

14. Discreto: CP-SAT (OR-Tools)

Campo Detalle
Qué hace Convierte pesos en lotes enteros (no se compran 3,7 acciones): largest-remainder, greedy o el solver de restricciones CP-SAT de OR-Tools.
Cuándo usarlo Cuando el tamaño de lote o el capital hacen que redondear pesos a mano rompa restricciones.
Entrada → salida Pesos → solo DiscreteCandidate.
Imagen / gate opt · G6 PASS (CP-SAT OPTIMAL con prueba de optimalidad).
Límites hoy CP-SAT corre en un subproceso aislado por un conflicto conocido con HiGHS.
Profundizar Modelos G4–G8

15. ConstraintValidator

Campo Detalle
Qué hace Veto independiente: es el productor exclusivo de PortfolioTarget y DiscreteTarget aprobados, con un ConstraintReport. No optimiza.
Cuándo usarlo Siempre, entre cualquier optimizador y cualquier consumidor de targets.
Entrada → salida PortfolioCandidate / DiscreteCandidate → target aprobado o rechazo razonado.
Imagen / gate opt · G5–G6 PASS (anti-bypass probado con ApprovedTarget).
Límites hoy Sin trading en vivo: los targets aprobados no se envían a ningún broker.
Profundizar Modelos G4–G8

Separación de poderes

Allocation y Discreto nunca construyen targets aprobados y el ConstraintValidator nunca optimiza. Esta separación la hace cumplir el código, no una convención.


Familia 5 · Redes neuronales y modelos fundacionales

16. NHITS (PyTorch + neuralforecast)

Campo Detalle
Qué hace Red neuronal de previsión jerárquica por interpolación (NHITS), con PyTorch 2.9.1 CPU y neuralforecast 3.2.2.
Cuándo usarlo Muchas series, horizontes medios y exógenas conocidas a tiempo.
Entrada → salida Serie + exógenas causales → cuantiles (mediana y bandas).
Imagen / gate neural:s4 · G7 PASS (job g7-neural-002; skill frente al baseline naive estacional: MAE 0,50, pinball 0,45).
Límites hoy Entrenado y evaluado solo con datos sintéticos deterministas; cobertura de cuantiles nominal, no certificada; cruce de cuantiles reparado con REORDENAMIENTO_V1 declarado; spec del adapter aún no mapeado al TrainingSpec congelado; la imagen :s4 no está en el release manifest.
Profundizar Modelos G4–G8

Protecciones del motor NHITS

Puerta causal de exógenas (una fuga de futuro devuelve FUTURE_COVARIATE_LEAKAGE), plazo por lote (TIMEOUT sin resultados parciales), techos de arquitectura y artefacto sin pickle (NPZ/safetensors) recargado con paridad exacta.

17. Chronos-2

Campo Detalle
Qué hace Modelo fundacional de series temporales (paquetes chronos-forecasting + transformers): previsión zero-shot, sin entrenar con nuestros datos.
Cuándo usarlo Como referencia rápida o challenger cuando hay pocas series o poco histórico para entrenar.
Entrada → salida Serie → previsión probabilística.
Imagen / gate chronos · G8 PASS (checkpoint con SHA verificado, licencia y provenance; CPU).
Límites hoy Solo CPU, sin JAX; el stream no carga modelos fundacionales.
Profundizar Modelos G4–G8

18. TimesFM 2.5

Campo Detalle
Qué hace Modelo fundacional de Google (paquete timesfm), fijado a la generación 2.5.
Cuándo usarlo Como segundo modelo fundacional para contrastar con Chronos-2.
Entrada → salida Serie → previsión puntual + cuantiles (punto = mediana).
Imagen / gate timesfm25 · G8 PASS (SHA verificado y provenance).
Límites hoy Sin XReg (covariables) ni JAX; solo CPU.
Profundizar Modelos G4–G8

Familia 6 · Datos y control

La plataforma reutiliza los cuatro almacenes del proyecto Compose finaz del servidor; no los duplica. Los tratamos como motores porque cada uno aporta una semántica que el resto da por garantizada.

19. PostgreSQL (control y publicación)

Campo Detalle
Qué hace Plano de control: admisión idempotente, leases y fence, outbox, publicaciones y checkpoints.
Cuándo usarlo Todo lo que deba ser transaccional: un resultado solo existe cuando su publicación hace commit.
Entrada → salida RunSpec → run QUEUED → publicación SUCCEEDED.
Imagen / gate Compartido; lo usan api y core con un rol por servicio · G1, S1.
Límites hoy Instrumentos y snapshot real aún no registrados en PG.
Profundizar Datos del runtime

20. ClickHouse (revision log PIT)

Campo Detalle
Qué hace Histórico analítico append-only con revisiones: la tabla market_bars_v1 guarda cada observación con su known_at, y los selectores PIT devuelven solo lo conocido en as_of.
Cuándo usarlo Para cualquier consulta histórica que deba ser point-in-time.
Entrada → salida ObservationBatch → filas revisionadas + archive commits.
Imagen / gate Compartido; escribe io · G1, G3.
Límites hoy 141 551 barras reales (44 series) desde 2026-09-22, con known_at = cierre de barra (sin evidencia del proveedor); sin columna de timeframe ni adj_close; intradía twelvedata y 1d_long no ingeridos.
Profundizar Datos del runtime

21. Redpanda (log durable)

Campo Detalle
Qué hace Log de eventos compatible con Kafka: fuente del modo stream y soporte del replay.
Cuándo usarlo Datos en llegada y reproducción determinista de secuencias con fallos.
Entrada → salida Eventos → log ordenado con offsets (consumidos con watermarks y backpressure).
Imagen / gate Compartido; lo usan core e io · G2, G3.
Límites hoy Ver S5 (daemon stream pendiente de promoción a :s4).
Profundizar Runtime batch, replay y stream

22. MinIO / CAS (snapshots sellados)

Campo Detalle
Qué hace Almacén de artefactos direccionado por contenido: cada objeto se nombra por su sha256; los snapshots se sellan (SEALED) y el GC respeta pines.
Cuándo usarlo Snapshots de datos, checkpoints y artefactos de modelos.
Entrada → salida Artefacto → dirección sha256:… inmutable.
Imagen / gate Compartido; escribe io (y los jobs) · G1.
Límites hoy Snapshot real sellado solo de Yahoo 1d (117 814 filas).
Profundizar Datos del runtime

Familia 7 · API

23. API de backtesting (bench-api)

Campo Detalle
Qué hace API FastAPI del banco de backtesting en :8000 (rutas /v1/...) con Swagger: backtests, paridad, sweeps, indicadores, stats y jobs.
Cuándo usarlo Para experimentar con estrategias e indicadores del banco.
Entrada → salida Petición HTTP → resultados del banco (fills, equity, paridad, series).
Imagen / gate finaz/bench (perfil bench-api) · H0–H4.
Límites hoy De 386 indicadores, 375 son ejecutables por POST /v1/indicators, pero solo 33 con fórmula canónica y paridad; los otros 342 van por paso directo al motor (execution_mode: engine_passthrough), sin garantías. 11 no son ejecutables y lo dicen en not_computable_reason.
Profundizar API de backtesting y análisis

24. API de plataforma (/platform/v1)

Campo Detalle
Qué hace API REST de la plataforma en loopback 127.0.0.1:18300, con autenticación Bearer y OpenAPI 3.1: flows, runs (con Idempotency-Key) y results.
Cuándo usarlo Para ejecutar flujos contractuales y consultar resultados publicados.
Entrada → salida FlowSpec / RunSpec → run admitido → ResultRef.
Imagen / gate api · G1, S4 PASS (smoke e2e 10/10).
Límites hoy Las operaciones no implementadas devuelven 501 honestos; la API no consume el ruteo canary en caliente.
Profundizar API de plataforma

Totales y estado

Concepto Valor
Paquetes (packages/finaz_*) 26
Contratos congelados 53
Imágenes del runtime y los modelos 8 (api, core, io, quant, opt, neural, chronos, timesfm25)
Fichas de agente 30 (AG-001…AG-030)
Estado tras el hito 4 (2026-09-22) Todos los gates PASS salvo S5 INCOMPLETO

Lo que ningún motor hace hoy

Sin trading en vivo, sin GPU, sin Kubernetes y sin duplicar PostgreSQL, ClickHouse, Redpanda ni MinIO. Ver la lista completa de limitaciones en Gates.

Resumen

  • FinazTradingEngine no son "dos motores de backtesting": son 24 motores en siete familias, con NautilusTrader y VectorTA como oráculo de referencia.
  • Cada motor declara un contrato de entrada y salida, corre en una imagen con solo sus dependencias y está certificado por un gate.
  • Los optimizadores proponen candidatos; solo el ConstraintValidator aprueba targets.
  • Los límites están declarados: S5 pendiente, NHITS sobre datos sintéticos, PIT real sin evidencia de proveedor.

Para practicar

  1. Quieres prever la volatilidad diaria de 40 acciones. ¿Qué motor usarías primero y cuál como challenger? ¿En qué imagen corre cada uno?
  2. Explica por qué un PortfolioCandidate con estado OPTIMAL todavía no es un target que se pueda usar.
  3. Un compañero propone usar NHITS con una exógena que es el cierre del día siguiente. ¿Qué código de error devolvería el motor y por qué?
  4. ¿Por qué CP-SAT corre en un subproceso? ¿Qué gate lo certifica?
  5. Busca en la tabla del catálogo todos los motores que no son PASS sin matices y escribe su limitación en una frase.