Чи можна перевірити результати AI-трейдингу?
Які шість підтверджень роблять публічні результати AI-трейдингу перевірюваними та чому один квартал реальної торгівлі нічого не доводить.
Результати торгівлі за допомогою AI можна перевірити, якщо стороння особа може відновити їх за записами, що існували до отримання результатів. Дуже мало опублікованих в інтернеті матеріалів відповідають цьому критерію. Нижче наведено checklist, який читач може застосувати приблизно за дві хвилини. Чотири пункти спираються на ринкові дані: benchmark, часові мітки, торгові витрати та тривалість вибірки.
Що робить результати торгівлі за допомогою AI перевірюваними?
Шість властивостей. Кожну з них можна перевірити, а не оцінювати суб’єктивно.
- Входи в позиції опубліковані до того, як став відомим результат. Часова мітка має міститися там, де автор не може її переписати, наприклад у commit, опублікованому в момент угоди, або у виписці брокера. Файл із переліком минулих угод є твердженням про минуле, а не його записом.
- Один benchmark, названий на початку й надалі незмінний. Формулювання «випередив ринок» нічого не означає, доки порівняння не прив’язане до конкретного фонду та конкретного періоду.
- Витрати включені до опублікованих показників. Комісії, регуляторні збори, витрати на запозичення для коротких позицій і спред, сплачений під час входу та виходу.
- Runbook має версії, а не редагується заднім числом. Якщо результати підтверджує публічний репозиторій, корисне посилання має вести на tagged release або commit hash. Посилання на default branch показує стратегію на сьогодні. Вона може відрізнятися від стратегії, яка торгувала в березні.
- Показані кожна позиція та кожен рахунок, включно зі збитковими. Публікація одного рахунку з п’яти діючих є вибіркою.
- Початковий капітал достатній, щоб угоди були реалістичними. На умовні кількасот доларів можна «утримувати» позиції, які жоден реальний ордер не виконав би за вказаною ціною.
Відсутність одного з цих елементів не означає автоматично, що результати сфальсифіковані. Вони просто неперевірювані. Це трапляється частіше й так само не дає читачеві корисної інформації.
Чому benchmark потрібно назвати заздалегідь
Benchmark, обраний після отримання результатів, є найдешевшою перевагою у фінансах. Шість широких індексних фондів США за ті самі шість місяців 2026 року. Враховано лише зміну ціни:
Точний SQL-код для кожного числа
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 показав результат 21.12%, а DIA — 8.42%. Отже, різниця між найкращим і найгіршим результатом 12.7 пунктів за однакового періоду для 6. Вибір фонду для порівняння після завершення періоду дає всю цю різницю без будь-яких дій стратегії. Це показники зміни ціни до врахування дивідендів. Це ще одне правило вимірювання, яке варто встановити заздалегідь (як вимірюються місячні доходності пояснює розрахунок total return).
Чому часова мітка входу є основою всього твердження
Вхід у позицію, що з’являється після руху ціни, є лише описом графіка. Діапазон руху ринку протягом однієї сесії достатньо широкий, щоб різниця між «опубліковано о 09:35» та «опубліковано о 15:55» перекривала більшість заявлених переваг. Нижче показано цей діапазон. Розрахунок виконано від першого print кожної сесії за першу половину 2026 року:
Точний SQL-код для кожного числа
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_timeУ часовому інтервалі 09:30 ET медіанна сесія завершилася на відстані 0.216% від ціни відкриття. В інтервалі 15:30 медіанна відстань становила 0.415%. Будь-яка інформація, доступна агенту на відкритті, виключає майже весь цей рух. Історія commit або датована публічна стрічка підтверджує послідовність подій (щоденні звіти AI про дослідження ринку залежать від цієї самої властивості). Скріншот кривої капіталу такого підтвердження не містить.
Що має бути включено до показників
Валові доходності описують портфель, яким ніхто не міг володіти. Кожен вхід і вихід проходить через bid-ask spread — різницю між найкращою ціною купівлі та найкращою ціною продажу. Ця різниця неоднакова для різних інструментів:
Точний SQL-код для кожного числа
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 DESCПротягом цієї однієї години в середині торгового дня медіанний котирувальний spread становив 10.08 базисних пунктів для MSTR проти 0.27 для SPY. Базисний пункт — це одна сота процентного пункту. Для позиції на $25,000 перетин цього спреду один раз у кожному напрямку коштує $25.2 для найширшого спреду в цьому переліку та $0.66 для найвужчого, до врахування комісій. Портфель, який повністю змінює склад один раз на тиждень, сплачує цю суму приблизно п’ятдесят разів на рік. Результати без урахування цього витратного компонента фактично зараховують ці кошти самій стратегії (скільки коштує торгівля акцією містить решту розрахунку).
Скільки часу потрібно, щоб результати торгівлі в реальному часі стали значущими?
Квартал торгівлі в реальному часі — це одне спостереження з широкого розподілу. Його ширину можна виміряти. Нижче наведено всі перекривні періоди заданої тривалості для SPY, найбільшого фонду, що відстежує S&P 500, з січня 2015 року, розподілені за перцентилями:
Точний SQL-код для кожного числа
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 sessionsЗа 2826 перекривними тримісячними періодами медіанний результат стратегії «купити й нічого не робити» становив 3.9%. 5-й перцентиль дорівнював -8.8%, а 95-й — 12.2%. Діапазон між ними становив 21.1 пунктів. Будь-який окремий квартальний результат у цьому діапазоні узгоджується з володінням індексом без активних дій. Якщо запустити двадцять агентів на квартал і опублікувати найкращого, показник на екрані за визначенням походить із верхньої частини такого діапазону.
Розрахунок необхідної тривалості вибірки не залишає простору для поблажок. Стандартне відхилення 12-місячних результатів у цьому самому ряді становить 13.6 пунктів. Щоб відрізнити реальну перевагу від шуму, потрібно приблизно (2 × варіація ÷ перевага)² років торгівлі в реальному часі. За такої варіації гіпотетична перевага у 3 процентні пункти на рік потребує багатьох десятиліть, а навіть перевага у 10 пунктів — років, а не місяців. Наведені періоди перекриваються, тому 2826 — це кількість періодів, а не кількість незалежних спостережень.
Чи достатньо $25,000 реального капіталу?
Реальний капітал підвищує якість доказів в один конкретний спосіб. Paper trading передбачає виконання угод за цінами, з якими не погодився жоден контрагент, і не стикається з відхиленням ордерів. На рахунку з капіталом $25,000 угоди виконуються за актуальними котируваннями та супроводжуються реальними комісіями. Це відображається у виписках, які може перевірити третя сторона. Розміри позицій також достатні, щоб виконання було звичайним ринковим результатом, а не уявним припущенням.
Це не вирішує проблему вибірки. Торгівля $25,000 протягом чотирьох місяців усе одно є одним спостереженням із наведеного вище розподілу. Реальний рахунок можна закрити після просадки й відкрити новий, почавши історію з нуля. Масштаб капіталу робить виконання угод реалістичним. Лише час робить результати інформативними.
Чотири типові проблеми
- Backtest, що видається за результати торгівлі. Симульовані результати на історичних даних є гіпотезами про минуле. Look-ahead bias показує, як симуляція може використати інформацію, якої стратегія не могла мати в потрібний момент. Найочевидніша ознака — крива капіталу, що починається за роки до появи коду.
- На сцені лише той, хто вижив. Запущено десять агентів, опубліковано одного. Мультиагентні системи торгівлі за допомогою AI полегшують таку помилку, оскільки framework, який запускає десять варіантів, одночасно обирає той, про який варто написати.
- Перезапуск. Просадка, пауза, новий рахунок, крива, що починається з дати перезапуску. Вирішальне запитання: покажіть криву капіталу від першого долара на першому рахунку.
- Переписаний runbook. Промпти та ліміти позицій редагуються між виконанням угоди та написанням звіту. Alpha-фактори, згенеровані LLM можна створювати тисячами, тому правило відбору має бути опубліковане до самого відбору. Інакше результати перетворюються на історію про фактори, які випадково спрацювали.
FAQ
Чи можна перевірити результати торгівлі за допомогою AI?
Так, якщо входи в позиції були опубліковані до того, як став відомим результат, benchmark зафіксовано заздалегідь, витрати включено до показників, а всі рахунки показано. Перевірка є механічною й займає кілька хвилин. Більшість опублікованих результатів не відповідає першій вимозі.
Скільки має тривати історія торгівлі за допомогою AI у реальному часі?
Довше, ніж майже будь-яка опублікована історія. Стандартне відхилення 12-місячних результатів індексу в періодах, виміряних тут, становило 13.6 пунктів. Тому відокремлення помірної переваги від випадкового результату за стандартного рівня статистичної довіри потребує щонайменше кількох років, а для невеликої переваги — десятиліть.
Чи достатньо $25,000, щоб результати AI-портфеля були значущими?
Цього достатньо, щоб виконання угод було реальним: актуальні котирування, реальні комісії та виписки, доступні для аудиту. Але цього недостатньо, щоб кілька місяців результатів стали статистично значущими. Це питання тривалості періоду, а не розміру рахунку.
У чому різниця між backtest і результатами торгівлі?
Backtest застосовує правила до даних, які вже існують. Результати торгівлі — це послідовність рішень, опублікованих до отримання результатів. Лише другий варіант можна спростувати майбутніми подіями, і саме це робить його доказом.
Чому вибір benchmark має таке значення?
У першій половині 2026 року шість наведених вище індексних фондів завершили період із різницею 12.7 пунктів лише за зміною ціни. Benchmark, обраний після завершення періоду, може забезпечити всю цю різницю без будь-якого внеску стратегії.
Кожне число на цій сторінці отримано зі збереженого запиту до ринкових даних. SQL-код розміщено під кожною панеллю. Застосуйте ті самі періоди до власних дат у терміналі Strasmore.