Model decision

source: portfolio/<model_id> → tradeHistory[]

cadence: One record per BUY / SELL / HOLD the model emitted, every decision day

The core longitudinal record: what the model decided, at what price, and its written rationale at the time. HOLD records carry the same reasoning fields as trades, so the dataset captures decisions not to act as well as actions.

FieldTypeDescription
seasoninteger1 or 2. Added on export.
model_idstringStable internal model id, e.g. s2-anthropic-claude, gpt-trend-navigator. Added on export.
model_namestringDisplay name at time of export, e.g. "Anthropic Claude Sonnet 4.6". Added on export.
providerstringopenai · anthropic · xai · google. Added on export.
typeenumBUY, SELL or HOLD.
symbolstringTicker the decision concerns (S&P 500 universe).
sharesnumberShares traded. 0 for HOLD and for BUYs the model flagged but could not fund.
pricenumberPrice the decision was evaluated / filled at (USD).
timestampISO 8601When the decision was recorded (UTC).
totalValuenumbershares × price (USD).
cashEffectnumberSigned cash impact of a BUY (negative) or SELL (positive). Not present on HOLD.
currentPricenumberPrice observed for a HOLD. Not present on BUY / SELL in Season 2.
reasontextThe model’s full written rationale for this decision: cited metrics, thesis, risks, triggers. Typically 300–1,500 characters.
analysistextOne-line summary of the decision written by the model.
contextual_memorytextNotes the model wrote for its future self (what to watch, when to re-enter, conditions to reassess). Often empty in Season 1.
descriptiontextMechanical summary, e.g. "Sold 102 ANET at 162.2".

Portfolio state

source: portfolio/<model_id> (top level)

cadence: One document per model, updated every trading day; performanceHistory is the daily value series

The state each decision was made against and what it produced: holdings with cost basis, a daily total-value series from the model’s first day, the decision latency series (Season 2), and the model’s configuration.

FieldTypeDescription
modelInfo.id / name / descriptionobjectModel identity and, for Season 1, the strategy brief it was given; for Season 2, the shared-prompt note.
modelInfo.strategystringSeason 1: the model-specific strategy. Season 2: "Shared financial-reasoning prompt; the model is the only variable".
modelInfo.inceptiondateFirst day of the portfolio.
modelInfo.initialCapitalnumber100000 for every model.
holdings[]arrayCurrent positions: symbol, shares, currentPrice, averageCost, sector, industry. Cash is the $CASH row.
performanceHistory[]array{ date, value }: total portfolio value at the end of each day. This is the outcome series a decision can be joined to.
latencyHistory[]array{ date, seconds }: wall-clock time the model took to produce that day’s decisions. Season 2 only.
recentActions[]arrayThe last few decision records (same shape as Model decision).
currentValuenumberLatest total value (USD).
LastTradeDaydateLast day the model traded.

Daily leaderboard snapshot

source: leaderboards/<YYYY-MM-DD>-leaderboardData.json

cadence: One document per day the leaderboard was updated

Cross-model standings as they were on each day: portfolio value, gains, trade counts and last activity. Useful for reconstructing what rank a model held when it made a given decision (the models were told their rank).

FieldTypeDescription
snapshot_datedateDate of the snapshot. Added on export.
seasonstringseason-1 / season-2. Present from Season 2 on.
lastUpdatedISO 8601When the snapshot was written.
models[].modelIdstringModel id. Present from Season 2 on; Season 1 rows carry modelName only.
models[].modelNamestringDisplay name at the time.
models[].portfolioValuenumberTotal value (USD).
models[].dayGainPercentnumberDay-over-day change (%).
models[].totalGainPercent / totalGainDollarsnumberChange since inception.
models[].totalTradesnumberCumulative decision count.
models[].recentActivityenumBUY / SELL / HOLD: the most recent decision type.

Judge evaluation

source: marketdata/assessments/<as_of_date>-<model_id>-assessment.json

cadence: Season 1: monthly per model, single judge. Season 2: every trading day per model, anonymized three-judge panel

An LLM-as-judge audit of the model’s whole decision horizon up to as_of_date: headline scores, eleven rubric dimensions, a claim ledger checking the model’s stated facts against the market snapshot, and structured analyses of strategy fit, risk and process. Season 2 documents include each judge’s independent scores and their agreement.

FieldTypeDescription
score_versionstringRubric version, e.g. grounded_financial_reasoning_judge_v0.4.
model_id / model_namestringModel evaluated.
as_of_datedateHorizon end for this evaluation.
decision_timestamp / market_snapshot_timestampstringLast decision judged and the market snapshot the claims were checked against.
lookahead_checkobject{ passed, issue }: whether the judge confirmed no post-decision data leaked into the assessment.
sample_size_statusenumHow many decisions the score rests on (e.g. strong).
scores.reasoning_quality_score_0_100numberQuality of the reasoning.
scores.evidence_grounding_score_0_100numberHow well claims were supported by the data the model had.
scores.outcome_score_0_100numberRealized outcomes of the decisions.
scores.data_reliability_score_0_100numberReliability of the data the model cited.
scores.final_financial_reasoning_score_0_100numberHeadline reasoning score (panel median in Season 2).
scores.median_reasoning_secondsnumberMedian decision latency over the horizon. Season 2 only.
scores.reasoning_efficiency_score_0_100numberReasoning quality per second of thinking. Season 2 only.
scores.composite_index_0_100number90% reasoning + 10% efficiency; the site’s Total Score. Season 2 only.
dimension_scores.*number ×11action_rationale_alignment, thesis_quality, strategy_fit, risk_awareness, portfolio_discipline, temporal_consistency, decision_update_quality, uncertainty_discipline, claim_grounding, metric_correctness, data_consistency.
claim_ledger[]array{ claim, symbol, claim_type, support_status, market_data_used[], judge_note }: individual factual claims the model made, and whether the data supported them.
strategy_fit_analysisobjectdeclared_strategy, evidence_used_by_model[], evidence_expected_for_strategy[], fit_label, notes.
risk_analysisobjectrisks_identified_by_model[], risks_visible_in_market_data_but_ignored[], concentration_or_sizing_risks[], risk_score_note.
portfolio_process_analysisobjectcash_discipline, position_sizing, thesis_continuity, update_quality (free text).
major_strengths[] / major_weaknesses[]arrayJudge’s bullet findings.
data_quality_flags[] / missing_instrumentation[]arrayCaveats about the record the judge was given.
public_summaryobjectone_sentence, badge, best_supported_claim, weakest_claim, most_important_risk_ignored, what_would_improve_score[].
panelobjectSeason 2 only. method, anonymized, num_judges, judges[] (judge_id, provider, model, family, scores, badge), agreement (composite min / median / max / range / stdev).
decision_summaryobjecttotal_decisions, trading_days, by_type, first_decision_date, last_decision_date over the horizon.
judged_atISO 8601When the evaluation was produced.

Evaluation time series

source: marketdata/assessments/<season>-timeseries.json

cadence: One document per season, one point per model per as_of_date

Compact per-model series of headline and dimension scores over time, for plotting drift, learning or degradation without loading every full evaluation.

FieldTypeDescription
season / score_version / generated_atstringSeries metadata.
as_of_dates[]arrayEvery evaluation date in the season.
models.<id>.model_namestringDisplay name.
models.<id>.series[]array{ date, decisions, scores{…}, dimension_scores{…}, badge } per as_of_date.

Not included

  • The daily AI market analyses published on the site (market-analysis pages). They are site content, not part of the dataset.
  • Vendor market-data snapshots (daily quotes, fundamentals, news feeds) that the models were shown. AIStockChallenge is not licensed to redistribute them. Prices at decision time and the metrics a model cited survive in the AIStockChallenge-generated records (decision price, judge claim ledger market_data_used).
  • Raw prompts and provider API payloads. The shared Season 2 prompt is documented on the methodology page.

record shapes verified against live storage · counts as of 2026-09-14