Can an AI Trading Track Record Be Verified?
What would make a public AI trading track record verifiable? The six receipts a reader can demand, and why one live quarter of results proves nothing.
An AI trading track record is verifiable when a stranger can rebuild it from records that existed before the outcomes did. Very little published online clears that bar. What follows is the checklist a reader can apply in about two minutes, with market data behind four of the items: the benchmark, the timestamps, the trading costs, and the sample length.
What makes an AI trading track record verifiable?
Six properties. Each one is something you can look for rather than a judgment call.
- Entries published before the outcome is known. The timestamp has to sit somewhere the author cannot rewrite, such as a commit pushed at the time or a broker statement. A file listing past trades is a claim about the past rather than a record of it.
- One benchmark, named at the start and never changed. "Beat the market" means nothing until the comparison is pinned to a specific fund over a specific window.
- Costs inside the reported numbers. Commissions, regulatory fees, borrow on short positions, and the spread paid on both entry and exit.
- A runbook that is versioned rather than edited. When a public repository backs the record, the useful link points at a tagged release or a commit hash. A link to the default branch shows today's strategy, which may not be the strategy that traded in March.
- Every position and every account, losers included. One published account out of five running is a selection.
- Starting capital big enough for the fills to be plausible. A few hundred dollars of notional can "hold" positions no real order would fill at the printed price.
A record missing one of these is not dishonest by default. It is unverifiable, which is more common and equally useless to the reader.
Why the benchmark has to be named in advance
A benchmark chosen after the results are in is the cheapest edge in finance. Six broad US index funds, the same six months of 2026, price change only:
The exact SQL behind every number
WITH rets AS (
SELECT ticker,
round(100 * (toFloat64(argMax(close, window_start))
/ toFloat64(argMin(close, window_start)) - 1), 2) AS return_pct
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY', 'QQQ', 'IWM', 'DIA', 'RSP', 'MDY')
AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2026-01-02')
AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-06-30')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY ticker
)
SELECT ticker,
return_pct,
round(return_pct - min(return_pct) OVER (), 2) AS points_above_worst
FROM rets
ORDER BY return_pct DESCIWM returned 21.12% and DIA returned 8.42%, leaving 12.7 points between the top and the bottom of the 6 over an identical window. Picking which one to measure against after the window closes is worth that whole gap, and no strategy has to do anything to collect it. These are price returns before dividends, a second measurement rule worth stating up front (how monthly returns are measured covers the total-return arithmetic).
Why the entry timestamp is the whole claim
An entry that appears after the move is a description of a chart. The distance a market covers inside one session is wide enough that the difference between "posted at 09:35" and "posted at 15:55" swamps most claimed edges. Here is that distance, measured from each session's first print, across the first half of 2026:
The exact SQL behind every number
WITH minute_px AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS session_date,
toTimeZone(window_start, 'America/New_York') AS et,
toFloat64(close) AS px
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2026-01-02')
AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-06-30')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
),
opens AS (
SELECT session_date, argMin(px, et) AS open_px
FROM minute_px
GROUP BY session_date
),
buckets AS (
SELECT session_date,
toStartOfInterval(et, INTERVAL 30 MINUTE) AS bucket,
argMax(px, et) AS bucket_px
FROM minute_px
GROUP BY session_date, bucket
)
SELECT formatDateTime(b.bucket, '%H:%i') AS et_time,
count() AS session_count,
round(quantileDeterministic(0.5)(abs(100 * (b.bucket_px / o.open_px - 1)),
cityHash64(b.session_date)), 3) AS median_abs_move_pct
FROM buckets AS b
INNER JOIN opens AS o ON b.session_date = o.session_date
GROUP BY et_time
ORDER BY et_timeIn the 09:30 ET bucket the median session ended 0.216% away from its opening print. In the 15:30 bucket the median distance was 0.415%. Anything an agent knew at the open excludes almost all of that travel. A commit history or a dated public feed carries the proof of ordering (AI daily market research reports live or die on the same property). A screenshot of an equity curve carries none of it.
What has to be inside the numbers
Gross returns describe a portfolio nobody could have held. Every entry and exit crosses the bid-ask spread, the gap between the best price to buy and the best price to sell, and that gap is not the same on every name:
The exact SQL behind every number
SELECT ticker,
round(quantileDeterministic(0.5)(20000 * (toFloat64(ask_price) - toFloat64(bid_price))
/ (toFloat64(ask_price) + toFloat64(bid_price)),
cityHash64(sip_timestamp)), 2) AS median_spread_bps,
round(25000 * quantileDeterministic(0.5)(2 * (toFloat64(ask_price) - toFloat64(bid_price))
/ (toFloat64(ask_price) + toFloat64(bid_price)),
cityHash64(sip_timestamp)), 2) AS round_trip_cost_per_25k_usd
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'AAPL', 'MSFT', 'NVDA', 'KO', 'MSTR')
AND sip_timestamp >= toDateTime('2026-07-15 15:00:00')
AND sip_timestamp < toDateTime('2026-07-15 16:00:00')
AND bid_price > 1
AND ask_price > bid_price
GROUP BY ticker
ORDER BY median_spread_bps DESCAcross that one midday hour, the median quoted spread ran 10.08 basis points on MSTR against 0.27 on SPY. A basis point is one hundredth of a percentage point. On a $25,000 position, crossing that spread once in each direction costs $25.2 at the wide end of this list and $0.66 at the tight end, before commissions. A book that turns over fully once a week pays that toll about fifty times a year, and a record that omits it has quietly credited those dollars to itself (what it costs to trade a stock breaks down the rest of the bill).
How long before live results mean anything?
A quarter of live trading is one draw from a wide distribution, and the width is measurable. Every overlapping window of a given length since January 2015 for SPY, the largest S&P 500 tracking fund, sorted into percentiles:
The exact SQL behind every number
WITH daily AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS session_date,
toFloat64(argMax(close, window_start)) AS close_px
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2015-01-02')
AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-06-30')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY session_date
),
series AS (
SELECT groupArray(close_px) AS px
FROM (SELECT close_px FROM daily ORDER BY session_date)
),
horizons AS (
SELECT arrayJoin([21, 63, 126, 252]) AS sessions, px
FROM series
),
windows AS (
SELECT sessions,
arrayJoin(arrayMap(i -> (i, 100 * (px[i + sessions] / px[i] - 1)),
range(1, length(px) - sessions + 1))) AS w
FROM horizons
),
measured AS (
SELECT sessions,
w.1 AS window_index,
w.2 AS window_return_pct
FROM windows
)
SELECT multiIf(sessions = 21, '1 month',
sessions = 63, '3 months',
sessions = 126, '6 months',
'12 months') AS holding_period,
count() AS window_count,
round(quantileDeterministic(0.05)(window_return_pct,
cityHash64(window_index * 1000 + sessions)), 1) AS p05_return_pct,
round(quantileDeterministic(0.50)(window_return_pct,
cityHash64(window_index * 1000 + sessions)), 1) AS median_return_pct,
round(quantileDeterministic(0.95)(window_return_pct,
cityHash64(window_index * 1000 + sessions)), 1) AS p95_return_pct,
round(quantileDeterministic(0.95)(window_return_pct,
cityHash64(window_index * 1000 + sessions))
- quantileDeterministic(0.05)(window_return_pct,
cityHash64(window_index * 1000 + sessions)), 1) AS spread_pct,
round(stddevSamp(window_return_pct), 1) AS stdev_pct
FROM measured
GROUP BY sessions
ORDER BY sessionsAcross 2826 overlapping three-month windows, the median outcome from holding and doing nothing was 3.9%, with the 5th percentile at -8.8% and the 95th at 12.2%, a band 21.1 points wide. Any single quarterly result inside that band is consistent with owning the index and going on holiday. Launch twenty agents, run them for a quarter, publish the best one, and the number on display comes from the top of a band like that by construction.
The arithmetic on sample length is unforgiving. Twelve-month outcomes in the same series carry a standard deviation of 13.6 points. Telling a real edge apart from noise takes roughly (2 × variation ÷ edge)² years of live results. At that level of variation, a hypothetical 3-point-a-year edge needs many decades, and even a 10-point edge needs years rather than months. The windows above overlap, so 2826 counts windows, not independent samples.
Does $25,000 of real money settle it?
Real money upgrades the evidence in one specific way. Paper trading fills at prices no counterparty agreed to and never has an order rejected. A funded $25,000 account fills against live quotes and pays real commissions, on statements a third party can audit, and the position sizes are big enough that the fills are ordinary rather than imaginary.
It leaves the sample problem untouched. Twenty-five thousand dollars traded for four months is still one draw from the distribution above, and a live account can be closed after a drawdown and reopened with the record starting fresh. Size makes the fills honest. Only time makes the results informative.
Four failure modes to recognize
- A backtest wearing a track record's clothes. Simulated results over past data are hypotheses about the past. Look-ahead bias shows how a simulation absorbs information the strategy could not have had at the time, and the plainest tell is an equity curve that starts years before the code did.
- Only the survivor on stage. Ten agents launched, one published. Multi-agent AI trading systems make this easy to do by accident, since the framework that runs ten variants also picks the one worth writing about.
- The restart. A drawdown, a pause, a fresh account, a curve that begins on the restart date. The question that settles it: show the equity curve from the first dollar of the first account.
- The rewritten runbook. Prompts and position limits edited between the trade and the writeup. LLM-generated alpha factors can be produced by the thousand, so the selection rule has to be published before the selection, or the record becomes a story about which factors happened to work.
FAQ
Can an AI trading track record be verified?
Yes, when the entries were published before their outcomes were known, the benchmark was fixed in advance, costs sit inside the numbers, and every account is shown. The check is mechanical and takes minutes. Most published records fail on the first item.
How long does a live AI trading record have to run?
Longer than almost any published record. Twelve-month outcomes for the index carried a standard deviation of 13.6 points over the windows measured here, so separating a modest edge from luck at conventional confidence takes years at minimum and decades for a small one.
Is $25,000 enough to make an AI portfolio's results meaningful?
It is enough to make the fills real: live quotes, real commissions, auditable statements. It is not enough to make a few months of results statistically meaningful, which is a question of elapsed time rather than account size.
What is the difference between a backtest and a track record?
A backtest applies rules to data that already exists. A track record is a series of decisions published before their outcomes. Only the second can be falsified by what happens next, which is what makes it evidence.
Why does the choice of benchmark matter so much?
Over the first half of 2026, the six index funds above finished 12.7 points apart on price alone. A benchmark selected after the window closes can supply that entire margin with no strategy involved.
Every number on this page is a stored query over market data, and the SQL sits under each panel. Point the same windows at your own dates on the Strasmore terminal.