Strasmore Research
Edukacja Matt ConnorAutor: Matt Connor

Jak zweryfikować historię wyników strategii AI

Sześć dowodów potrzebnych do weryfikacji publicznej historii wyników AI oraz wyjaśnienie, dlaczego jeden kwartał na żywo niczego nie potwierdza.

Weryfikowalność historii wyników strategii AI można potwierdzić wtedy, gdy osoba z zewnątrz jest w stanie ją odtworzyć na podstawie zapisów istniejących jeszcze przed wystąpieniem wyników. Bardzo niewiele materiałów publikowanych w internecie spełnia ten warunek. Poniżej przedstawiono listę kontrolną, którą czytelnik może zastosować w około dwie minuty. Dane rynkowe stanowią podstawę czterech elementów: benchmarku, znaczników czasu, kosztów transakcyjnych i długości próby.

Co sprawia, że historia wyników strategii AI jest weryfikowalna?

Sześć cech. Każdą z nich można sprawdzić, zamiast oceniać ją uznaniowo.

  1. Transakcje wejścia opublikowane przed poznaniem wyniku. Znacznik czasu musi znajdować się w miejscu, którego autor nie może później zmienić, na przykład w commicie przesłanym w momencie transakcji albo w wyciągu brokerskim. Plik zawierający listę wcześniejszych transakcji jest twierdzeniem o przeszłości, a nie jej zapisem.
  2. Jeden benchmark, wskazany na początku i nigdy niezmieniany. „Pokonać rynek” nic nie znaczy, dopóki porównania nie przypisze się do konkretnego funduszu i konkretnego okresu.
  3. Koszty uwzględnione w raportowanych liczbach. Prowizje, opłaty regulacyjne, koszt pożyczki przy krótkich pozycjach oraz spread zapłacony zarówno przy wejściu, jak i przy wyjściu.
  4. Wersjonowany runbook zamiast dokumentu poddawanego edycji. Jeżeli za historią wyników stoi publiczne repozytorium, użyteczny link prowadzi do oznaczonego wydania albo skrótu commitu. Link do gałęzi domyślnej pokazuje dzisiejszą strategię, która może różnić się od strategii zawierającej transakcje z marca.
  5. Każda pozycja i każdy rachunek, w tym rachunki stratne. Opublikowanie jednego rachunku spośród pięciu działających oznacza selekcję.
  6. Kapitał początkowy wystarczający, aby realizacja zleceń była wiarygodna. Nominał rzędu kilkuset dolarów może „utrzymać” pozycje, których żadne rzeczywiste zlecenie nie zostałoby zrealizowane po wydrukowanej cenie.

Brak jednego z tych elementów nie oznacza automatycznie nieuczciwości. Oznacza brak weryfikowalności. Taki przypadek występuje częściej i jest dla czytelnika równie mało użyteczny.

Dlaczego benchmark musi być wskazany z wyprzedzeniem

Benchmark wybrany po poznaniu wyników to najtańsza przewaga na rynku finansowym. Sześć szerokich amerykańskich funduszy indeksowych, ten sam okres sześciu miesięcy 2026 roku, wyłącznie zmiana ceny:

ZapytanieSześć amerykańskich funduszy indeksowych, identyczny okres: zmiana ceny, 2 stycznia–30 czerwca 2026 r.
Dokładny kod SQL dla każdej liczby
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 DESC
Run this yourself

IWM osiągnął 21.12%, a DIA osiągnął 8.42%. Oznacza to różnicę 12.7 punktów między najwyższym a najniższym wynikiem 6 w identycznym okresie. Wybór funduszu, z którym wynik zostanie porównany po zakończeniu okresu, jest wart całą tę różnicę, a strategia nie musi nic robić, aby ją uzyskać. Są to stopy zwrotu z samej ceny, bez dywidend. Warto z wyprzedzeniem określić także drugą zasadę pomiaru (jak mierzone są miesięczne stopy zwrotu omawia obliczenia całkowitej stopy zwrotu).

Dlaczego znacznik czasu wejścia jest podstawą całego twierdzenia

Transakcja wejścia pojawiająca się po ruchu rynkowym jest opisem wykresu. Zakres ruchu rynku w trakcie jednej sesji jest na tyle duży, że różnica między „opublikowano o 09:35” a „opublikowano o 15:55” przewyższa większość deklarowanych przewag. Poniżej przedstawiono ten zakres, mierzony od pierwszego printu każdej sesji, w pierwszej połowie 2026 roku:

ZapytanieOdchylenie SPY od kursu otwarcia według półgodzinnych przedziałów czasu ET, I połowa 2026 r.
Dokładny kod SQL dla każdej liczby
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
Run this yourself

W przedziale 09:30 ET mediana odległości między zamknięciem sesji a jej kursem otwarcia wyniosła 0.216%. W przedziale 15:30 mediana tej odległości wyniosła 0.415%. Informacje znane agentowi na otwarciu wykluczają niemal cały późniejszy ruch. Historia commitów albo datowany publiczny feed potwierdza kolejność zdarzeń (codzienne raporty AI z badań rynku zależą od tej samej właściwości). Zrzut ekranu krzywej kapitału nie potwierdza jej w żaden sposób.

Co musi być uwzględnione w liczbach

Stopy zwrotu brutto opisują portfel, którego nikt nie mógł posiadać. Każda transakcja wejścia i wyjścia wiąże się z przekroczeniem spreadu bid-ask, czyli różnicy między najlepszą ceną kupna a najlepszą ceną sprzedaży. Różnica ta nie jest taka sama dla każdej spółki:

ZapytanieMediana kwotowanego spreadu i koszt transakcji round trip o wartości 25 000 USD: południowa godzina, 15 lipca 2026 r.
Dokładny kod SQL dla każdej liczby
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
Run this yourself

W ciągu tej jednej godziny w środku sesji mediana kwotowanego spreadu wyniosła 10.08 punktów bazowych dla MSTR wobec 0.27 dla SPY. Punkt bazowy to jedna setna punktu procentowego. Przy pozycji o wartości $25,000 jednokrotne przekroczenie spreadu w każdym kierunku kosztuje $25.2 przy najszerszym spreadzie z tej listy i $0.66 przy najwęższym, przed uwzględnieniem prowizji. Portfel, którego pełna wartość zmienia właściciela raz w tygodniu, ponosi ten koszt około pięćdziesięciu razy w roku. Historia wyników pomijająca ten koszt po cichu przypisuje te dolary samej strategii (ile kosztuje obrót akcjami przedstawia pozostałe elementy rachunku).

Jak długo wyniki live muszą być obserwowane, aby nabrały znaczenia?

Kwartalny okres handlu live jest jednym losowaniem z szerokiego rozkładu, a jego szerokość można zmierzyć. Wszystkie nakładające się na siebie okna o określonej długości od stycznia 2015 roku dla SPY, największego funduszu odwzorowującego S&P 500, uporządkowano według percentyli:

ZapytanieWyniki SPY w okresie utrzymywania pozycji od 2015 r.: 5. percentyl, mediana, 95. percentyl
Dokładny kod SQL dla każdej liczby
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
Run this yourself

W 2826 nakładających się na siebie oknach trzymiesięcznych mediana wyniku strategii „kup i nic nie rób” wyniosła 3.9%. 5. percentyl wyniósł -8.8%, a 95. percentyl 12.2%. Oznacza to przedział o szerokości 21.1 punktów. Każdy pojedynczy wynik kwartalny mieszczący się w tym przedziale jest zgodny z posiadaniem indeksu i wyjazdem na urlop. Uruchomienie dwudziestu agentów, obserwowanie ich przez kwartał i opublikowanie najlepszego z nich powoduje, że prezentowana liczba pochodzi z górnej części takiego przedziału już z samej konstrukcji eksperymentu.

Obliczenia dotyczące długości próby są bezwzględne. Dwunastomiesięczne wyniki w tej samej serii charakteryzują się odchyleniem standardowym wynoszącym 13.6 punktów. Odróżnienie rzeczywistej przewagi od szumu wymaga około (2 × zmienność ÷ przewaga)² lat wyników live. Przy takim poziomie zmienności hipotetyczna przewaga wynosząca trzy punkty rocznie wymaga wielu dekad, a nawet przewaga wynosząca dziesięć punktów wymaga lat, a nie miesięcy. Przedstawione okna nakładają się na siebie, dlatego 2826 oznacza liczbę okien, a nie liczbę niezależnych prób.

Czy rzeczywisty kapitał w wysokości $25,000 rozstrzyga sprawę?

Rzeczywisty kapitał zwiększa wartość dowodową wyników w jeden konkretny sposób. Handel na rachunku demo prowadzi do realizacji po cenach, na które żaden kontrahent się nie zgodził, i nigdy nie wiąże się z odrzuceniem zlecenia. Rachunek o wartości $25,000 finansowany rzeczywistym kapitałem jest rozliczany względem aktualnych kwotowań i obciążany rzeczywistymi prowizjami. Dane znajdują się na wyciągach, które może skontrolować zewnętrzna strona, a wielkość pozycji jest wystarczająca, aby realizacja zleceń była rzeczywista, a nie hipotetyczna.

Nie rozwiązuje to problemu długości próby. Kapitał w wysokości dwudziestu pięciu tysięcy dolarów zaangażowany przez cztery miesiące nadal oznacza jedno losowanie z przedstawionego wyżej rozkładu. Rachunek live można zamknąć po obsunięciu i otworzyć ponownie, rozpoczynając historię od początku. Skala rachunku uwiarygadnia realizację zleceń. Tylko czas sprawia, że wyniki stają się informacyjne.

Cztery rodzaje niepowodzeń, które należy rozpoznawać

  • Backtest przebrany za historię wyników. Wyniki symulacji na danych historycznych są hipotezami dotyczącymi przeszłości. Błąd look-ahead pokazuje, jak symulacja może wykorzystać informacje, których strategia nie mogła znać w danym momencie. Najprostszy sygnał ostrzegawczy to krzywa kapitału rozpoczynająca się wiele lat przed powstaniem kodu.
  • Tylko ocalały agent na scenie. Uruchomiono dziesięciu agentów, a opublikowano jednego. Systemy transakcyjne AI z wieloma agentami ułatwiają przypadkowe powstanie takiego efektu, ponieważ framework uruchamiający dziesięć wariantów wybiera również ten, o którym warto napisać.
  • Restart. Obsunięcie, przerwa, nowy rachunek i krzywa rozpoczynająca się w dniu restartu. Pytanie rozstrzygające brzmi: pokaż krzywą kapitału od pierwszego dolara na pierwszym rachunku.
  • Przeredagowany runbook. Prompty i limity pozycji zostały zmienione między zawarciem transakcji a publikacją opisu. Czynniki alpha generowane przez LLM można tworzyć tysiącami. Zasada selekcji musi więc zostać opublikowana przed dokonaniem wyboru. W przeciwnym razie historia staje się opowieścią o tym, które czynniki przypadkiem zadziałały.

FAQ

Czy historię wyników strategii AI można zweryfikować?

Tak, jeżeli transakcje wejścia opublikowano przed poznaniem ich wyników, benchmark ustalono z wyprzedzeniem, koszty uwzględniono w liczbach, a wszystkie rachunki zostały pokazane. Weryfikacja ma charakter mechaniczny i zajmuje kilka minut. Większość publikowanych historii wyników nie spełnia już pierwszego warunku.

Jak długo musi trwać historia wyników strategii AI live?

Dłużej niż niemal każda publikowana historia wyników. Dwunastomiesięczne wyniki indeksu charakteryzowały się odchyleniem standardowym wynoszącym 13.6 punktów w analizowanych oknach. Oddzielenie umiarkowanej przewagi od przypadku przy konwencjonalnym poziomie ufności wymaga co najmniej kilku lat, a w przypadku niewielkiej przewagi — wielu dekad.

Czy $25,000 wystarczy, aby wyniki portfela AI miały znaczenie?

Wystarczy, aby realizacja zleceń była rzeczywista: aktualne kwotowania, rzeczywiste prowizje i możliwe do skontrolowania wyciągi. Nie wystarczy, aby wyniki z kilku miesięcy były statystycznie istotne. Jest to kwestia upływu czasu, a nie wielkości rachunku.

Jaka jest różnica między backtestem a historią wyników?

Backtest stosuje zasady do już istniejących danych. Historia wyników to seria decyzji opublikowanych przed poznaniem ich rezultatów. Tylko drugą z tych form można sfalsyfikować na podstawie tego, co wydarzy się później. To właśnie nadaje jej wartość dowodową.

Dlaczego wybór benchmarku ma tak duże znaczenie?

W pierwszej połowie 2026 roku sześć wskazanych wyżej funduszy indeksowych zakończyło okres z różnicą 12.7 punktów, licząc wyłącznie zmianę ceny. Benchmark wybrany po zakończeniu okresu może dostarczyć całej tej przewagi bez udziału jakiejkolwiek strategii.


Każda liczba na tej stronie pochodzi z zapisanego zapytania obejmującego dane rynkowe, a kod SQL znajduje się pod każdym panelem. Te same okna można zastosować do własnych dat w terminalu Strasmore.

#ai agents#track record#live trading#backtesting#quant