BiLSTM z attention na danych rynkowych. Najtrudniejsza nie jest sieć, tylko uczciwy eksperyment
Przez kilka miesięcy budowaliśmy sieci BiLSTM z mechanizmem attention, środowisko uczenia ze wzmocnieniem i warstwę fundamentów point-in-time. Najcenniejsze okazały się nie architektury, tylko placebo, wstępnie ustalone progi i opisane wyniki negatywne.
Sieci rekurencyjne z mechanizmem attention są dziś standardowym punktem wyjścia do modelowania szeregów czasowych. Prowadziliśmy na nich projekt badawczy dotyczący diagnostyki rynków akcji: od klasyfikatora kierunku, przez detektory poziomów wsparcia i oporu, po agenta uczonego algorytmem PPO w symulowanym środowisku rynkowym. Repozytorium ma dziś 186 commitów i około 780 testów automatycznych.
Najważniejszy wniosek nie dotyczy żadnej architektury. Przy danych finansowych dobranie sieci to łatwiejsza część pracy. Trudniejsza to zbudowanie eksperymentu, który nie okłamie badacza — bez wycieku przyszłości, z uczciwym punktem odniesienia i z gotowością zapisania wyniku „nie działa”. Większość naszych hipotez skończyła się właśnie takim wynikiem. Każdy z nich był wart więcej niż kolejna warstwa w modelu.
Co modelujemy i jak
Rdzeniem wszystkich modeli jest ten sam blok czasowy:
- dwukierunkowy LSTM przetwarza okno ostatnich sesji (zwykle 30 lub 60) i dla każdego dnia buduje reprezentację uwzględniającą kontekst przed nim i po nim — ale wyłącznie w obrębie okna, które kończy się na „dziś”, więc dwukierunkowość nie oznacza zaglądania w przyszłość;
- wielogłowicowy self-attention (4 głowice) z połączeniem rezydualnym i normalizacją pozwala modelowi ważyć poszczególne dni okna, zamiast traktować je jednakowo;
- uśrednienie po czasie daje jeden wektor na instrument, na którym pracują głowice zadaniowe.
Pierwsza wersja miała głowice multi-horizon: jeden wspólny enkoder i osobne wyjścia klasyfikacyjne dla kilku horyzontów naraz. Później ten sam enkoder stał się częścią kolejnych modeli:
- klasyfikatora kierunku następnej sesji (spadek / ruch boczny / wzrost, z progiem skalowanym zmiennością ATR),
- predyktora następnego lokalnego ekstremum — kiedy wypadnie i na jakim poziomie, z regresją kwantylową,
- detektora poziomów wsparcia i oporu na danych godzinowych, gdzie zamiast BiLSTM porównywaliśmy splotowy enkoder TCN, tokeny w stylu PatchTST i set-transformer z biasem uwzględniającym odstęp w czasie,
- polityki agenta RL w środowisku Gymnasium: decyzje raz dziennie (D1), symulacja wykonania na świecach godzinowych (H1), algorytm PPO.
W polityce RL attention występował w dwóch miejscach: po czasie (osobno dla każdego instrumentu, ze wspólnymi wagami) i między instrumentami — mały blok transformera nad wektorami wszystkich spółek naraz, który miał pozwolić modelowi uwzględniać korelacje w portfelu. Do tego architektura Wide & Deep: część „głęboka” to enkoder czasowy, „szeroka” to płaskie cechy fundamentalne i embedding instrumentu.
Dane: najpierw point-in-time
Model jest tak uczciwy, jak dane, które widzi w danym dniu symulacji. Kilka zasad, które przyjęliśmy:
- Jedno źródło notowań. Wszystkie dane OHLCV pochodzą ze wspólnej bazy szeregów czasowych, aktualizowanej co godzinę przez osobny proces. Projekt badawczy tylko z niej czyta i trzyma lokalną kopię w Parquet.
- H1 wyprowadzone, nie dociągane. Natywną rozdzielczością bazy są świece 30-minutowe; godzinowe powstają przez agregację dwóch kolejnych (open pierwszej, close drugiej, max, min, suma wolumenu). Dzięki temu D1, H1 i M30 są spójne, a nie zszyte z różnych źródeł.
- Fundamenty według daty publikacji. Dla dnia symulacji model widzi tylko raporty, których data złożenia jest nie późniejsza niż ten dzień — nigdy według końca okresu sprawozdawczego, bo to wiedza, której rynek jeszcze nie miał. Funkcja ma osobne testy, m.in. „nigdy nie zwraca raportu złożonego po dacie symulacji”.
- Ekstrapolacja wyłącznie z przeszłości. Wskaźniki fundamentalne o dziennej rozdzielczości są ekstrapolowane liniowo z dwóch ostatnich znanych raportów, z twardym limitem 180 dni. Dla instrumentów bez sprawozdań (np. ETF-ów) model dostaje osobną flagę braku fundamentów, żeby zero w cechach nie udawało prawdziwej wartości.
- Kalendarz raportów z przeszłości. Nie mieliśmy kalendarza przyszłych publikacji, więc datę następnego raportu szacujemy z historii publikacji danej spółki — również z ograniczeniem do tego, co było znane w dniu symulacji.
- Cechy bezwymiarowe. Ceny jako odległość od zamknięcia w jednostkach ATR, MACD znormalizowany przez ATR, RSI, stosunek wolumenu do średniej. Model nie może „rozpoznać” spółki po poziomie ceny.
W zadaniach nadzorowanych podział jest chronologiczny: trening przed 2024 r., walidacja 2024, test od 2025 r. (90 instrumentów, dane dzienne od 2020 r.). Między zbiorami stosujemy purge — próbka wypada, jeśli okno jej etykiety przecina granicę następnego zbioru. W RL granice zbiorów zakotwiczyliśmy na rzeczywistych reżimach rynku, tak żeby trening, walidacja i test zawierały różne okresy spadków, zamiast losowo trafiać na jeden z nich.
Metoda: placebo i progi ustalone przed uruchomieniem
Dwie praktyki zmieniły nasz sposób pracy bardziej niż jakakolwiek architektura.
Placebo z przetasowanymi etykietami. Każdy model trenujemy dodatkowo na tych samych danych z losowo permutowanymi etykietami i oceniamy na prawdziwym zbiorze testowym. Jeśli wynik placebo jest w zasięgu wyniku prawdziwego modelu, „sygnał” jest artefaktem procedury.
Wstępnie zarejestrowane progi. Przed uruchomieniem zapisujemy, co uznamy za sukces: np. dla kierunku — log-loss niższy od najlepszego naiwnego punktu odniesienia w każdym seedzie i AUC co najmniej 0,52 dla obu klas skrajnych; dla ekstremów — poprawa Briera o co najmniej 5% i AUC co najmniej 0,58. Progi nie przesuwają się po zobaczeniu wyników.
Do tego zawsze proste punkty odniesienia: częstości klas z treningu, tabela Markowa „jutro jak dziś”, gradient boosting na cechach z ostatniego dnia i model MLP bez okna czasowego.
Co pokazały wyniki
Kierunek następnej sesji: brak sygnału. Na zbiorze testowym (od 2025 r., klasy w proporcjach 31/36/34%) żaden model nie pobił naiwnych punktów odniesienia w log-loss. Najlepsza była trywialna tabela Markowa (1,0973), BiLSTM z attention uzyskał 1,0978, a modele placebo 1,0971–1,0978. AUC sieci mieściło się w przedziale 0,50–0,52. Modele sekwencyjne z 60-dniowym oknem nie były lepsze od MLP patrzącego tylko na ostatni dzień, a najlepszy wynik walidacyjny każdy model osiągał w pierwszej lub drugiej epoce.
Moment ekstremum: uczy się tylko część trywialna. Prawdopodobieństwo, że w ciągu kilku sesji wypadnie lokalne maksimum lub minimum, sieci przewidywały z AUC około 0,74–0,80, a placebo około 0,5 — model uczył się czegoś realnego. Ale prosta statystyka „ile sesji od maksimum ostatnich 11 dni” dawała już 0,74/0,76, a gradient boosting na ostatnim dniu 0,77/0,81, więcej niż którakolwiek sieć. Okno 60 sesji, attention, sploty i fundamenty nie dodały nic ponad to, co mówi dzisiejsza świeca. Poziom ekstremum nie miał użytecznego sygnału.
Rzadki „pewny” podzbiór dni to złudzenie. Sprawdziliśmy hipotezę, że brak sygnału w średniej ukrywa niewielki podzbiór dni, w których model jest wyjątkowo pewny. Najwyższy decyl pewności dawał poprawę rzędu 1–2% — tyle samo, ile model placebo w identycznej procedurze. Sześć kolejnych kandydatów na cechy (dzień tygodnia, odległość do raportu, ranga siły względnej, kontekst indeksu, wolumen, dłuższe okno) nie przeszło tego samego testu. Przegląd regularyzacji (9 kombinacji weight decay i dropoutu) pokazał tylko dwa reżimy: przeuczenie albo brak dopasowania, bez obszaru pośredniego.
Attention między instrumentami destabilizował trening. W RL usunięcie samego bloku attention między instrumentami, bez zmiany żadnego hiperparametru, obniżyło dywergencję KL pierwszej aktualizacji PPO z 0,21–0,38 do 0,03–0,05 — silniej niż pięciokrotne zmniejszenie learning rate. Wariant z attention tylko po czasie zachowywał się jak baseline MLP. Późniejsze ablacje potwierdziły, że niestabilność pochodzi z mieszania informacji między instrumentami, a nie z mechanizmów, które na nim zbudowaliśmy.
Attention jako narzędzie do falsyfikacji
Wagi attention mają tę zaletę, że można je bezpośrednio zmierzyć. Zbudowaliśmy sondę, która sprawdza, czy model poświęca więcej uwagi dniom będącym lokalnym maksimum lub minimum okna albo dniom z wysokim wolumenem.
Wynik był pouczający. W dwóch dobrze wytrenowanych punktach kontrolnych tego samego modelu efekt dla maksimów wyniósł +5,3% i −4,4%, a dla minimów −6,0% i +7,5%. Znak odwracał się między seedami. Gdyby attention wykształcił stabilny mechanizm rozpoznawania punktów zwrotnych, dwa niezależne treningi powinny dojść do tego samego kierunku. To samo zobaczyliśmy w detektorze wsparć i oporów: rozkład uwagi nie różnił się od losowego wyboru tokenu, także po dodaniu biasu odstępu w czasie i zmianie enkodera.
Osobna sonda pokazała z kolei, że enkoder BiLSTM z attention potrafi zakodować maksimum i minimum okna (R² 0,955–0,985 na zbiorze testowym, niezależnie od sposobu poolingu). Problemem nie była więc zdolność reprezentacji, tylko to, czy w danych jest coś, czego warto się nauczyć, i czy sygnał uczący do tego miejsca dociera.
Interpretowalność attention nie dała nam ładnej historii o tym, „na co patrzy model”. Dała coś cenniejszego — sposób na obalenie hipotez, zanim zbudowaliśmy na nich kolejne piętro.
Pułapki, które znaleźliśmy w swoim kodzie
Część najważniejszych odkryć to błędy, które bez testów i sond dawałyby wiarygodnie wyglądające wyniki:
- Trening nie widział jednej czwartej danych. Środowisko RL resetowało się na początku każdej aktualizacji zawsze do pierwszego dnia zbioru i szło w przód o stałą liczbę kroków. Policzone dokładnie: 197 dni, czyli 26,7% zbioru treningowego, nie trafiło do żadnej aktualizacji, niezależnie od długości treningu. Walidacja tego błędu nie miała, więc nic go nie sygnalizowało.
- Głowica, która się nie uczyła. Parametry odpowiedzialne za ciągłą część akcji pozostały po treningu na wartościach z inicjalizacji — co wyglądało na „wyuczoną” stałą strategię, było szumem startowym. Przyczyna: jedna wspólna przewaga (advantage) dla kilkudziesięciu decyzji naraz oraz obcięcie epizodu traktowane jak jego koniec. Dla około 75% transakcji treningowych te parametry nie miały przyczynowego wpływu na nagrodę.
- Metryka liczona na złej kolumnie. W pierwszej wersji raportu ekstremów poziomy były oceniane względem kolumn z prawdopodobieństwem bliskości, co dawało korelację około −0,2. Po wykryciu przeliczyliśmy metryki z zapisanych punktów kontrolnych i dodaliśmy test regresyjny; trening i pozostałe metryki nie były dotknięte błędem.
- Seed ustawiany za późno. Ziarno losowe było ustawiane po zbudowaniu modelu, więc inicjalizacja wag nie była powtarzalna — a porównania między seedami są podstawą całej metodologii.
- Walidacja, która nagradza dopasowanie do siebie. Próbkowanie dni treningowych ważone „nowością” reżimu (Random Network Distillation) dało szybciej lepszy wynik walidacyjny i wyraźnie gorszy testowy. Krótkie okno walidacyjne było skorelowane z tym, co faworyzował sam mechanizm próbkowania. Na wielu punktach kontrolnych ranking według walidacji tylko słabo przenosił się na test.
- Reprodukcja z literatury. Odtworzona dokładnie według publikacji metoda wykrywania poziomów na naszych danych tworzyła jeden klaster na całą historię instrumentu. Hiperparametry z artykułu nie przenoszą się między zbiorami danych — co warto wiedzieć, zanim użyje się cudzej metody jako punktu odniesienia.
Granice modeli uczonych na historii
Model taki jak BiLSTM uczy się wzorców z przeszłości — z cen, wolumenów i sprawozdań finansowych. To założenie przestaje działać, gdy o ruchach rynku decyduje informacja, a nie historia. Ostatnie lata dały wyjątkowo dużo takich okresów: pandemia, wojny, gwałtowne skoki cen ropy, polityczne deklaracje wygłaszane z dnia na dzień. Rynki stają się wtedy nieprzewidywalne zarówno technicznie, jak i fundamentalnie — szczególnie gdy uczestnicy rynku aktywnie kształtują i wykorzystują przepływ informacji.
W takich warunkach żaden model uczony na samej historii nie ma skąd wziąć sygnału — zdarzenia, które poruszają rynkiem, nie występowały w danych treningowych. Lepiej sprawdzają się wtedy modele językowe (LLM) z dostępem do świeżych serwisów informacyjnych: potrafią w kilka sekund zebrać i zestawić kontekst, który w szeregach czasowych pojawi się dopiero z opóźnieniem. W naszej praktyce to w okresach informacyjnych wstrząsów często najcenniejsze narzędzie analityczne — a sieci uczone na historii traktujemy jako uzupełnienie, nie wyrocznię.
Czego się nauczyliśmy
- Najpierw tani probe nadzorowany, potem RL. Pytanie „czy w tych cechach jest informacja o X” można rozstrzygnąć w kilka minut nadzorowanym modelem z placebo. Uczenie ze wzmocnieniem odpowiada na nie po godzinach i z dużo większym szumem.
- Placebo i progi przed uruchomieniem są ważniejsze niż architektura. BiLSTM, splotowe TCN, attention i zwykły MLP okazały się na naszych cechach statystycznie nierozróżnialne. Różnicę robiła procedura.
- Najlepsza epoka równa 1 to diagnoza, nie sukces early stoppingu. Jeśli każdy model osiąga szczyt walidacji zaraz po inicjalizacji, model nie ma czego się uogólniać.
- Point-in-time musi mieć testy. „Nie korzystamy z przyszłych danych” to deklaracja. Test, który sprawdza to na granicznych datach i strefach czasowych, to gwarancja.
- Wynik negatywny zapisujemy tak samo starannie jak pozytywny. Każdy eksperyment ma w repozytorium raport z ustawieniami, tabelami, werdyktem i listą niezbadanych dalszych kroków. Dzięki temu nie wracamy do pomysłów, które już raz upadły.
Kolejny krok metodologiczny, który mamy przed sobą, to walidacja na wielu przesuwanych oknach czasowych (walk-forward) zamiast jednego podziału chronologicznego — część naszych wniosków opiera się na pojedynczym podziale i pojedynczym placebo, i opisujemy to w raportach wprost.
Przy diagnozie problemów z treningiem korzystaliśmy z agentów AI w układzie „pomysłodawca i krytyk”, ale każde stwierdzenie „zmierzone” sprawdzaliśmy w kodzie i logach. O tym, dlaczego taki sposób pracy podnosi jakość, piszemy w artykule AI nie psuje kodu. Więcej o tym, jak pracujemy z modelami: oferta AI.
Artykuł opisuje prace badawcze z zakresu uczenia maszynowego i nie stanowi porady inwestycyjnej ani rekomendacji dotyczącej jakichkolwiek instrumentów finansowych.