Bots de TradingDesarrollo IA

TradingAgents en 2026: el framework multiagente de trading con LLM

26 de octubre de 2026
15 min de lectura
Una sala de juntas de vidrio vacía al atardecer con gráficos de mercado abstractos brillando en pantallas de pared
Compartir:

Construyo y opero mis propios bots de trading sobre Alpaca, así que cuando un repo que convierte a los LLM en una ‘firma de trading’ aparece en el trending semanal de GitHub con 115K estrellas, leo el código del grafo antes de mirar cualquier curva de equity. TradingAgents merece la atención: analistas, un debate entre alcistas y bajistas, un trader, un equipo de riesgo y un portfolio manager, conectados en un pipeline limpio de LangGraph.

En esta guía te cuento qué es, cómo funciona el pipeline de cuatro etapas, un quickstart de cinco minutos sobre la v0.7.0, qué prueba y qué no prueba el backtest del paper, cuánto cuesta una corrida, cómo enchufar modelos más baratos o locales y cómo lo pondría en paper trading antes de confiar en un solo rating.

No es asesoramiento financiero

Esto es una revisión de ingeniería de un framework de investigación. Nada de lo que sigue recomienda comprar ni vender nada; los tickers de los comandos son ejemplos, y ningún backtest, ni el del paper ni el tuyo, promete retornos futuros. El propio proyecto lo dice en su README: está diseñado con fines de investigación y “no pretende ser asesoramiento financiero, de inversión ni de trading” (traducción mía).

1. Qué Es TradingAgents (y Por Qué Está en Tendencia)

TradingAgents es un framework open source en Python de Tauric Research que modela una firma de trading con agentes LLM: los analistas reúnen evidencia, los investigadores defienden ambos lados, un trader propone, un equipo de riesgo pone objeciones y un portfolio manager da el visto bueno. Está construido sobre LangGraph y acompaña al paper ‘TradingAgents: Multi-Agents LLM Financial Trading Framework’ de Yijia Xiao, Edward Sun, Di Luo y Wei Wang (arXiv 2412.20138), que arXiv registra como presentación oral en Multi-Agent AI in the Real World.

El impulso es real. El 26 de octubre de 2026 la página de trending semanal de GitHub mostraba 2.461 estrellas nuevas esta semana, y la API reportaba 115.476 estrellas y 22.204 forks. El ritmo de releases es igual de rápido: cinco versiones entre el 18 de septiembre y el 16 de octubre de 2026, de la v0.5.0 a la v0.7.0.

El repo de un vistazo (26 de octubre de 2026)

  • Estrellas: ~115K (115.476), +2.461 esta semana; 22.204 forks
  • Licencia: Apache-2.0
  • Última versión: v0.7.0, publicada el 16 de octubre de 2026 (con wheel adjunto en el release de GitHub)
  • Requisitos: Python 3.11 o superior; Docker Compose opcional
  • Construido sobre: LangGraph, con clientes de LangChain para cada proveedor de LLM
  • Modelos por defecto: GPT-6 Sol (nivel deep) y GPT-6 Luna (nivel quick), ambos de OpenAI
  • Paper: arXiv 2412.20138, versión actual v7 (3 de junio de 2025)

El paper y el código no son el mismo artefacto

El paper se construyó con gpt-4o-mini, gpt-4o y o1-preview, y su trader emitía comprar, vender o mantener. La v0.7.0 usa por defecto modelos de la era GPT-6, emite un rating de cinco niveles y tiene una tubería de datos point-in-time que el paper no describe. Cuando más abajo digo ‘el paper’ y ‘el repo’, hablo de dos cosas distintas.

2. La Arquitectura en 4 Pasos

El diagrama del README se corresponde limpiamente con el cableado de tradingagents/graph/setup.py. Esto es lo que de verdad se ejecuta para un ticker en una fecha con los valores por defecto: una ronda de debate y una ronda de riesgo.

🔎

1. Equipo de analistas

en paralelo, modelo quick

Mercado (precio e indicadores técnicos), Sentimiento (titulares, StockTwits, Reddit), Noticias (de la empresa, globales y macro) y Fundamentales (estados financieros, operaciones de insiders) corren a la vez, cada uno con su historial de mensajes privado y sus propias herramientas. En paralelo, un paso de Memory Log liquida las decisiones pasadas.

🐂

2. Debate alcista vs. bajista

investigadores + research manager

Un investigador alcista y uno bajista discuten sobre los informes de los analistas, por turnos, hasta que cada uno habló max_debate_rounds veces. El Research Manager, con el modelo deep, juzga el debate y redacta un plan de inversión con un rating.

💼

3. Trader

modelo quick

El Trader convierte el plan de inversión en una propuesta de operación concreta y decide el momento y la magnitud. Desde la v0.4.0, sus afirmaciones sobre precios se anclan en un snapshot de datos verificado.

🛡️

4. Equipo de riesgo + portfolio manager

tres debatientes, firma con modelo deep

Los analistas de riesgo Agresivo, Conservador y Neutral debaten la propuesta por turnos. El Portfolio Manager lee ese debate y las lecciones de decisiones pasadas del memory log, y emite el rating final.

Dos niveles de modelo, y por qué importan para tu factura

Cada agente corre en uno de dos modelos. El nivel quick atiende a los analistas, los investigadores, los debatientes y el trader; el nivel deep solo al Research Manager y al Portfolio Manager. Desde la v0.6.0 cada nivel puede usar su propio proveedor, y de ahí cuelgan todos los trucos de costo de las secciones 6 y 7.

Qué sale, y qué no

Una corrida devuelve el estado final más un rating: Buy, Overweight, Hold, Underweight o Sell, o REVIEW cuando el texto del Portfolio Manager no tiene un rating legible. También obtenés informes en Markdown y, desde la v0.6.0, un único complete_report.html. No encontré ninguna integración con brokers en el código de la v0.7.0, y el propio módulo de backtest del repo dice que “no es un simulador de cartera”: convertir un rating en una orden es trabajo tuyo.

3. Quickstart: la v0.7.0 en Cinco Minutos

Estos son los comandos del README. Necesitás Python 3.11 o superior y una API key de un proveedor de LLM; por defecto se usa OpenAI.

Instalación con uv (o pip)

git clone https://github.com/TauricResearch/TradingAgents.git
cd TradingAgents

# Python 3.11+ is required; the README's examples use 3.13
uv venv --python 3.13
source .venv/bin/activate        # Windows (PowerShell): .venv\Scripts\activate
uv pip install .                 # or plain: pip install .

cp .env.example .env             # add OPENAI_API_KEY (the default provider)

Con los valores por defecto, OPENAI_API_KEY es la única clave que necesitás. ALPHA_VANTAGE_API_KEY, FRED_API_KEY (gratis) y TYPESAFE_API_KEY (filtra posts sociales con Jev) son opcionales. SEC EDGAR no pide clave, pero configurá SEC_EDGAR_USER_AGENT con tu nombre y tu email para que la SEC te contacte a vos y no al proyecto.

Correlo desde la CLI: interactivo, o sin preguntas para un job programado

# interactive: tickers, date, provider, research depth...
tradingagents

# headless (cron / Task Scheduler): flags + TRADINGAGENTS_* variables
export TRADINGAGENTS_LLM_PROVIDER=openai TRADINGAGENTS_QUICK_THINK_LLM=gpt-6-luna TRADINGAGENTS_DEEP_THINK_LLM=gpt-6-sol
export TRADINGAGENTS_OUTPUT_LANGUAGE=English TRADINGAGENTS_MAX_DEBATE_ROUNDS=1 TRADINGAGENTS_MAX_RISK_ROUNDS=1
tradingagents --ticker NVDA --date 2026-10-23 --analysts market,news,fundamentals --save --no-show

Cada flag se salta solo su propia pregunta. Sin terminal, una respuesta faltante detiene la corrida antes de empezar y nombra el flag o la variable que falta, así que es seguro programarlo.

En Windows

La CLI interactiva necesita un búfer de consola real: ejecutala desde Windows Terminal, PowerShell o cmd.exe, no desde una terminal embebida o con pipes, o sale con exactamente ese error. Para corridas programadas, definí todos los flags y variables TRADINGAGENTS_* para que nada pregunte.

O llamalo desde Python

from tradingagents.graph.trading_graph import TradingAgentsGraph
from tradingagents.default_config import DEFAULT_CONFIG

config = DEFAULT_CONFIG.copy()
config["llm_provider"] = "openai"
config["deep_think_llm"] = "gpt-6-sol"     # Research Manager + Portfolio Manager
config["quick_think_llm"] = "gpt-6-luna"   # analysts, researchers, trader, risk debaters
config["max_debate_rounds"] = 1
config["max_risk_discuss_rounds"] = 1

ta = TradingAgentsGraph(selected_analysts=("market", "social", "news", "fundamentals"), config=config)
state, rating = ta.propagate("NVDA", "2026-10-23")
print(rating)                    # Buy / Overweight / Hold / Underweight / Sell, or REVIEW
ta.save_reports(state, "NVDA")   # Markdown + complete_report.html under results_dir

propagate() devuelve el estado final y el rating. selected_analysts acepta market, social (la clave interna del analista de Sentimiento), news y fundamentals; sacá los que no necesites.

La evaluación propia del repo: una grilla ticker × fecha

# CLI
tradingagents backtest NVDA,AAPL --start 2026-06-01 --end 2026-08-01 --every 7

# Python
from tradingagents.backtest import iter_grid, run_backtest, summarize

dates = iter_grid("2026-06-01", "2026-08-01", every_n_days=7)
result = run_backtest(["NVDA", "AAPL"], dates, config, selected_analysts=["market", "news"])
print(summarize(result).render())

Cada celda se puntúa por el alpha realizado frente al benchmark regional del instrumento (SPY para tickers de EE.UU.) durante holding_period_days, 5 por defecto, agrupado por rating. Desde la v0.7.0 una decisión entra en el primer cierre posterior a su fecha, porque una corrida lee noticias publicadas después del cierre de ese día. Te dice si los ratings apuntan en la dirección correcta. No cobra costos, no dimensiona posiciones ni compone una cartera.

4. Proveedores de Datos y Tubería Point-in-Time

Buena parte de la ingeniería reciente fue a la parte poco vistosa que decide si una corrida histórica es honesta: qué puede ver cada agente en una fecha pasada. Los valores por defecto de default_config.py:

De dónde salen los datos de los agentes

  • Precios e indicadores: yfinance por defecto; Alpha Vantage como alternativa (requiere clave).
  • Fundamentales: primero SEC EDGAR, tal como se presentó, y después Yahoo. Los activos totales de Apple en 2008 se presentaron como $39.6B y se corrigieron a $36.2B en 2010, así que una corrida fechada entre ambas lee $39.6B. Las corridas con fecha pasada no reciben estados de Yahoo ni operaciones de insiders, que no llevan fecha de presentación.
  • Noticias: yfinance, leídas desde la búsqueda de Yahoo mientras su feed de noticias está caído; Alpha Vantage opcional.
  • Sentimiento: titulares, StockTwits y Reddit. Con TYPESAFE_API_KEY, Jev descarta los posts que no tratan de la empresa.
  • Macro y mercados: FRED (clave gratuita, opcional) y los mercados de predicción de Polymarket (sin clave).
  • Universo: todo lo que cubre Yahoo Finance con sufijo de bolsa (0700.HK, 7203.T, AZN.L, RELIANCE.NS) más pares cripto como BTC-USD.

La advertencia de reproducibilidad del propio README

Dos corridas del mismo ticker y la misma fecha pueden diferir. El muestreo de los LLM no es determinista, los modelos de razonamiento son los que más varían, y fijar una fecha pasada congela la ventana de precios, pero “las fuentes sociales y de noticias siguen reflejando el ‘ahora’” (traducción mía). Bajar la temperatura solo ayuda en los modelos que la respetan. Planificá tu evaluación contando con el ruido, nunca alrededor de una sola corrida.

5. Qué Prueba el Backtest del Paper, y Qué No

El paper (v7) hace el backtest del 1 de enero al 29 de marzo de 2024. El texto menciona Apple, Nvidia, Microsoft, Meta y Google; la Tabla 1 reporta AAPL, GOOGL y AMZN frente a buy-and-hold y cuatro estrategias basadas en reglas (MACD, KDJ+RSI, ZMR y SMA). Los modelos base fueron gpt-4o-mini y gpt-4o como pensadores rápidos y o1-preview como pensador profundo. Estas son las filas de TradingAgents:

Tabla 1, TradingAgents vs. buy-and-hold (1 ene – 29 mar 2024)

  • AAPL: retorno acumulado 26.62%, Sharpe 8.21, drawdown máximo 0.91% (buy-and-hold: −5.23%)
  • GOOGL: retorno acumulado 24.36%, Sharpe 6.39, drawdown máximo 1.69% (buy-and-hold: 7.78%)
  • AMZN: retorno acumulado 23.21%, Sharpe 5.60, drawdown máximo 2.11% (buy-and-hold: 17.1%)

Hay que reconocer que los autores señalan la anomalía ellos mismos. Dicen que el Sharpe más alto “supera nuestro rango empírico esperado”, lo atribuyen a que hubo pocos retrocesos en ese período y explican que limitaron la prueba a tres meses porque cada predicción requería 11 llamadas al LLM y más de 20 llamadas a herramientas.

✅ Lo que sí muestra

  • • El pipeline funciona de punta a punta con decisiones diarias y deja un rastro de razonamiento legible detrás de cada operación
  • • En tres megacaps durante un trimestre, los retornos reportados superan a buy-and-hold y a cuatro estrategias simples basadas en reglas
  • • Sus modelos declaran un corte de conocimiento de octubre de 2023, anterior a la ventana de prueba, lo que reduce el riesgo de memorización sin eliminarlo
  • • Los autores afirman que los agentes solo usaron datos disponibles hasta cada día de trading

❌ Lo que no muestra

  • • Una ventaja real: unas 60 sesiones en 3 tickers son un solo régimen. Mi cuenta rápida (retornos IID, Lo 2002) da un error estándar de unos 2 puntos para un Sharpe anualizado con ~60 retornos diarios
  • • Que sobreviva a los costos: no encontré ninguna mención de comisiones, slippage ni fees en la v7
  • • Que generalice: no hay otros años, ni mercado bajista, ni small caps, ni intervalos de confianza o corridas repetidas de un sistema no determinista
  • • Que le gane a otros enfoques con LLM: los baselines son buy-and-hold y reglas técnicas, no un LLM de un solo agente con los mismos datos
  • • Que puedas reproducirlo: OpenAI marca o1-preview como dado de baja, y el README avisa que los resultados no tienen garantía de coincidir con ninguna cifra publicada

Fuga por datos de entrenamiento: la trampa si lo volvés a correr hoy

El primer trimestre de 2024 sí quedaba después del corte de los modelos del paper. Con los modelos por defecto de hoy la historia cambia: OpenAI declara para GPT-6 Sol un corte de conocimiento del 20 de abril de 2026 y para GPT-6 Luna del 18 de mayo de 2026. Si repetís la ventana de 2024 con ellos, los agentes pueden simplemente recordar cómo terminó ese trimestre, con datos point-in-time o sin ellos. Mi regla: solo hacer backtest de fechas posteriores al corte de todos los modelos de ambos niveles, y tratar esos cortes como aproximados. Con los valores por defecto te quedan unos cinco meses de historia, un argumento fuerte para probar hacia adelante.

La fuga por la tubería de datos es la otra mitad. Desde el paper, los mantenedores publicaron correcciones de look-ahead en cuatro versiones: filtrado de Alpha Vantage (v0.3.1), macro de FRED, sentimiento social y memory log (v0.4.0), integridad point-in-time en todas las rutas con fecha (v0.5.0) y puntuación desde el primer cierre posterior a cada decisión (v0.7.0). Es lo que hacen los buenos mantenedores, y también muestra con qué facilidad un pipeline de LLM se filtra el futuro. El paper no me permite saber qué código produjo la Tabla 1, así que leo sus números como una demo, no como evidencia.

Para evaluarlo por tu cuenta, aplicá la misma disciplina que a cualquier estrategia: datos point-in-time, splits walk-forward, costos y un Sharpe deflactado que cuente cada configuración que probaste. Lo explico paso a paso en mi tutorial de validación de backtests, y cada cambio de prompt o de modelo cuenta como un trial nuevo.

6. Cuánto Cuesta una Corrida: Llamadas, Tokens, Dólares

El costo escala con las llamadas al LLM, y el grafo permite contarlas. Según graph/setup.py y conditional_logic.py, un ticker-día queda así:

Llamadas al LLM por ticker-día, leídas del grafo de la v0.7.0

LLM calls for one ticker on one date (v0.7.0 graph)

  N =  Σ (r_a + 1)   market, news, fundamentals analysts   r_a = tool rounds used (cap: max_tool_rounds = 20)
     + 1             sentiment analyst                      fetches its sources first, no tool loop
     + 2·D           bull + bear turns                      D = max_debate_rounds (default 1)
     + 3·R           aggressive, conservative, neutral      R = max_risk_discuss_rounds (default 1)
     + 3             research manager, trader, portfolio manager
     + m             one reflection per past decision settled during the run

  defaults, one tool round per analyst: 6 + 1 + 2 + 3 + 3 = 15 calls
  deep tier = research manager + portfolio manager = 2 calls; quick tier = everything else

  cost = Σ_quick (tokens_in · 0.10 + tokens_out · 0.50) / 1M     gpt-6-luna, $ per 1M tokens
       + Σ_deep  (tokens_in · 2.00 + tokens_out · 10.00) / 1M    gpt-6-sol  (standard tier, ≤272K context)

Con los valores por defecto y una ronda de herramientas por analista llegás a 15 llamadas, y a más cuando los analistas usan rondas extra. Dos de ellas son del nivel deep. Con los precios estándar de OpenAI para los modelos por defecto del README, GPT-6 Sol cuesta $2 / $10 por millón de tokens de entrada / salida y GPT-6 Luna $0.10 / $0.50, una diferencia de 20× por token.

Un ejemplo resuelto (los tamaños en tokens son supuestos míos, no mediciones)

# ASSUMED token sizes, not measurements: replace them with your own numbers
LUNA = (0.10, 0.50)    # $ per 1M tokens, input / output (OpenAI standard tier)
SOL = (2.00, 10.00)

def cost(calls, tokens_in, tokens_out, price):
    return calls * (tokens_in * price[0] + tokens_out * price[1]) / 1e6

quick = cost(18, 8_000, 1_000, LUNA)   # 18 quick calls, 8K in / 1K out each
deep = cost(2, 20_000, 3_000, SOL)     # 2 deep calls, 20K in / 3K out (reasoning tokens bill as output)
print("quick $%.3f + deep $%.3f = $%.2f per ticker-day" % (quick, deep, quick + deep))
# quick $0.023 + deep $0.140 = $0.16 per ticker-day

Con esos supuestos, un ticker-día cuesta unos $0.16, y las dos llamadas deep son cerca del 85%. Un ticker en cada sesión durante un mes (~21 sesiones) sale unos $3.40; la grilla del paper (3 tickers × ~61 sesiones) costaría unos $30. Tus números van a moverse con el volumen de noticias, las rondas de herramientas y el esfuerzo de razonamiento, así que medilos.

Medí tu costo real con el contador de la propia CLI

from cli.stats_handler import StatsCallbackHandler   # the counter behind the CLI footer

stats = StatsCallbackHandler()
ta = TradingAgentsGraph(config=config, callbacks=[stats])
_, rating = ta.propagate("NVDA", "2026-10-23")
s = stats.get_stats()
print(rating, s["llm_calls"], s["tokens_in"], s["tokens_out"])   # both tiers summed

El pie de la CLI interactiva ya muestra llamadas al LLM, llamadas a herramientas y tokens de entrada y salida. Desde Python, pasá el mismo handler. Suma ambos niveles, así que valorá el total a precio de Sol para una cota superior y a precio de Luna para una inferior, o revisá el uso por modelo en el panel de tu proveedor.

Palancas de costo, en el orden en que yo las movería

  • Menos analistas: --analysts market,news quita dos ramas; verificá si cambian los ratings antes de quedarte con el recorte.
  • Rondas en 1: cada ronda extra de debate suma 2 llamadas quick y cada ronda extra de riesgo suma 3, y los turnos posteriores leen todo el debate previo.
  • Limitá las rondas de herramientas: TRADINGAGENTS_MAX_TOOL_ROUNDS acota a un analista desbocado (20 por defecto).
  • Un nivel deep más barato: el mayor ahorro y el más arriesgado, porque los managers toman la decisión.
  • Tu plan de ChatGPT: desde la v0.7.0 el proveedor chatgpt corre sobre un plan Plus o Pro en lugar de facturación por API; las corridas cuentan para los límites del plan y no acepta temperature ni max_tokens.

7. Cómo Enchufar un Modelo Más Barato o Local

Cambiar de modelo es un cambio de configuración. El README lista OpenAI, Google, Anthropic, xAI, DeepSeek, Qwen, GLM, MiniMax, Mistral, Kimi, Groq, NVIDIA NIM, OpenRouter, Azure OpenAI, AWS Bedrock, Ollama y cualquier servidor compatible con OpenAI.

Tres formas de abaratar o pasar a local

# A) everything local with Ollama (default endpoint http://localhost:11434/v1)
#    first: ollama pull qwen3:latest && ollama pull glm-4.7-flash:latest
config["llm_provider"] = "ollama"
config["quick_think_llm"] = "qwen3:latest"
config["deep_think_llm"] = "glm-4.7-flash:latest"

# B) quick tier local, the two managers in the cloud (a provider per tier, v0.6.0+)
config["llm_provider"] = "openai"
config["deep_think_llm"] = "gpt-6-sol"
config["quick_think_provider"] = "ollama"
config["quick_think_llm"] = "qwen3:latest"

# C) any OpenAI-compatible server: vLLM, LM Studio, llama.cpp
config["llm_provider"] = "openai_compatible"
config["backend_url"] = "http://localhost:8000/v1"   # LM Studio: http://localhost:1234/v1
config["quick_think_llm"] = config["deep_think_llm"] = "<the model your server serves>"

Las sugerencias de Ollama en la CLI son qwen3:latest (8B), gpt-oss:latest (20B) y glm-4.7-flash:latest (30B), y ‘Custom model ID’ acepta cualquier modelo que hayas descargado. Definí OLLAMA_BASE_URL para un ollama-serve remoto. Con Docker hay un perfil listo: docker compose --profile ollama run --rm tradingagents-ollama.

Modelos locales: qué revisar primero

Los analistas dependen del tool calling, y los managers y el trader de la salida estructurada. Cuando la salida estructurada falla, el código reintenta una vez en texto libre, y una decisión sin rating legible se convierte en REVIEW, nunca en un Hold silencioso. Corré una docena de fechas y contá los REVIEW y los informes vacíos antes de confiar en un modelo chico. Mi reparto por defecto: nivel quick local o en Luna, nivel deep en el modelo más fuerte que puedas pagar, porque ahí se toma la decisión.

8. Cómo lo Pondría en Paper Trading (Sugerencia Mía, No Parte del Repo)

Que quede claro: este es mi protocolo, no el del proyecto

TradingAgents no envía órdenes, y nada de esta sección sale de su documentación. Es cómo yo lo conectaría a una cuenta paper de Alpaca para reunir evidencia honesta hacia adelante: sin dinero real, con decisiones tomadas en tiempo real y reglas fijadas de antemano.

La idea es simple. Después de cada cierre, corré el grafo para un universo pequeño y fijo, traducí el rating de cinco niveles a una posición objetivo con una regla escrita antes del primer día y enviá órdenes de mercado que Alpaca encola para la sesión siguiente. Solo largos, para que la primera versión sea simple.

Un loop mínimo de paper trading con Alpaca (alpaca-py)

# My sketch, not part of TradingAgents. Run it after the close; orders queue for the next session.
import os
from alpaca.trading.client import TradingClient
from alpaca.trading.requests import MarketOrderRequest
from alpaca.trading.enums import OrderSide, TimeInForce
from tradingagents.agents.rating import is_review

UNIVERSE = ("NVDA", "AAPL", "MSFT")   # examples, not picks
SLOT = 10                             # max shares per ticker in the paper account
TARGET = {"Buy": 1.0, "Overweight": 0.5, "Underweight": 0.0, "Sell": 0.0}   # long-only; Hold = no change

client = TradingClient(os.environ["APCA_API_KEY_ID"], os.environ["APCA_API_SECRET_KEY"], paper=True)
held = {p.symbol: int(float(p.qty)) for p in client.get_all_positions()}

def rebalance(ticker, rating):
    if is_review(rating) or rating not in TARGET:    # REVIEW or Hold: leave the position alone
        return
    delta = round(TARGET[rating] * SLOT) - held.get(ticker, 0)
    if delta:
        client.submit_order(order_data=MarketOrderRequest(
            symbol=ticker,
            qty=abs(delta),
            side=OrderSide.BUY if delta > 0 else OrderSide.SELL,
            time_in_force=TimeInForce.DAY,           # after the close: queued for the next trading day
        ))

for ticker in UNIVERSE:
    _, rating = ta.propagate(ticker, "2026-10-23")   # the session that just closed
    print(ticker, rating)                            # log it next to the report path
    rebalance(ticker, rating)

El mapeo (Buy a un slot completo, Overweight a la mitad, Hold sin cambios, Underweight y Sell a cero) es una elección arbitraria mía. Lo importante es fijarlo antes de empezar y no ajustarlo nunca con los resultados del paper trading. Alpaca encola para el siguiente día hábil las órdenes DAY enviadas después del cierre.

📋 El protocolo alrededor del loop

  1. Empezá después de los cortes: operá solo fechas posteriores al corte de conocimiento de todos los modelos que uses.
  2. Congelá la configuración: IDs de modelo fijos, rondas, analistas y proveedores de datos; cada informe registra su configuración. Si cambiás un prompt o un modelo, el reloj vuelve a cero.
  3. Los baselines, por los mismos rieles: buy-and-hold de los mismos tickers y una regla tonta como un cruce de medias, con la misma lógica de órdenes.
  4. Registralo todo: rating, ruta del informe, orden y fill de cada ticker-día, incluidos los REVIEW.
  5. Juzgalo como a cualquier estrategia: meses, no semanas; neto de los fills reales; y un Sharpe deflactado sobre todas las configuraciones que probaste.

Los fills en paper son optimistas

La documentación de Alpaca dice que el paper trading no tiene en cuenta el impacto de mercado, la filtración de información, el slippage por latencia, la posición en la cola, la mejora de precio, las tasas regulatorias ni los dividendos, y las cuentas Paper Only reciben solo datos de IEX. Un buen resultado en paper es motivo para seguir probando, no para pasar a real.

9. Casos de Uso Donde Brilla

Donde creo que se gana sus estrellas:

🧪

Investigación multiagente

ablaciones

Un banco de pruebas limpio para preguntas como ‘¿el investigador bajista cambia los resultados?’ o ‘¿un modelo deep más fuerte rinde más que más rondas de debate?’, con el backtest de grilla como marcador.

📝

Memos de análisis

con humano en el loop

El informe HTML reúne técnicos, noticias, sentimiento y fundamentales tal como se presentaron en una sola página, con ambos lados argumentados. Una segunda opinión que leés, no una que obedecés.

⚖️

Evaluación de modelos

misma grilla, distintos LLM

Corré una grilla ticker × fecha idéntica con dos proveedores y compará el alpha por rating, en fechas posteriores al corte de ambos modelos.

🧩

Una feature entre muchas

stacks sistemáticos

Usá el rating como señal lenta y explicable dentro de una estrategia existente, y después valida la combinación como cualquier otra feature.

💼

Escenarios con tu cartera

PortfolioContext

Pasale tu efectivo y tus posiciones para que el trader, el equipo de riesgo y el portfolio manager razonen sobre tu cartera real y no sobre un lector genérico.

10. Cuándo NO Usarlo

Y donde yo lo mantendría lejos:

🚫 Salteátelo si…

  1. Necesitás velocidad intradía: una decisión es una cadena de llamadas secuenciales al LLM; es una herramienta de decisiones diarias.
  2. Necesitás determinismo: el propio README dice que dos corridas del mismo ticker y la misma fecha pueden diferir.
  3. Querés un piloto automático con dinero real: no hay broker, ni modelo de dimensionamiento, ni capa de ejecución, ni evidencia publicada de ventaja neta de costos.
  4. Tu backtest es anterior al corte de tu modelo: el resultado mide memoria, no habilidad.
  5. Tu universo tiene pocos datos: las corridas con fecha pasada fuera de los emisores de la SEC no reciben estados financieros, y los nombres chicos tienen pocas noticias o conversación que leer.
  6. No podés pagar una evaluación seria: una prueba con sentido necesita cientos de ticker-días; si ese presupuesto duele, el experimento es demasiado chico para concluir nada.

Mi regla

Usá TradingAgents para pensar mejor, no para operar en automático. Cada rating es una hipótesis con un informe excelente; se convierte en estrategia solo cuando la evidencia hacia adelante, neta de costos, le gana a un baseline tonto.

Conclusión

TradingAgents es una de las mejores referencias open source que conozco para estructurar agentes LLM como una mesa de trading, y la v0.7.0 se toma los datos point-in-time mucho más en serio que la mayoría de los proyectos de este espacio. Vale la pena estudiar la arquitectura aunque nunca operes su salida.

Los retornos son otra historia. El trimestre del paper es una demo, los modelos por defecto de hoy ya vieron ese trimestre y la evaluación propia del repo puntúa la dirección sin costos. Si lo probás, correlo hacia adelante en paper después de los cortes, medí tu costo real por ticker-día y exigile lo mismo que a cualquier otro bot.

Si vas a construir el bot alrededor, empezá por mi guía para construir bots de trading para la parte de ejecución y riesgo que un rating todavía necesita.

Resumen de TradingAgents

Arquitectura

  • • 4 analistas en paralelo
  • • alcista/bajista → research manager
  • • trader → riesgo → rating

Cómo correrlo

  • • Python 3.11+, pip install .
  • • --ticker / --date para cron
  • • ≥15 llamadas por ticker-día

Cómo validarlo

  • • fechas tras el corte de cada modelo
  • • paper trading hacia adelante, neto de fills
  • • baselines + Sharpe deflactado

Fuentes

Diego Rodriguez

Diego Rodriguez

Ingeniero Senior Full-Stack & AI

Diego tiene mas de 9 anos de experiencia construyendo aplicaciones potenciadas por IA de produccion, desde orquestacion de LLMs y pipelines RAG hasta deteccion de riesgos con ML y sistemas de trading algoritmico.

Conoce mas sobre Diego →