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 |
OptimizationProblem → solo 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 |
| 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 |
| 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
- Quieres prever la volatilidad diaria de 40 acciones. ¿Qué motor usarías primero y
cuál como challenger? ¿En qué imagen corre cada uno?
- Explica por qué un
PortfolioCandidate con estado OPTIMAL todavía no es un
target que se pueda usar.
- 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é?
- ¿Por qué CP-SAT corre en un subproceso? ¿Qué gate lo certifica?
- Busca en la tabla del catálogo todos los motores que no son PASS sin matices y
escribe su limitación en una frase.