tradingdesk

API Endpoint
Leaderboard
Loading leaderboard...
README

TradingDesk

⭐ OpenReward Environment

Description

TradingDesk is a day-stepping portfolio management environment over real 2025–26 US equity markets. The agent starts with $1,000,000 in cash and manages a long-only portfolio through a window of real trading days: each day it can research via backdated web, news, and SEC search whose visibility cutoff advances with the simulation clock, pull point-in-time price history through an environment-controlled market-data tool, stage target portfolio weights, and advance the simulation — which executes the rebalance at the next day's open with transaction costs and slippage, and marks the portfolio at the close. The terminal reward is the annualized Sharpe ratio of the realized daily net returns in excess of the T-bill rate, which idle cash also earns.

Capabilities

  • Quantitative strategy development and backtesting from decades of daily price history
  • Fundamental and news-driven research under a strict point-in-time information boundary
  • Portfolio construction, sizing, and rebalancing under transaction costs
  • Long-horizon multi-turn execution (a full episode spans 63–229 simulated trading days)

Compute Requirements

Agents are given a sandbox with 1 CPU and 2 GB of RAM. Network egress from the sandbox is blocked; all market data and research flows through environment tools.

License

MIT.

Tasks

There are two splits:

  • train (54 tasks with the current bundle): staggered windows of 63, 84, 105, or 126 trading days (roughly three to six months), with start dates on the first trading day on or after the 1st and 15th of each month from December 2025 onward, keeping every window that fits before the bundle's last bar. Task ids encode the shape, e.g. w84-2026-01-02.
  • test (1 task): full-2025-12-01, the complete period from 2025-12-01 to the bundle's last bar (currently 2026-10-28, 229 trading days).

The window end is not a constant: it is the last bar in the price bundle, so the environment extends only when someone deliberately rebuilds and re-uploads the bundle (datagen/refresh.sh, run by hand; nothing is scheduled). Train windows are only ever appended (ids are keyed by start date, so existing tasks never change), and the test task keeps its id while its window lengthens. TRADINGDESK_WINDOW_END=YYYY-MM-DD pins the end to reproduce an earlier task list.

Every task starts the agent with $1,000,000 in cash. The trading window sits inside the backdated web corpus's coverage and past most current models' knowledge of realized market outcomes; staggered overlapping windows reduce the value of memorizing any single path. The window end runs close to the corpus's rolling crawl edge (at the 2026-10-28 build, search hits reached 2026-10-25 for news, 2026-10-23 for SEC filings and 2026-10-22 for the live web), so the final simulated days of the latest windows research a thinner archive than earlier days.

Reward Structure

This is a sparse, terminal, fully deterministic reward — no LLM graders. Intermediate tool calls all return reward 0.0. When the agent advances past the final day of the window, the environment computes the annualized Sharpe ratio of the daily net excess returns over every trading day of the window, where the excess return on day tt is the portfolio's return minus the realized daily return of BIL (the 1–3 month Treasury bill ETF, taken from the same price bundle):

reward=clip⁡(r−rf‾σr−rf252, −20, +20)\text{reward} = \operatorname{clip}\left(\frac{\overline{r - r_f}}{\sigma_{r - r_f}}\sqrt{252},\ -20,\ +20\right)

Idle cash accrues the same T-bill rate (a cash sweep), so sitting in cash is a zero-variance excess series and scores exactly 0.0, and buying BIL reproduces cash minus the entry cost (strictly negative). Measuring excess return matters: with a risk-free rate of 0 an all-BIL portfolio (≈3.6% carry, ≈0.2% volatility) would score a Sharpe of 14–22 in every window, a degenerate optimum that required no research; the excess formulation removes it, so the score rewards risk-adjusted return above cash rather than carry.

The ±20 clamp sits well above the excess Sharpe any foresight-free portfolio reaches on these windows: across the train windows of the current bundle, no buy-and-hold of a single universe ticker exceeds about 8 in absolute value (close-to-close, before costs), and a 100% SPY hold peaks at about 3.9. Single names still reach 5–8 on 63-day windows (one 63-day standard error is ≈2.0), so a tighter clamp would tie honest portfolios with very different outcomes at the bound.

Guards: a zero-variance excess series scores exactly 0.0; non-finite portfolio states terminate the episode immediately with reward 0.0. Long-only weights with post-cost feasibility scaling mean wealth can never go negative. Execution charges 5 bps commission + 10 bps slippage (15 bps total) on turnover at each rebalance, so the reward is net of realistic frictions. The terminal output reports the portfolio's total return, the T-bill return over the same window, and the daily T-bill series used, so the score can be recomputed offline.

Data

Daily OHLCV bars for 535 tickers — the S&P 500 membership as of 2025-11-30 (reconstructed from a pinned pre-window Wikipedia revision, so index additions inside the window don't leak) plus 40 liquid ETFs — sourced from Yahoo Finance at build time and stored on the OpenReward platform. Each ticker carries its full available history (back to 1962 for the oldest names) through the bundle's last bar (2026-10-28 at the time of writing). Names that stop trading inside the window (delistings and acquisitions, e.g. AVB and EQR in August 2026, and WBD, cash-acquired by Paramount Skydance after its 2026-10-05 session, whose bundled history ends at 2026-09-29 because Yahoo stopped serving it before the next refresh) stay in the universe with their history ending at their last bar, carried forward from the previous bundle when Yahoo drops them; the environment force-liquidates such positions at that close. Renamed tickers keep their 2025-11-30 symbol (PSKY, which became SKYD on 2026-10-06, is fetched under its new symbol). Each refresh is gated by datagen/verify_bundle.py, which rejects a bundle that loses tickers or history.

Prices are dividend/split-adjusted total-return series rebased to 100.0 at the start of each ticker's history. Rebasing is a leak defense, not a cosmetic choice: adjusted price levels anchored to the download date encode corporate actions from later in the trading window, and dividing a news-quoted nominal price by the adjusted level would reveal them; rebased levels cancel that future-dependent factor, so served ratios depend only on past events.

The agent-facing market-data tool serves history strictly up to the previous trading day's close, enforced by a serve-time filter plus a hard leak assertion on every payload. The environment's own copy of the window (used for fills and marking) never enters the sandbox.

Tools

Agents are given 15 tools:

  • get_market_data: point-in-time daily OHLCV for universe tickers, with a save_to option that writes the CSV into the sandbox for analysis.
  • set_allocation: stage full target portfolio weights (long-only, sum ≤ 1.0, remainder cash; omitted holdings are sold).
  • advance_day: execute the staged rebalance at the next open, mark each day's close, advance the clock 1–10 days; ends the episode with the Sharpe reward after the final day.
  • view_portfolio: cash, holdings, value, running performance, days remaining.
  • web_search / web_fetch: backdated search and fetch over the full OpenReward backdated corpus — news (cc_news), SEC filings (cc_sec), archived general web (cc_web), live web crawls (cc_web_live), monthly Wikipedia snapshots (cc_wiki) and arXiv (cc_arxiv) — cutoff-bounded to the day before the current simulation date and advancing automatically with the clock. Every corpus gates on capture date for both search and fetch, so widening the corpus adds no lookahead; allowed_domains narrows a search to one source (e.g. sec.gov).
  • The standard 9 CLI tools (bash, glob, grep, ls, read, write, edit, multi_edit, todo_write) in a network-blocked sandbox rooted at /workspace.

Time Horizon

Episodes are long-horizon: one advance_day call per trading day at minimum, so a 63-day train task needs at least ~65 tool calls plus research, a 126-day task 128+, and the 229-day test task 231+. A scripted baseline (60/40 SPY/TLT, weekly rebalance, advancing one day at a time) completes a 63-day train task in 78 tool calls, an 84-day task in 103, a 105-day task in 128, a 126-day task in 154, and the current full test window in 277; the test task grows whenever the bundle is extended, so training configurations should budget turn limits with headroom.

Environment Difficulty

The reward is a net-of-costs Sharpe ratio against real markets, so the natural reference points are passive baselines: the scripted 60/40 SPY/TLT weekly-rebalance baseline scores -1.24 on w63-2026-01-02, -0.19 on w84-2026-07-01, -0.25 on w105-2026-06-01, 1.02 on w126-2025-12-01, 0.46 on w126-2026-04-15, and 0.390 on the full test window through 2026-10-28. Sitting in cash scores exactly 0; all-in on SPY scores -1.40 on w63-2026-01-02 and 1.71 on w126-2026-04-15, and all-in on BIL -2.00 and -1.41 on those two windows (cash minus the entry cost). Beating cash consistently requires using the research tools and price history to time and select exposures that earn more than T-bills per unit of risk, while controlling turnover costs; over this period rates were high and duration lost money, so the passive reference points are modest.

Other Environment Requirements

No external API keys are required.

Safety

The agent interacts with a frozen historical market through portfolio weights; it cannot move prices, interact with counterparties, or affect anything outside the simulation. As with other wealth-maximisation environments, multi-environment training runs should pair TradingDesk with environments that teach broader objectives and ethical norms so agents do not overgeneralize the maximise-risk-adjusted-wealth objective.

Citations

@dataset{GRTradingDesk,
  author    = {General Reasoning Inc. Team},
  title     = {TradingDesk},
  year      = {2026},
  publisher = {OpenReward},
  url       = {https://openreward.ai/GeneralReasoning/TradingDesk}
}
GeneralReasoning/tradingdesk | OpenReward