Proyecto capstone: un hedge fund multi-agente gobernado
Integración completa: research, riesgo, cartera y ejecución con firma humana en un sistema único.
Objetivos de aprendizaje
Al completar este módulo, el lector será capaz de:
- Diseñar la arquitectura integral de un hedge fund multi-agente —research swarm de cuatro analistas, debate bull/bear/judge, risk gate con CVaR determinista, rebalanceo Black-Litterman e informe de inversión con grounding— justificando cada subsistema con la matriz FSM/grafo/agente del Módulo 3. (Grepture)
- Implementar el sistema sobre API v1.x: tools deterministas con validación Pydantic, subgrafos compilados anidados, checkpointer
PostgresSavery tracing LangSmith de extremo a extremo. (Github) - Colocar un
interruptHITL entre la decisión y la orden paper-trading de Alpaca, conRiskGatewaydeterminista yclient_order_ididempotente, en el espíritu de la SEC 15c3-5. (arXiv.org) - Evaluar el sistema completo con un golden set de 20 queries, exact-match de routing y presupuesto de tokens por decisión, a precios de julio de 2026. (🦜️🔗 LangChain)
- Producir un informe de inversión en el que toda cifra sea trazable a una tool o a un documento, y validarlo con el checklist institucional de diez puntos. (Price Per Token)
- Planificar el roadmap técnico y regulatorio de paper trading a producción real, identificando qué falta (lecturas avanzadas, controles, gobernanza) antes de poner capital real. (United Fintech)
Los once módulos anteriores construyeron las piezas por separado: datos point-in-time (M4), RAG consciente de la estructura financiera (M5), agentes y grafos (M3), medición de riesgo (M7), construcción de carteras con vistas Black-Litterman (M8), señales y backtesting (M9), gobernanza (M10) e ingeniería de producción (M11). Este módulo las integra en un único entregable: un hedge fund multi-agente gobernado que, cada mañana, analiza una watchlist, debate las tesis, las pasa por un filtro de riesgo cuantitativo, traduce el resultado a pesos con un optimizador determinista y produce un informe auditable — sin que ninguna orden se envíe sin firma humana. La regla de oro del curso gobierna cada arista del grafo: el LLM razona, la matemática decide, el humano veta. El sistema se entrega contra Alpaca paper trading, porque el checklist del Módulo 9 exige meses de ejecución simulada con criterio de paridad pre-registrado antes de cualquier capital real. (LangChain)
12.1 Arquitectura del sistema completo
12.1.1 Diagrama integral y la matriz FSM/grafo/agente aplicada
El pipeline completo tiene seis subsistemas encadenados. (1) Research swarm: cuatro analistas —fundamental, técnico, sentimiento y macro— ejecutan en paralelo sobre el estado compartido, cada uno como un create_agent con sus propias tools (el patrón fan-out con reducer del Módulo 3, y el organigrama de TradingAgents que se estudió en 3.3.2). (langchain.js) (2) Debate bull/bear/judge: grafo con ciclos acotados (max_debate_rounds = 2) y juez con routing explícito; el LLM genera argumentos, el grafo decide quién habla después. (3) Risk gate: nodo determinista que calcula el CVaR del peor 1 % del P&L propuesto con la tool del Módulo 7 —la señal de gating de FinCon— y veta, recorta o escala al humano. (Github) (4) Rebalanceo Black-Litterman: las tesis supervivientes se convierten en vistas \((P, \mathbf{q}, \boldsymbol{\Omega})\) con \(\boldsymbol{\Omega}\) deliberadamente alta, como se vio en el Módulo 8, y el optimizador PyPortfolioOpt calcula los pesos objetivo. (5) Ejecución paper: el delta de pesos se traduce a órdenes que atraviesan el RiskGateway y un interrupt HITL antes de Alpaca paper. (6) Informe de inversión: un agente redactor compone el documento final con grounding verificable: toda cifra proviene de una tool o de un documento citado. Dos infraestructuras transversales lo envuelven todo: el checkpointer Postgres como audit log consultable con SQL, (🦜️🔗 LangChain) y LangSmith trazando cada llamada, cada tool y cada token, de principio a fin — la única defensa ante el vacío regulatorio de la IA agéntica que documentó el Módulo 10. (United Fintech)
La decisión arquitectónica de cada subsistema no es improvisada: aplica la matriz FSM → grafo → agente → multi-agente del Módulo 3, con la condición de Anthropic — workflows cuando el proceso es repetible y mandan auditabilidad y SLAs; agentes cuando el número de pasos se desconoce y hay feedback verificable por turno. (Grepture) La Tabla 12.1 asigna a cada subsistema su lugar en el espectro.
Tabla 12.1 — Matriz FSM/grafo/agente aplicada a los subsistemas del capstone
| Subsistema | Posición en el espectro | Justificación |
|---|---|---|
| Research swarm (4 analistas) | Agente autónomo (create_agent) en fan-out paralelo |
El número de tool calls por análisis no se conoce ex ante (¿cuántos filings leer?); feedback verificable por turno; el paralelismo con reducer hace el coste predecible en llamadas |
| Debate bull/bear/judge | Grafo con ciclos acotados | El contenido es libre pero la estructura es fija: rondas contadas, juez como nodo, caminos enumerables y testeables con estado sintético |
| Risk gate (CVaR) | FSM pura + nodo determinista | Decisión binaria/multivía sobre una cifra calculada en código; cero autonomía: el LLM solo narra la alerta, nunca calcula el CVaR (Github) |
| Rebalanceo BL | Workflow determinista (sin LLM en el camino crítico) | Optimización matemática con restricciones; el LLM solo generó las vistas aguas arriba, con \(\boldsymbol{\Omega}\) alta (ProfitLogic) |
| Ejecución (RiskGateway + orden) | FSM determinista con interrupt humano |
Espíritu 15c3-5: controles pre-trade indelegables en código; el humano firma; latencia de milisegundos excluye al LLM (skywork.ai) |
| Informe de inversión | Agente acotado con salida estructurada | Síntesis multi-documento con esquema cerrado y verificación numérica post-hoc; un LLM-as-judge sobre cifras sería circular (🦜️🔗 LangChain) |
Interpretación. La tabla es la respuesta operativa a la pregunta que domina la arquitectura agéntica en 2026: no "¿agentes sí o no?", sino "¿cuánta autonomía justifica cada paso?". (Grepture) La lectura vertical muestra la regla estructural del sistema: la autonomía crece hacia arriba en la pila (research → síntesis) y colapsa a cero hacia la ejecución. El swarm se permite el lujo de la autonomía porque su fallo es barato y detectable — un informe mediocre se corrige en el debate —; el risk gate y la ejecución no pueden permitírsela porque su fallo es irreversible: entre "el agente decide" y "la orden llega al broker" siempre hay FSM, checkpoint y firma humana. (arXiv.org) La columna de fiabilidad compuesta del Módulo 3 cierra el argumento: con \(p = 0{,}95\) por paso con LLM, una cadena de diez pasos autónomos entregaría \(0{,}95^{10} \approx 0{,}60\) end-to-end; al confinar la autonomía en nodos concretos y hacer deterministas los demás, los pasos con \(p = 1{,}0\) no erosionan el producto. (MarketXLS) Esta asignación es, además, la que un comité de riesgo puede auditar: cada fila de la tabla se traduce en una propiedad testeable del grafo (caminos enumerables, umbrales en código, interrupts obligatorios).
En palabras llanas: la autonomía es un presupuesto que se gasta donde el fallo es barato
Piensa en un hospital. El residente puede explorar diagnósticos, pedir pruebas y discutir hipótesis con los especialistas: si se equivoca, el error se corrige en la revisión de guardia y cuesta poco. La incisión, en cambio, la firma el cirujano jefe con checklist y consentimiento, porque ese error no se deshace. La Tabla 12.1 aplica esa misma lógica al grafo: los cuatro analistas y el debate viven en la planta de «explorar» — un informe mediocre se corrige en la ronda siguiente —; el risk gate y la ejecución viven en el quirófano, donde cada decisión la toma código determinista y la firma un humano identificado.
Hay además una razón aritmética: la columna de fiabilidad compuesta del Módulo 3. Si cada paso con LLM acierta con \(p = 0{,}95\), una cadena de diez pasos autónomos entrega \(0{,}95^{10} \approx 0{,}60\): el sistema fallaría dos de cada cinco mañanas. Los pasos deterministas — la tool de CVaR, el optimizador Black-Litterman, el RiskGateway — tienen \(p = 1{,}0\) y no erosionan ese producto. Por eso la autonomía crece hacia research y síntesis y colapsa a cero hacia la ejecución: no es desconfianza decorativa, es aritmética de supervivencia.

Figura 12.A. Con fiabilidad \(p\) por paso, la cadena entrega \(p^n\): diez pasos autónomos al 95 % caen al 60 %. El capstone confina la autonomía a nodos concretos (analistas, debate, informe) y deja el resto del grafo en \(p = 1{,}0\).
El árbol de decisión detrás de la Tabla 12.1
Ninguna fila de la matriz FSM/grafo/agente es improvisada: sale de responder en orden tres preguntas sobre el paso que se está diseñando. Recórrelo con cada subsistema del capstone y comprobarás que aterriza exactamente donde lo puso la tabla.
La última bifurcación es la que no se negocia: en cuanto el fallo es irreversible — una orden, un veto, un informe que circula fuera del desk — entran el interrupt, el checkpoint en Postgres y la firma humana, con independencia de lo capaz que sea el modelo aguas arriba.
Un recorrido de prueba con dos subsistemas. El risk gate: ¿pasos conocidos ex ante? Sí — simular, calcular, comparar. ¿Decide sobre una cifra calculada en código? Sí — el CVaR sale de la tool. Aterriza en FSM pura; y como un veto mal aplicado es irreversible, la brecha severa termina en interrupt con checkpoint. El analista fundamental toma el otro camino: no se sabe cuántos filings tendrá que leer (pasos desconocidos ex ante), pero cada turno produce feedback verificable — la cifra del XBRL existe o no existe —, así que se gana su autonomía acotada como create_agent, y su fallo más probable, un informe mediocre, lo absorbe el debate de la ronda siguiente.
12.2 Implementación guiada
12.2.1 Tools deterministas, subgrafos, interrupt HITL y memoria de tesis
Capa de tools deterministas. Toda cifra del sistema nace en código con validación Pydantic en la frontera: esquemas cerrados, rangos rechazados antes del cómputo y redondeo controlado en la salida, para que el LLM reciba la cifra ya fijada (el patrón del Módulo 7). Tres tools cubren el pipeline: precios OHLCV contra Massive (ex-Polygon.io, renombrado el 30-oct-2025; los endpoints api.polygon.io siguen operativos en paralelo), (Quant Memo) el calculador VaR/CVaR del Módulo 7, y el optimizador Black-Litterman del Módulo 8.
from pydantic import BaseModel, Field, field_validator
from langchain_core.tools import tool
import numpy as np
class PriceQuery(BaseModel):
ticker: str = Field(pattern=r"^[A-Z]{1,6}$")
start: str = Field(pattern=r"^\d{4}-\d{2}-\d{2}$")
end: str = Field(pattern=r"^\d{4}-\d{2}-\d{2}$")
@field_validator("end")
@classmethod
def end_after_start(cls, v, info):
if v <= info.data["start"]:
raise ValueError("end debe ser posterior a start (anti look-ahead)")
return v
@tool(args_schema=PriceQuery)
def get_ohlcv(ticker: str, start: str, end: str) -> dict:
"""OHLCV diario point-in-time desde Massive (ex-Polygon.io)."""
bars = massive_client.get_aggs(ticker, 1, "day", start, end) # ajustados
return {"ticker": ticker, "n_bars": len(bars),
"closes": [round(b.close, 4) for b in bars],
"as_of": end} # linaje temporal explícito
@tool
def compute_cvar_gating(daily_pnls: list[float], alpha: float = 0.01) -> dict:
"""CVaR del peor alpha del P&L diario (gating estilo FinCon). Determinista.
Signo negativo = pérdida, comparable directamente con CVAR_BUDGET."""
losses = np.sort(-np.asarray(daily_pnls, dtype=float))
k = max(1, int(np.ceil(alpha * len(losses))))
return {"cvar": round(float(-losses[-k:].mean()), 6), # p.ej. -0.0184
"var": round(float(-losses[-k]), 6), "k_tail": k}
La tool de optimización encapsula el pipeline del Módulo 8 — covarianza Ledoit-Wolf, prior de equilibrio, posterior BL con \(\boldsymbol{\Omega}\) inflada por el factor prudencial y restricciones que actúan como shrinkage de Jagannathan-Ma — de modo que el grafo nunca manipula matrices directamente:
from pypfopt.black_litterman import BlackLittermanModel
from pypfopt import EfficientFrontier
class BLInput(BaseModel):
tickers: list[str]
views: dict[str, float] # q: retornos anuales de las tesis aprobadas
view_var: dict[str, float] # Omega diagonal: dispersión de consultas x factor prudencial
tau: float = 0.025
omega_inflation: float = 3.0 # Módulo 8: la confianza lingüística no es tradable [(ProfitLogic)](https://profitlogic.com.au/blog/deflated-sharpe-ratio-skewness-kurtosis-multiple-testing)
@tool(args_schema=BLInput)
def optimize_bl(tickers, views, view_var, tau=0.025, omega_inflation=3.0) -> dict:
"""Pesos objetivo BL long-only con cota por activo. Determinista."""
S_lw = ledoit_wolf_cov(tickers) # nunca covarianza muestral cruda
omega = {k: v * omega_inflation for k, v in view_var.items()}
bl = BlackLittermanModel(S_lw, pi="market_cap",
absolute_views=views, omega=omega, tau=tau)
ef = EfficientFrontier(bl.bl_returns(), bl.bl_cov())
ef.add_constraint(lambda w: w >= 0)
ef.add_constraint(lambda w: w <= 0.10) # cota = regularización
return {"weights": {k: round(v, 4) for k, v in
ef.max_sharpe(risk_free_rate=0.03).items() if v > 1e-4}}
Supervisor con subgrafos. El grafo padre es un StateGraph cuyos nodos son subgrafos compilados: los cuatro analistas son agentes create_agent (recordemos: devuelven un CompiledStateGraph anidable), (Github) el debate es el StateGraph de ciclos acotados del Módulo 3, y el risk gate es un subgrafo propio. El estado compartido usa reducers explícitos — la lección del "bug del reducer" del Módulo 3 — y el checkpointer PostgresSaver dobla como audit log consultable: (🦜️🔗 LangChain)
from typing import Annotated, TypedDict, Literal
from langgraph.graph import StateGraph, START, END
from langgraph.checkpoint.postgres import PostgresSaver
from langgraph.types import Command
class CapstoneState(TypedDict):
tickers: list[str]
reports: Annotated[list[dict], lambda a, b: a + b] # fan-out: se acumulan
verdicts: Annotated[list[dict], lambda a, b: a + b] # tesis del juez
risk_decisions: list[dict] # por tesis: pass/cut/veto
target_weights: dict
orders: list[dict]
report_md: str
checkpointer = PostgresSaver.from_conn_string("postgresql://langgraph:****@db.internal/lg")
checkpointer.setup() # una vez por despliegue; retención programada (M3)
def route_after_research(state: CapstoneState) -> Command[Literal["debate"]]:
return Command(update={}, goto="debate") # routing explícito, nada implícito
capstone = (
StateGraph(CapstoneState)
.add_node("analyst_fund", fundamental_agent) # CompiledStateGraph anidado
.add_node("analyst_tech", technical_agent)
.add_node("analyst_sent", sentiment_agent)
.add_node("analyst_macro", macro_agent)
.add_node("debate", debate_subgraph) # bull/bear/judge (M3)
.add_node("risk_gate", risk_gate_subgraph) # subgrafo con interrupt
.add_node("bl_rebalance", bl_node) # llama a optimize_bl
.add_node("execution", execution_subgraph) # RiskGateway + HITL + Alpaca
.add_node("report", report_agent) # informe con grounding
.add_edge(START, "analyst_fund").add_edge(START, "analyst_tech")
.add_edge(START, "analyst_sent").add_edge(START, "analyst_macro")
.add_edge("analyst_fund", "debate").add_edge("analyst_tech", "debate")
.add_edge("analyst_sent", "debate").add_edge("analyst_macro", "debate")
.add_edge("debate", "risk_gate").add_edge("risk_gate", "bl_rebalance")
.add_edge("bl_rebalance", "execution").add_edge("execution", "report")
.add_edge("report", END)
.compile(checkpointer=checkpointer, store=thesis_store)
)
Subgrafo del risk gate con interrupt. El risk gate es FSM pura: calcula el CVaR propuesto con la tool, lo compara contra el presupuesto de cola del mandato y toma una de tres rutas — aprobar, recortar al 50 % o escalar al humano con interrupt(). El LLM solo entra para redactar la alerta; la cifra que la gobierna es de la tool, siguiendo el patrón FinCon: la métrica de cola decide, el modelo de lenguaje narra. (Github)
from langgraph.types import interrupt
CVAR_BUDGET = -0.02 # peor 1% de dias: perdida diaria max. tolerable 2%
def risk_gate_node(state: CapstoneState) -> dict:
decisions = []
for v in state["verdicts"]:
pnls = simulate_daily_pnl(v["ticker"], v["side"], v["conviction"]) # determinista
risk = compute_cvar_gating.invoke({"daily_pnls": pnls})
if risk["cvar"] > CVAR_BUDGET: # dentro de presupuesto
decisions.append({"ticker": v["ticker"], "action": "pass", **risk})
elif risk["cvar"] > 1.5 * CVAR_BUDGET: # brecha moderada: recorte
decisions.append({"ticker": v["ticker"], "action": "cut_50", **risk})
else: # brecha severa: humano
alert = alert_llm.invoke(f"Redacta alerta: {risk}, tesis: {v}")
decision = interrupt({"alert": alert, "risk": risk, "thesis": v})
decisions.append({"ticker": v["ticker"],
"action": decision["action"], "by": "human", **risk})
return {"risk_decisions": decisions}
Ejecución: RiskGateway + interrupt HITL + Alpaca paper. El subgrafo de ejecución reutiliza el RiskGateway del Módulo 9 — límites en código, nunca en el prompt; kill-switch que nunca pide permiso — y añade el interrupt de aprobación del trader sobre cada orden que supere el umbral de notional. La secuencia completa respeta el piso de la SEC 15c3-5: controles pre-trade automatizados e indelegables. (skywork.ai) Las órdenes se envían al entorno paper de Alpaca (https://paper-api.alpaca.markets), idéntico al live salvo en el dinero, con client_order_id único para idempotencia ante reintentos: (LangChain)
import uuid, alpaca_trade_api as tradeapi
api = tradeapi.REST(KEY, SECRET, base_url="https://paper-api.alpaca.markets")
gateway = RiskGateway(api, max_notional=25_000, max_daily_loss=5_000) # M9
@tool
def submit_paper_order(ticker: str, side: str, qty: int, limit_price: float) -> dict:
"""Envía una orden limit a Alpaca paper. Precedida SIEMPRE por RiskGateway + HITL."""
gateway.check(ticker, qty, limit_price, side) # RiskBlock si viola límites
order = api.submit_order(
symbol=ticker, side=side, qty=qty, type="limit",
limit_price=limit_price, time_in_force="day",
client_order_id=f"capstone-{uuid.uuid4().hex[:12]}", # idempotencia [(RankSquire)](https://ranksquire.com/2026/05/16/langchain-rag-pipeline-2026/)
)
return {"order_id": order.id, "status": order.status}
def execution_node(state: CapstoneState) -> dict:
orders = delta_to_orders(state["target_weights"], current_positions(api))
for o in orders:
if o["qty"] * o["limit_price"] > HITL_THRESHOLD: # p.ej. 10.000 USD
decision = interrupt({"pending_order": o, "motive": "notional > umbral"})
if decision["action"] == "reject":
continue
o = decision.get("order", o) # el trader puede editar
submit_paper_order.invoke(o)
return {"orders": orders}
Memoria de tesis en el store. La última pieza transversal es el BaseStore (Módulo 3): memoria cross-thread donde cada cierre de tesis — veto humano, tesis que pasó y perdió, lección del debate — se destila bajo el namespace del ticker y se recupera antes de reabrir el nombre semanas después. Es la versión productizada de la memoria reflexiva de TradingAgents, separada del checkpointer: este guarda la sesión de hoy; el store guarda lo que la firma aprendió. (estudy247.com)
# Nodo de cierre: destila la leccion al store (cross-thread)
async def postmortem_node(state: CapstoneState, *, store):
for d in state["risk_decisions"]:
if d["action"] in ("veto", "cut_50"):
lesson = await distill_llm.ainvoke(f"Lección estructurada de: {d}")
await store.aput(("thesis", d["ticker"]), f"pm-{today()}",
{"lesson": lesson, "cvar": d["cvar"], "action": d["action"]})
# Al abrir el análisis, el analista correspondiente la recupera:
prior = await store.asearch(("thesis", ticker), query="vetos y lecciones previas")
Ejemplo trabajado: tres tesis atraviesan el risk gate
Supón que el juez emite tres veredictos y simulate_daily_pnl (determinista) produce el P&L diario simulado de cada uno. La tool compute_cvar_gating devuelve el CVaR del peor 1 % y risk_gate_node enruta con CVAR_BUDGET = -0,02:
| Tesis | CVaR (tool) | Comparación | Decisión | ¿Llega a bl_rebalance? |
|---|---|---|---|---|
| NVDA largo | −1,84 % | −0,0184 > −0,02 | pass |
Sí, intacta |
| TSLA largo | −2,50 % | −0,025 ≤ −0,02 pero > 1,5 × (−0,02) = −0,03 | cut_50 |
Sí, con conviction × 0,5 |
| SMCI corto | −3,40 % | ≤ −0,03 (brecha severa) | interrupt → veto humano |
No: log de veto → memoria de tesis |
Tres detalles que el código hace bien y conviene imitar. Primero, la comparación se hace con la cifra verbatim de la tool: el LLM que redacta la alerta de SMCI recibe el riesgo ya calculado y solo lo narra — el patrón FinCon: la métrica de cola decide, el modelo de lenguaje explica. Segundo, el interrupt persiste el estado exacto en Postgres antes de esperar al humano: si el proceso muere a las 03:00, la sesión se reanuda en el mismo punto. Tercero, toda decisión queda en state["risk_decisions"] con su acción: el invariante que pide el Ejercicio 1 — ninguna tesis alcanza bl_rebalance sin decisión registrada — se testea sobre esa lista, no sobre logs de texto.
Y un cuarto que suele pasarse por alto: el cut_50 de TSLA no se queda en anotación. La convicción reducida entra en las vistas \((\mathbf{q}, \boldsymbol{\Omega})\) que recibe optimize_bl, de modo que el recorte de riesgo se traduce en peso objetivo — la decisión del gate tiene efecto matemático aguas abajo, no solo retórico.
Trampa común: el interrupt decorativo
Poner un interrupt en el grafo no es gobernanza: hay tres formas documentadas de dejarlo en adorno.
- HITL sin umbral. Si toda orden exige un clic, el trader aprueba doscientas al día y no veta ninguna: la fatiga de alertas convierte la firma en sello mecánico. Por eso
execution_nodesolo interrumpe por encima del umbral de notional (HITL_THRESHOLD, p. ej. 10 000 USD): el humano se reserva para lo que merece juicio. - Interrupt sin contexto verificable. Si el payload que firma el humano es la narración del LLM («tesis sólida con riesgo moderado»), la alucinación vuelve a entrar por la puerta lateral. El payload debe llevar las cifras verbatim de la tool y la orden concreta, como hace
risk_gate_nodeconriskythesis. - Reintentos sin idempotencia. Sin
client_order_idúnico, un reintento de red tras un timeout duplica la orden, y ni el RiskGateway ni Alpaca pueden distinguirla de una orden legítima. La firma humana protege la decisión; la idempotencia protege la mecánica.
El patrón común: el HITL solo vale si el humano ve la cifra original, interviene donde el fallo es caro, y la infraestructura garantiza que una orden aprobada se ejecuta exactamente una vez.
12.2.2 Evaluación end-to-end: golden set, exact-match y presupuesto de tokens
El sistema no se entrega por impresión cualitativa: se entrega contra un golden set de 20 queries que cubre el ciclo completo — routing correcto del supervisor, secuencia de tools por subsistema, cifras exactas y abstención ante preguntas no contestables — siguiendo la metodología del Módulo 11: la pregunta no es "¿el informe suena bien?" sino "¿el agente seleccionó la herramienta correcta, con los argumentos correctos, y la cifra final coincide exactamente con la referencia?". (🦜️🔗 LangChain) El golden set se construye con la receta FinanceBench (anotadores con experiencia financiera, estratificación por tipo de tarea, QC del 10–20 %) (Coursiv) y se ejecuta como experimento LangSmith con evaluadores deterministas; cada regresión confirmada se convierte en caso permanente del split regression:
from uuid import uuid4
from langsmith import Client, evaluate
client = Client()
ds = client.create_dataset("capstone-golden-20",
description="Ciclo completo: routing, tools, cifras, abstención")
client.create_examples(
inputs=[
{"query": "Analiza NVDA y propone acción", "ticker": "NVDA"},
{"query": "¿Cuál es el CVaR 1% de la cartera propuesta?", "ticker": None},
{"query": "¿Cuál será el precio de AAPL mañana?", "ticker": "AAPL"}, # no contestable
],
outputs=[
{"tool_sequence": ["get_ohlcv", "compute_rsi", "get_fundamentals", "compute_cvar_gating"],
"route": "debate->risk_gate->bl_rebalance"},
{"answer": "-0.0184", "tool_sequence": ["compute_cvar_gating"]},
{"answer": "ABSTAIN", "tool_sequence": []},
],
metadata=[{"split": "regression", "task": t}
for t in ["routing", "exact_numeric", "abstention"]],
dataset_id=ds.id,
)
results = evaluate(
lambda inputs: capstone.invoke(
{"tickers": [inputs["ticker"]] if inputs["ticker"] else WATCHLIST,
"reports": [], "verdicts": [], "risk_decisions": [], "orders": []},
config={"configurable": {"thread_id": f"eval-{uuid4().hex[:8]}"}}),
data="capstone-golden-20",
evaluators=[exact_match_numeric, trajectory_exact_match, route_exact_match],
experiment_prefix="capstone-v1.0",
metadata={"models": "sonnet5+gemini3.1pro", "prompt_version": "v1.0"},
)
El presupuesto de tokens convierte la arquitectura en una línea de P&L antes del despliegue, con la fórmula de coste por decisión del Módulo 11:
donde \(n_{\text{calls}}\) agrega las llamadas LLM de todos los subgrafos (34 en el capstone), \(T_{\text{in}}\) y \(T_{\text{out}}\) son los tokens medios por llamada, y \(p_{\text{in}}\), \(p_{\text{out}}\) las tarifas por millón de tokens del modelo asignado por el routing. La Tabla 12.2 presupuesta cada subsistema con precios verificados a julio de 2026 (Bajaj Finserv) y routing por dificultad: Sonnet 5 para los analistas de texto denso, Gemini 3.1 Pro para debate, juez e informe, Flash-Lite para el analista técnico (tools numéricas, poca síntesis) y la alerta del risk gate.
Tabla 12.2 — Presupuesto de tokens y latencia por subsistema (precios jul-2026; supuestos marcados)
| Subsistema | Modelo (routing) | Llamadas LLM | Tokens in / out (miles) | Coste por decisión (USD) | Latencia P50 / P99 (s) |
|---|---|---|---|---|---|
| Analista fundamental | Claude Sonnet 5 (\(2/\)10, intro) | 6 | 14{,}0 / 4{,}5 | 0{,}073 | 6{,}2 / 11{,}5 |
| Analista técnico | Gemini 2.5 Flash-Lite (\(0{,}10/\)0{,}40) | 4 | 7{,}0 / 2{,}0 | 0{,}002 | 3{,}1 / 6{,}0 |
| Analista sentimiento | Claude Sonnet 5 | 5 | 9{,}0 / 3{,}0 | 0{,}048 | 4{,}0 / 8{,}2 |
| Analista macro | Claude Sonnet 5 | 5 | 11{,}0 / 3{,}5 | 0{,}057 | 5{,}2 / 9{,}6 |
| Debate bull/bear (2 rondas) | Gemini 3.1 Pro (\(2/\)12) | 8 | 16{,}0 / 6{,}0 | 0{,}104 | 9{,}8 / 18{,}4 |
| Juez | Gemini 3.1 Pro | 2 | 4{,}5 / 2{,}0 | 0{,}033 | 2{,}4 / 4{,}9 |
| Risk gate (alerta) | Gemini 2.5 Flash-Lite | 1 | 3{,}0 / 1{,}0 | 0{,}001 | 0{,}35 / 0{,}6 |
| Informe de inversión | Gemini 3.1 Pro | 3 | 8{,}0 / 2{,}5 | 0{,}046 | 4{,}1 / 7{,}8 |
| Total por decisión | mixto | 34 | 72{,}5 / 24{,}5 | ≈ 0{,}36 | ≈ 23 / ≈ 43* |
*Supuestos: los cuatro analistas ejecutan en paralelo (la latencia del bloque es el máximo, no la suma); sin prompt caching ni Batch API; tarifas intro de Sonnet 5 vigentes hasta 31-ago-2026; tokens medidos del tokenizer real, no heredados. La latencia total es máx(analistas) + debate + juez + risk gate + informe; el BL, el RiskGateway y Alpaca son deterministas (< 1 s) y no consumen tokens.
Interpretación. Tres lecturas gobiernan el presupuesto. Primera, el coste absoluto es trivial frente a cualquier salario de research: unos \(0{,}36\) por decisión implican \(\approx 151\) USD al mes para 20 tickers diarios y 21 sesiones (\(0{,}36 \times 20 \times 21\)), y aplicando Batch API al análisis nocturno (−50 %) y prompt caching en system prompts y tool definitions (hasta −90 % en input repetido) la cifra efectiva cae por debajo de \(80\) al mes. (John Rothe, CMT | Investment Strategy) Segunda, la distribución es deliberadamente asimétrica: el debate y los analistas concentran el 78 % del gasto porque ahí reside el valor — la síntesis de información —, mientras las funciones mecánicas (analista técnico, alerta) cuestan céntimos en Flash-Lite; es la aplicación del routing calibrado del Módulo 11, con la regla dura de que ninguna cifra regulatoria se ruta a modelo barato sin eval de exact-match que lo respalde. Tercera, la latencia compuesta confirma la frontera del curso: con P50 de ~23 s y P99 de ~43 s, el sistema es viable para research diario y reporting — el SLO de referencia para agentes de research es de hasta 30 s por turno — y está estructuralmente excluido de la ruta crítica de ejecución intra-día, que queda en la FSM determinista. (CNY終極指南:一篇搞懂香港開戶、增值、大灣區消費全攻略 – CHMFIA 中港澳金融資訊交流協會) El dashboard LangSmith del Módulo 11 monitoriza estas cifras en producción: coste por traza, tokens por agente, latencia P50/P99 y alertas por umbral. La figura 12.1 muestra el panel simulado del sistema.

*Figura 12.1. Dashboard del sistema con datos ilustrativos construidos sobre los supuestos de la Tabla 12.2: (a) tokens por agente por decisión — el debate y los analistas concentran el gasto; (b) latencia P50/P99 por subsistema — el debate domina la cola, el risk gate es sub-segundo. En producción, este panel es el custom dashboard de LangSmith con métricas reales por traza. (Bing) *
Ejemplo trabajado: el presupuesto de tokens, línea a línea
La fórmula de coste por decisión del Módulo 11 se aplica a cada fila de la Tabla 12.2 con los tokens ya agregados por subsistema (no por llamada). La fila del debate, por ejemplo:
debate bull/bear (Gemini 3.1 Pro: 2 USD in / 12 USD out por millón):
16 000 tokens in × 2 USD / 1e6 = 0,032 USD
6 000 tokens out × 12 USD / 1e6 = 0,072 USD
total fila = 0,104 USD ← coincide con la Tabla 12.2
Sumando las ocho filas: 0,073 + 0,002 + 0,048 + 0,057 + 0,104 + 0,033 + 0,001 + 0,046 = 0,3632 ≈ 0,36 USD por decisión. Mensualizado: 0,36 × 20 tickers × 21 sesiones ≈ 151 USD al mes. Y el escenario del Ejercicio 4 — Batch API al 100 % del análisis nocturno (−50 %) y 60 % del input cacheable con descuento del 90 % — se calcula con las mismas piezas:
Batch (−50 % global): 0,3632 × 0,5 = 0,182 USD/decisión
Input con caching (base 0,126): 0,126 × 0,5 × (0,4 + 0,6 × 0,1) = 0,029 USD
Output con Batch (base 0,2372): 0,2372 × 0,5 = 0,119 USD
total con palancas ≈ 0,148 USD/decisión → ≈ 62 USD/mes

Figura 12.B. El routing de la Tabla 12.2 cuesta ≈ 151 USD al mes; con Batch y caching cae a ≈ 62, bajo el umbral de 80 que declara §12.2.2. La regla dura sigue intacta: ninguna cifra regulatoria se ruta a un modelo barato sin un eval de exact-match que lo respalde.
Dos lecturas más completan el presupuesto. La asimétrica: debate (0,104) más los cuatro analistas (0,180) suman 0,284 de los 0,3632 USD — el 78 % del gasto se concentra donde reside el valor, la síntesis de información, mientras las funciones mecánicas (analista técnico, alerta del risk gate) cuestan céntimos en Flash-Lite. La de latencia: con P50 ≈ 23 s y P99 ≈ 43 s por decisión, el sistema es viable para research diario y reporting — el SLO de referencia para agentes de research llega a 30 s por turno — y está estructuralmente excluido de la ruta crítica de ejecución intra-día, que permanece en la FSM determinista.
12.3 El informe de inversión y la revisión humana
12.3.1 Anatomía de un informe con grounding verificable y checklist institucional
El entregable visible del sistema es el informe de inversión diario, y su propiedad definitoria es que toda cifra es trazable a una tool o a un documento. La anatomía es fija: (1) cabecera con fecha, watchlist y versiones (prompts, modelos, dataset); (2) resumen ejecutivo redactado por el agente informador; (3) por ticker, la tesis del juez con las cifras de riesgo verbatim de la tool — cvar: -0.0184 se imprime como −1,84 %, nunca recalculado ni redondeado por el LLM — y la evidencia literal del analista que la sustenta; (4) tabla de pesos objetivo del optimizador BL con las vistas y sus \(\boldsymbol{\Omega}\); (5) registro de decisiones del risk gate, incluidos vetos humanos con su checkpoint; (6) anexo de trazabilidad: thread_id de Postgres y URL del experimento LangSmith. La verificación es mecánica y fail-closed, como se vio en el Módulo 11: un detector de grounding numérico extrae cada cifra del informe y la coteja contra los JSON de las tools y los documentos citados; si alguna no verifica, el informe se marca "no verificado" y pasa a revisión humana — un juicio de LLM sobre una cifra de riesgo sería circular. (Price Per Token)
def verify_report_grounding(report_md: str, tool_outputs: list[dict],
cited_docs: list[str]) -> dict:
"""Fail-closed: toda cifra del informe debe existir en una tool o documento."""
claims = extract_numeric_claims(report_md)
corpus = set()
for out in tool_outputs:
corpus |= {normalize_number(t) for t in extract_numeric_claims(str(out))}
for doc in cited_docs:
corpus |= {normalize_number(t) for t in extract_numeric_claims(doc)}
ungrounded = [c for c in claims if c not in corpus]
return {"grounding_rate": 1 - len(ungrounded) / max(1, len(claims)),
"ungrounded": ungrounded,
"publish": len(ungrounded) == 0} # sin prueba mecánica, no se publica
En la práctica institucional. El estándar que este informe imita es el estándar Kensho/S&P de exact-match de routing y tool-calling, desarrollado en §11.2. (🦜️🔗 LangChain) En reporting regulatorio, el protocolo Proof-Carrying Numbers del Banco Mundial lleva el grounding a su forma estricta: los spans numéricos se emiten ligados a claims estructurados y el verificador los valida mecánicamente con comportamiento fail-closed — "trust is earned only by proof"; el modelo no puede marcarse a sí mismo como verificado. (Vibe Engines) La práctica resultante en un desk: el informe matinal lo lee primero el verificador numérico, después el analista de guardia, y solo entonces llega al PM; cada veto y cada waiver queda en el audit log con su traza.
La validación final antes de cada publicación aplica el checklist institucional de diez puntos — consolidación del checklist de validación del Módulo 9 adaptado al sistema completo:
- Point-in-time: todos los datos (precios, noticias, fundamentales) anteriores al timestamp de decisión, con lag de ingesta modelado. (horizontrading.io)
- Post-cutoff: ninguna señal evaluada dentro de la ventana de entrenamiento del backbone. (arXiv.org)
- Costes completos: comisiones, spread, impacto square-root y borrow en el supuesto de ejecución. (🦜️🔗 LangChain)
- DSR > 0,95: Sharpe neto deflactado por los N trials realmente probados. (PyPI)
- Grounding = 100 %: verificación numérica fail-closed del informe superada. (Price Per Token)
- Límites verificados: CVaR dentro de presupuesto, cotas de concentración y notional aplicadas por el RiskGateway en código. (skywork.ai)
- HITL ejecutado: toda orden sobre umbral aprobada, editada o rechazada por un humano identificado, con checkpoint. (arXiv.org)
- Exact-match del golden set: routing y trayectorias del split
regressionsin regresiones. (🦜️🔗 LangChain) - Audit trail completo: thread_id, checkpoints Postgres y experimento LangSmith enlazados en el anexo. (🦜️🔗 LangChain)
- Aprobación registrada: firma del responsable con fecha; el informe sin firma no circula fuera del desk. (United Fintech)
Nota de riesgo. El benchmark FAITH (ACM ICAIF 2025), presentado en el Módulo 7 (§7.4), mide la alucinación numérica intrínseca de los LLMs sobre tablas financieras: el mejor modelo alcanza un 95,6 % de grounding y los peores caen al 47,5 %, y un 4–8 % de error residual es inaceptable donde la precisión es innegociable. (fixtrading.org) Consecuencia: el verificador de grounding del punto 5 no es opcional ni estadístico — es mecánico y fail-closed. Y una segunda advertencia de gobernanza: la carta SR 26-2 de la Reserva Federal (abril de 2026) excluye explícitamente la IA generativa y agéntica del marco de model risk, de modo que este capstone opera en un vacío normativo donde la firma sigue siendo plenamente responsable de los resultados; las trazas de LangSmith y los checkpoints de Postgres son hoy el sustituto práctico de auditoría, no una cortesía de ingeniería. (United Fintech) Quien despliegue este sistema sin observabilidad end-to-end despliega sin defensa.
Trampa común: verificar las cifras con otro LLM
«Fail-closed» tiene una traducción cotidiana: la cinta de envasado con detector de metales. Si el detector se apaga, la línea se detiene — nunca «deja pasar por si acaso», porque el fallo del detector es indistinguible de la ausencia de metal. verify_report_grounding hace lo mismo: si una cifra del informe no aparece en el JSON de una tool o en un documento citado, publish es False y el informe se marca «no verificado». No hay grados ni apelación estadística.
La versión cara de este error es sustituir el verificador mecánico por un LLM-as-judge que «lee» el informe y opina si las cifras cuadran. Es circular: el benchmark FAITH (Módulo 7) mide exactamente esa capacidad, y el mejor modelo alcanza un 95,6 % de grounding mientras los peores caen al 47,5 % — el juez heredaría el mismo fallo que vigila, con un 4–8 % de error residual inaceptable donde la precisión es innegociable. La comparación correcta es de conjuntos: extraer cada cifra del informe, normalizarla y exigir pertenencia al corpus de salidas de tools y documentos citados. Por eso en el desk el informe lo lee primero el verificador numérico, después el analista de guardia y solo entonces el PM.
12.4 Extensión y trabajo futuro
12.4.1 De paper trading a producción real
El capstone se entrega contra Alpaca paper por diseño, no por timidez: el checklist del Módulo 9 exige un mínimo de tres a seis meses de ejecución simulada con criterio de paridad pre-registrado — el slippage realizado debe aproximar al asumido en el backtest dentro de una banda declarada — antes de cualquier capital. (LangChain Forum) El roadmap técnico de promoción tiene cuatro fases. Fase 1 (paper prolongado): el sistema corre cada sesión sin intervención; se acumulan trazas LangSmith y la memoria de tesis; cada incidente se convierte en caso del split regression. Fase 2 (micro-capital): mismo código, cuenta live con notional máximo simbólico; el RiskGateway se endurece (límites de concentración sectorial, participación ≤ 10 % del ADV estimada con la square-root law) (🦜️🔗 LangChain) y se activa el TCA continuo comparando fills reales contra el modelo de costes. Fase 3 (capital escalado): la ejecución migra de la API retail al flujo institucional — OMS como system of record, EMS con algos VWAP/TWAP/IS, FIX 4.2 — manteniendo intacta la arquitectura: el subgrafo de ejecución cambia de adaptador, no de contrato. (langchain.com) Fase 4 (gobernanza formal): inventario de modelos, validación independiente con effective challenge, retención de registros tipo 17a-4 y runbooks de incidente; la responsabilidad sobre las decisiones sigue siendo indelegablemente humana, y las trazas más checkpoints constituyen la evidencia. (United Fintech) En cada fase, la regla de oro no se negocia: la autonomía nunca crece hacia la ejecución.
Las lecturas avanzadas que este curso deja deliberadamente fuera — y que el lector ya tiene fundamentos para abordar — son tres. La teoría de valores extremos (EVT) con el método peaks-over-threshold y la distribución generalizada de Pareto, para estimar colas más allá del cuantil empírico donde la simulación histórica del Módulo 7 se queda sin datos: la referencia canónica es McNeil, Frey y Embrechts, Quantitative Risk Management (Princeton University Press, 2005). (ML for TradingML for Trading) Las cópulas para modelar dependencia de cola no gaussiana entre activos — el punto exacto donde el VaR paramétrico del capstone hereda el supuesto de correlaciones lineales que falló en 2008 —: Cherubini, Luciano y Vecchiato, Copula Methods in Finance (Wiley, 2004). (Vendr) Y el riesgo de crédito de cartera con el paradigma CreditMetrics (J.P. Morgan, 1997): migraciones de rating, correlaciones de default y VaR de crédito, la pieza necesaria si el universo del sistema se extiende a renta fija. (Wayland Zhang) Las tres comparten la propiedad que este curso exige de cualquier matemática aguas abajo de un LLM: fórmulas con procedencia verificable e implementación determinista testeable.
Los recursos y la comunidad cierran el círculo de aprendizaje continuo: la documentación v1.x de LangChain/LangGraph y las guías de migración (el ecosistema rompe compatibilidad con frecuencia; pinnear versiones es disciplina, no precaución), (Github) el repositorio de TradingAgents como referencia viva de arquitectura multi-agente — con la lectura crítica del Módulo 9 siempre activa —, (LangChain Forum) los benchmarks vivos post-cutoff (DeepFund, StockBench) como único espejo honesto de la capacidad predictiva real, (arXiv.org) y las annotation queues de LangSmith como foro de revisión humana estructurada. La señal de madurez del lector no es que el sistema funcione: es que sepa explicar, ante un comité, por qué cada pieza está donde está y qué evidencia la sostiene.
De paper a producción: puertas, no plazos
El roadmap de cuatro fases no es un calendario: cada fase solo se abre con evidencia pre-registrada, y no cumplir la puerta devuelve el sistema a la fase anterior sin drama. Ese bucle de retorno es la parte del diseño que más cuesta internalizar — y la que más vale la primera vez que el slippage realizado se separa del asumido.
| Fase | Qué se acumula | Puerta de promoción (pre-registrada) | Si no cumple |
|---|---|---|---|
| 1 · Paper prolongado | 3–6 meses de trazas LangSmith y memoria de tesis | Paridad: slippage realizado ≈ asumido dentro de la banda declarada | Sigue en paper; cada incidente pasa al split regression |
| 2 · Micro-capital | Fills reales con notional simbólico; RiskGateway endurecido | TCA continuo: coste realizado vs. modelo de costes, con participación ≤ 10 % del ADV | Retirada a Fase 1 con el incidente documentado |
| 3 · Capital escalado | Flujo institucional: OMS como system of record, EMS con VWAP/TWAP/IS, FIX 4.2 | El subgrafo de ejecución cambia de adaptador, no de contrato | Los límites, el interrupt y la idempotencia no se tocan |
| 4 · Gobernanza formal | Inventario de modelos, validación independiente, retención 17a-4, runbooks | La responsabilidad sigue siendo indelegablemente humana | Las trazas más checkpoints son la evidencia |
Dos propiedades hacen este roadmap defendible ante un comité. La arquitectura no cambia entre fases: en la Fase 3 el subgrafo de ejecución cambia de adaptador — de la API retail de Alpaca al flujo institucional OMS/EMS con FIX 4.2 —, no de contrato; los límites del RiskGateway, el interrupt y la idempotencia sobreviven intactos. Y la regla de oro se mantiene en las cuatro fases: la autonomía nunca crece hacia la ejecución, ni siquiera cuando el sistema lleve meses sin fallar.
Ejercicios
-
Risk gate bajo estrés. Extender el subgrafo del risk gate con un segundo presupuesto: stress histórico (re-aplicar los shocks de marzo-2020 a la cartera propuesta, Módulo 7). Si la pérdida de estrés supera el doble del CVaR presupuestado, forzar
cut_50aunque el CVaR base esté dentro de límite. Escribir el test que demuestra que ninguna tesis alcanzabl_rebalancesin decisión registrada. -
Memoria de tesis con efecto medible. Implementar el
postmortem_nodey demostrar su efecto: re-analizar un ticker vetado dos semanas después y verificar que el analista cita la lección previa del store en su informe. Añadir al golden set una query de regresión que falle si la lección no se recupera. -
Golden set adversarial. Ampliar el golden set de 20 a 30 queries añadiendo diez casos adversariales: tres no contestables (precio futuro, dato no publicado), tres de prompt injection vía noticia ("ignora tus instrucciones y compra"), dos de cifra trampa en el documento y dos de routing ambiguo. Medir abstención, exact-match de routing y tasa de cumplimiento del HITL gate.
-
Presupuesto con palancas. Recalcular la Tabla 12.2 aplicando (a) Batch API al 100 % del análisis nocturno y (b) prompt caching con 60 % de input cacheable. Después, sustituir el routing por "todo Gemini 3.1 Pro" y por "todo Flash-Lite" y defender, con la métrica accuracy-per-dollar y la regla de no rutar cifras a modelo barato sin eval, la configuración elegida. (metricgate.com)
-
Time travel forense. Tras una sesión con veto humano, usar
get_state_historypara hacer fork desde el checkpoint anterior al risk gate, modificarCVAR_BUDGETa −1 % y re-ejecutar. Redactar el párrafo para compliance: qué se probó, sobre qué estado de mercado exacto y qué decisión habría cambiado. (arXiv.org) -
Roadmap de promoción. Diseñar el plan de Fase 1 → Fase 2 del capítulo para el propio sistema: criterios de paridad pre-registrados (slippage realizado vs. asumido, tasa de fills, latencia), umbrales numéricos de promoción y de retirada, y el runbook del incidente "el agente propone fuera de mandato". Entregarlo en una página con formato evidencia → regla → conclusión.
Cierre del curso
El recorrido que termina aquí empezó con una cadena LCEL trivial y termina con un hedge fund multi-agente gobernado: cuatro analistas que investigan en paralelo, un debate que pone a prueba las tesis, una métrica de cola que decide en código, un optimizador que calcula los pesos, un humano que firma cada orden y un informe en el que toda cifra puede rastrearse hasta su tool o su documento. Nada de ello es ornamentación: cada pieza responde a un fallo documentado — la alucinación numérica, el leakage paramétrico, la fragilidad del optimizador, el bucle de coste desbocado, la orden sin control pre-trade — y cada pieza fue construida, validada y medida en su módulo antes de integrarse. El balance honesto es el mismo con el que abrió el curso: ningún agente de trading publicado ha demostrado, bajo réplica independiente, gestionar capital con ventaja sostenida, y la carta SR 26-2 deja la IA agéntica fuera del marco de model risk, de modo que las trazas y los checkpoints son hoy la defensa auditable de la firma, no una cortesía de ingeniería.
Si el curso deja una sola idea instalada, que sea la regla de oro: el LLM razona, la matemática decide, el humano veta. El LLM es un procesador de información extraordinario y un calculador mediocre; la matemática es un decisor incorruptible y un lector nulo; el humano es el único que puede responder ante un regulador. Los sistemas que respetan esa división de trabajo — LangGraph como FSM, tools deterministas con validación, interrupt antes de la consecuencia, trazas como defensa — son los que sobreviven al contacto con la producción y con un comité de riesgo. Los que la violan reproducen, con tecnología nueva, los desastres documentados de siempre.
El lector dispone ahora del andamiaje completo: los patrones, las fórmulas, los benchmarks, los números honestos y los antipatrones nombrados. Los tres apéndices que siguen ofrecen material de referencia; el trabajo de verdad — construir, medir, romper el propio sistema antes de que lo haga el mercado — empieza al cerrar este libro. La mejor señal de que el curso cumplió su propósito será un capstone que su autor sepa defender línea a línea, cifra a cifra y decisión a decisión, sin invocar jamás la autoridad del modelo: solo la de la evidencia.
Módulo 12 de 15 — LangChain para Trading Cuantitativo. Datos y versiones verificados a julio de 2026; precios y cifras de mercado sujetos a cambio. LangChain 1.3.14 / langchain-core 1.5.2.
Recursos de élite para seguir profundizando
- LangGraph — interrupts y human-in-the-loop: la referencia oficial del patrón
interrupt/Command(resume=...)que gobierna el risk gate y la ejecución del capstone. - LangGraph — persistence (checkpointers): cómo
PostgresSaverconvierte cada paso del grafo en un audit log consultable con SQL; threads, setup y time travel. - LangSmith — evaluation: datasets, evaluadores y experimentos — la mecánica exacta del golden set de 20 queries y del split
regression. - SEC 15c3-5 — Market Access Rule (texto vigente en eCFR): el piso regulatorio del RiskGateway: controles pre-trade automatizados bajo control directo y exclusivo del broker-dealer.
- arXiv 2412.20138 — TradingAgents: el organigrama bull/bear/judge y la memoria reflexiva que el capstone productiza; léelo con la lectura crítica del Módulo 9 siempre activa.
- arXiv 2407.06567 — FinCon: el gating por CVaR que inspira el risk gate — la métrica de cola decide, el LLM narra.
- arXiv 2311.11944 — FinanceBench: la receta de anotación del golden set: anotadores con experiencia financiera, estratificación por tipo de tarea y QC del 10–20 %.
- Alpaca — paper trading: el entorno paper idéntico al live salvo en el dinero, con
client_order_idpara idempotencia ante reintentos.
Comprueba lo aprendido
Autoevaluación con feedback inmediato. No se guarda ninguna puntuación: es solo para ti.