TradingAgents by Tauric Research: A Trading Firm of 12 LLM Agents, and What One Decision Costs Tauric Research released TradingAgents, an open-source Python framework built on LangGraph that runs a stock analysis through 12 specialized LLM agents—four analysts, bull and bear researchers, a trader, three risk analysts and a portfolio manager—returning a five-level rating from Buy to Sell. Version 0.7.0, licensed Apache 2.0, includes no broker integration or order-placement code, and the project's README states it is intended for research rather than as financial advice. Counting calls from the code, the team found a single decision with all four analysts makes at least 15 model calls under default settings, split between a quick and a deep model tier that can each run on separate providers. TradingAgents is a free, open-source Python framework from Tauric Research that analyzes a stock the way a trading firm would, with a team of language-model agents instead of one prompt. Four analysts study the market, sentiment, news and fundamentals; a bull and a bear argue over their reports; a trader turns the result into a plan; three risk analysts argue over that plan; and a portfolio manager makes the call. You give it a ticker and a date, and it returns a rating and a folder of reports. It had 115,371 GitHub stars and more than 22,000 forks when we wrote this, and one sentence in the README matters more than the rest: the framework is designed for research purposes and is not intended as financial, investment or trading advice. The project began as a research paper, "TradingAgents: Multi-Agents LLM Financial Trading Framework" by Yijia Xiao, Edward Sun, Di Luo and Wei Wang, first posted to arXiv on 28 December 2024, the same day the repository was created. It is built on LangGraph, licensed under Apache 2.0, and the current release is version 0.7.0, from 16 October 2026. Version 0.7.0 contains no broker integration and no code that places orders: a run ends with a rating and its reasoning, and what you do with them is up to you. That makes it a tool for studying how multi-agent LLM systems reason about markets, not a bot that trades for you, and this post treats it that way. Every role in TradingAgents is a separate agent with its own prompt, and most of them have their own data. The analysts run at the same time, and the debate starts once all four reports are in. | Role | What it does | Model tier | |---|---|---| | Market Analyst | Prices and up to 8 technical indicators moving averages, MACD, RSI, Bollinger Bands, ATR, VWMA , checked against a verified price snapshot | Quick | | Sentiment Analyst | Yahoo Finance headlines, StockTwits messages and Reddit posts, scored as one sentiment band | Quick | | News Analyst | Company news, global macro headlines, FRED economic data and Polymarket prediction markets | Quick | | Fundamentals Analyst | Balance sheet, cash flow, income statement, company overview and insider transactions | Quick | | Bull and Bear Researchers | Argue for and against the trade from the four reports | Quick | | Research Manager | Judges the debate and writes the investment plan | Deep | | Trader | Turns the plan into a buy, hold or sell proposal | Quick | | Aggressive, Conservative and Neutral Analysts | Argue over the trader's proposal from three risk appetites | Quick | | Portfolio Manager | Makes the final decision on a five-step scale | Deep | The two tiers are the main cost control. You choose a quick model and a deep model, and each can run on its own provider, so the managers could run on Claude while everything else runs on a cheaper OpenAI model. The defaults are OpenAI's GPT-6 Luna for the quick tier and GPT-6 Sol for the deep one. The final answer is one of five ratings: Buy, Overweight, Hold, Underweight or Sell. When the portfolio manager's output contains no readable rating, the code records REVIEW instead of quietly treating it as a Hold, because a decision nobody can read is not a decision to hold. Nothing in the README says how many times a run calls a language model, and that number is what you pay for. So we counted it from the code: the graph's routing in conditional logic.py , the analyst loop in analysts/turn.py , the default settings in default config.py , and the project's own end-to-end test, which runs the whole graph offline with a scripted model. We read version 0.7.0 commit e8f5503 and did not pay for a live run, so this is a count of calls, not a bill. With the default settings and all four analysts, one decision makes at least 15 model calls: | Step | Calls at minimum | Tier | |---|---|---| | Market, news and fundamentals analysts | 2 each: one round of tool calls, then the report | Quick | | Sentiment analyst | 1, because its data is fetched before the model is called | Quick | | Bull and bear researchers | 2, one debate round each | Quick | | Research manager | 1 | Deep | | Trader | 1 | Quick | | Three risk analysts | 3, one risk round each | Quick | | Portfolio manager | 1 | Deep | | Total | 15 | 13 quick, 2 deep | The project's test agrees. It deliberately breaks the provider on the 12th call and describes that point as "past the analysts, before the decision", which is exactly where the count puts it: 7 analyst calls, then the bull, the bear, the research manager and the trader, so the 12th call is the first risk analyst. Three things push a real run above 15: Two conclusions follow. The quick model carries 13 of the 15 calls, so it decides most of the cost, and the deep model is called only twice. And backtests multiply: the README's example grid, two tickers every 7 days from 1 June to 1 August with only the market and news analysts, is 18 decisions and at least 216 model calls before the reflections. The debates are what make TradingAgents different from asking one model for an opinion, and they are fully configurable. The bull and bear take turns until each has spoken max debate rounds times, then the research manager writes a plan from the transcript. The aggressive, conservative and neutral analysts do the same for max risk discuss rounds rounds before the portfolio manager decides. Both default to 1. More rounds give the agents more chances to answer each other, at a cost of 2 calls per extra debate round and 3 per extra risk round. The same settings are available as environment variables for the CLI: TRADINGAGENTS MAX DEBATE ROUNDS and TRADINGAGENTS MAX RISK ROUNDS . You can also pass in what you already hold. Without a portfolio, the agents write guidance for a reader who applies it to their own position; with one, the trader, the risk analysts and the portfolio manager work against your actual cash and positions. The CLI takes it as a JSON file tradingagents --portfolio my book.json and refuses to start when the file does not validate. A backtest is only honest if each run sees what was public on its date. Most of TradingAgents' recent releases are about exactly that, and the README is specific about how each source behaves. Fundamentals are read as filed. US company statements come from SEC EDGAR, which records the date every figure was filed, so a run dated in the past reads the statements as they stood that day. The README's example is Apple's total assets for fiscal 2008, filed as $39.6 billion and restated to $36.2 billion in 2010. We checked it against EDGAR's public API: the figure for the period ending 27 September 2008 appears as $39.572 billion in the 10-K filed on 27 October 2009, and as $36.171 billion in the amended 10-K filed on 25 January 2010. A run dated between those two filings reads the first number. Other sources hold back what they cannot date. Yahoo Finance dates a statement by the period it covers rather than by when it was published, so a run dated in the past is told those statements are withheld. Insider trades are dated by when they happened, not when they were filed, so they are withheld for past dates too. News articles published after the analysis date are filtered out, and the project keeps regression tests for the ways that filter has leaked in the past. Social sentiment is the exception. The sentiment analyst trims StockTwits and Reddit posts to the seven days before the analysis date, so nothing from after it leaks in. The problem is the other direction. Its code says these feeds "serve recent items and are not archived, so a historical run's sentiment inputs are not point-in-time." A run dated months back finds little or nothing in its window, and the feed tells the model the window was never observed rather than reporting that nobody posted. That is presumably why the README's backtest example selects only the market and news analysts, and it is the setting to copy: leave the sentiment analyst out of anything you backtest. TradingAgents keeps a memory log of its own decisions at ~/.tradingagents/memory/trading memory.md . While the analysts of a later run work, it settles every logged decision whose holding period has passed: it fetches the realized return, and the alpha against the market's benchmark SPY for US tickers, regional indexes such as the Nikkei 225 or Nifty 50 elsewhere , then writes a short reflection. The portfolio manager reads recent decisions on the same ticker, plus recent lessons from others, before it decides. The holding period is 5 trading days, counted from the first close after the analysis date. Version 0.7.0 moved it from the close of the analysis date itself, because a run reads news published after that day's close and could not have traded on the earlier price. To judge whether the system decides well rather than reading one run, run backtest sweeps a grid of tickers and dates into a memory log of its own and scores each settled decision on realized alpha, grouped by rating. An interrupted sweep resumes with the same run id , skipping the cells that already ran. Each run also writes its full state to full states log