Jak nauczyć się quant tradingu z książki open source
Podręcznik open source przedstawia pełny program quant tradingu. Omówiono etapy nauki, typowe błędy początkujących oraz elementy przydatne przy handlu akcjami w USA.
Podręcznik dotyczący algorytmicznego handlu o otwartym kodzie źródłowym jest bezpłatnym publicznym sylabusem. Przedstawia całą ścieżkę — od surowych danych do złożenia zlecenia na rynku — w kolejności, w jakiej poznaje ją początkujący. Manuskrypt XQuant: Everyone Can Be a Quantitative Trader, opublikowany w serwisie GitHub przez xingwudao, stanowi przejrzysty przykład. W sierpniu 2026 r. miał 686 gwiazdek. Jego dziewięć rozdziałów przedstawia schemat obecny w niemal każdym programie nauczania dotyczącym quantitative trading. W tym artykule omówiono tę ścieżkę etap po etapie, wskazano konkretny błąd charakterystyczny dla każdego etapu oraz zaznaczono, które elementy zachowują przydatność po przejściu z chińskich akcji A do akcji amerykańskich.
Co zawiera podręcznik ilościowego handlu o otwartym kodzie?
Po usunięciu warstwy marketingowej z dowolnego programu dla początkujących pozostaje pięć etapów, w następującej kolejności: pozyskanie i oczyszczenie danych, zbudowanie na ich podstawie sygnału, przetestowanie tego sygnału na danych historycznych, określenie wielkości pozycji, a następnie przekazanie zlecenia do realizacji i poniesienie kosztów. Spis treści XQuant, odczytany w commicie 016b66e z 14 lipca 2026 r., obejmuje ten sam zakres w dziewięciu rozdziałach.
- Przygotowanie, a następnie rozdział pierwszy: przeprowadzenie jednej kompletnej strategii od początku do końca.
- Rozdział drugi — co kupować: rozpoczęcie od trzech ETF-ów.
- Rozdział trzeci — ile kupować: trzy metody alokacji i ich wzajemne porównanie.
- Rozdział czwarty — kiedy zawierać transakcje: rebalancing, stop loss i take profit.
- Rozdział piąty — ocena jakości strategii: cztery perspektywy.
- Rozdział szósty — nie należy zbyt wcześnie świętować: zapobieganie przeuczeniu.
- Rozdział siódmy — od modelu idealnego do rzeczywistości: realizacja transakcji.
- Rozdział ósmy — życie po uruchomieniu strategii: monitorowanie, diagnoza i iteracja.
- Rozdział dziewiąty — poszukiwanie nowych możliwości: wprowadzenie do badań nad czynnikami.
Na kolejność należy zwrócić uwagę. Określanie wielkości pozycji pojawia się w rozdziale trzecim, przed oboma rozdziałami dotyczącymi backtestów, a badania nad czynnikami zostały umieszczone na końcu. Ścieżki samouków zazwyczaj wyglądają odwrotnie: najpierw pomysł na czynnik, potem backtest, a zasada określania wielkości pozycji — nigdy. Towarzyszące repozytorium ćwiczeń (333 gwiazdki, według stanu na tę samą datę) jest zorganizowane wokół pisemnych specyfikacji zadań, a nie gotowego kodu; czytelnik zleca asystentowi AI ich implementację. Umiejętność czytania kodu, którego nie napisano samodzielnie, nadal decyduje o wszystkim, co opisano poniżej, ponieważ każda z kolejnych awarii kryje się w jednym szczególe implementacji.
Etap pierwszy: pobranie danych, a następnie zdefiniowanie uniwersum
Czyszczenie danych to widoczna część pracy z danymi: błędnie zarejestrowane transakcje, brakujące sesje oraz korekty z tytułu splitów i dywidend. Wybór spółek, które mają zostać poddane analizie, to niewidoczna część tego procesu. To właśnie na tym etapie, jeszcze przed napisaniem choćby jednej linii kodu strategii, pojawia się błąd przetrwania. Należy wziąć pod uwagę każdy ticker z USA, dla którego odnotowano transakcję w jednym tygodniu czerwca, osobno dla każdego roku, a następnie sprawdzić, ile z nich nadal było przedmiotem obrotu w tym samym tygodniu 2026 roku.
Dokładny kod SQL dla każdej liczby
WITH june_week AS (
SELECT toYear(toTimeZone(window_start, 'America/New_York')) AS year,
ticker
FROM global_markets.delayed_stocks_minute_aggs
WHERE toMonth(toTimeZone(window_start, 'America/New_York')) = 6
AND toDayOfMonth(toTimeZone(window_start, 'America/New_York')) BETWEEN 10 AND 16
AND toYear(toTimeZone(window_start, 'America/New_York')) BETWEEN 2016 AND 2026
AND volume > 0
GROUP BY year, ticker
),
survivors AS (
SELECT ticker FROM june_week WHERE year = 2026
)
SELECT year,
uniqExact(ticker) AS tickers_traded,
uniqExactIf(ticker, ticker IN (SELECT ticker FROM survivors)) AS still_trading_2026,
round(100 * uniqExactIf(ticker, ticker IN (SELECT ticker FROM survivors))
/ uniqExact(ticker), 1) AS still_trading_pct
FROM june_week
GROUP BY year
ORDER BY yearSpośród 8224 tickerów, dla których w tym tygodniu 2016 odnotowano transakcje, 50% nadal było przedmiotem obrotu w tym samym tygodniu 2026. Pozostałe spółki zostały przejęte, połączone, przemianowane lub wycofane z obrotu. Backtest oparty na dzisiejszym składzie analizuje wyłącznie spółki, które przetrwały, i przypisuje strategii wyniki z utrzymywania spółek wybranych dopiero po fakcie. Początkujący dostawca danych przekaże taką listę spółek, które przetrwały, bez odpowiedniego ostrzeżenia: przewodnik po bezpłatnym API danych giełdowych wyjaśnia, jakie dane są dostępne w takich źródłach, a jakich w nich brakuje.
Etap drugi: przekształcenie danych w sygnał
Sygnał to reguła, która przypisuje akcji ocenę w określonym momencie. Czynnik to sygnał, którego skuteczność zakłada się jednocześnie dla wielu akcji. Klasycznymi przykładami są momentum, wartość i niska zmienność. Na tym etapie błędem jest testowanie reguł do momentu znalezienia działającej. Dwadzieścia wariantów przecięcia średnich kroczących na danych z jednej dekady dla jednego indeksu zawsze wyłoni zwycięzcę. Będzie nim wariant najlepiej dopasowany do szumu. Obrona przed tym problemem nie jest efektowna: regułę należy ustalić przed jej pomiarem, odłożyć część historii, której nie analizuje się na etapie opracowywania reguły, policzyć wszystkie przetestowane warianty i preferować mniejszą liczbę parametrów podlegających dostrajaniu. W XQuant poświęcono temu cały rozdział poprzedzający badania czynnikowe. Jest to właściwa kolejność.
Etap trzeci: test historyczny, na którym zatrzymuje się większość początkujących
Jest to etap, na którym kończy się większość projektów realizowanych samodzielnie. Kończą się one po cichu, za to z bardzo atrakcyjną krzywą kapitału. Efekt przetrwania, opisany powyżej, jest pierwszym z dwóch błędów. Drugim jest obciążenie wynikające z wykorzystania informacji z przyszłości: strategia wykorzystuje wartość, której rynek nie dostarczył jeszcze w momencie, gdy zlecenie miało zostać złożone. Najczęściej stosuje się regułę obliczaną na podstawie dzisiejszej ceny zamknięcia i realizuje zlecenie po tej samej cenie zamknięcia. Należy zmierzyć dystans pomijany przez to założenie.
Dokładny kod SQL dla każdej liczby
WITH sessions AS (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS session,
argMin(open, window_start) AS session_open,
argMax(close, window_start) AS session_close
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY', 'NVDA')
AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2024-08-01')
AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY ticker, session
),
gaps AS (
SELECT ticker,
session,
toFloat64(session_open) AS open_px,
toFloat64(lagInFrame(session_close) OVER (PARTITION BY ticker ORDER BY session)) AS prev_close
FROM sessions
)
SELECT formatDateTime(toStartOfMonth(session), '%Y-%m') AS month,
formatDateTimeInJodaSyntax(toStartOfMonth(session), 'MMMM yyyy') AS month_label,
round(avgIf(abs(open_px / prev_close - 1) * 10000, ticker = 'SPY'), 1) AS spy_gap_bps,
round(avgIf(abs(open_px / prev_close - 1) * 10000, ticker = 'NVDA'), 1) AS nvda_gap_bps
FROM gaps
WHERE prev_close > 0
GROUP BY month, month_label
HAVING countIf(ticker = 'SPY') > 0 AND countIf(ticker = 'NVDA') > 0
ORDER BY monthW July 2026 średni dystans między jednym zamknięciem a kolejnym otwarciem wyniósł 40.8 punktów bazowych dla SPY oraz 107.4 dla NVDA. Punkt bazowy stanowi jedną setną punktu procentowego. Wszystkie 24 miesięcy w analizowanym zestawieniu, począwszy od August 2024, wykazują wartość powyżej zera. Backtest, który podejmuje decyzję przy zamknięciu i realizuje zlecenie po tej samej cenie, uzyskuje ten dystans bez ponoszenia kosztu przy każdej transakcji. Żadne rzeczywiste zlecenie nie zapewnia takiego efektu. Obciążenie wynikające z wykorzystania informacji z przyszłości w backteście wyjaśnia mechanizm, a dlaczego akcje wykazują luki cenowe przez noc objaśnia samą lukę.
Etap czwarty: określenie wielkości pozycji
Problemem jest brak zasad. Większość traderów samouków nigdy nie zapisuje reguły dotyczącej wielkości pozycji. W efekcie stosuje ją przypadkowo — zwykle inwestując taką samą kwotę w każdy walor albo przeznaczając na transakcję całą dostępną gotówkę. Takie same kwoty nie oznaczają takiego samego ryzyka.
Dokładny kod SQL dla każdej liczby
WITH daily AS (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS session,
argMax(close, window_start) AS session_close
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY', 'KO', 'JNJ', 'MSFT', 'AAPL', 'NVDA', 'TSLA', 'COIN')
AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2025-08-01')
AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY ticker, session
),
rets AS (
SELECT ticker,
toFloat64(session_close) AS close_px,
toFloat64(lagInFrame(session_close) OVER (PARTITION BY ticker ORDER BY session)) AS prev_close
FROM daily
)
SELECT ticker,
round(stddevSamp(close_px / prev_close - 1) * sqrt(252) * 100, 1) AS annualized_vol_pct,
round(abs(min(close_px / prev_close - 1)) * 100, 2) AS worst_day_pct
FROM rets
WHERE prev_close > 0
GROUP BY ticker
ORDER BY annualized_vol_pct DESCW ciągu dwunastu miesięcy zakończonych 31 lipca 2026 r. zmienność annualizowana COIN wyniosła 68%, w porównaniu z 12.7% dla SPY, znajdującego się na spokojniejszym końcu analizowanej grupy. W najgorszej pojedynczej sesji kurs zamknął się 13.34% poniżej poprzedniego zamknięcia, podczas gdy najgorsza sesja dla SPY przyniosła spadek o 2.69%. Zainwestowanie takiej samej kwoty w każdy walor oznacza ekspozycję na bardzo różne dzienne wahania. To właśnie wahania, a nie sygnał, są tym, czego początkujący trader faktycznie doświadcza. Wielkość pozycji według kryterium Kelly’ego przedstawia jedną formalną odpowiedź, a ryzyko koncentracji pokazuje kształt nieformalnego podejścia.
Etap piąty: realizacja transakcji i koszty pomijane w teście historycznym
Dwa rodzaje kosztów, z czego widoczny jest tylko jeden. Prowizje i opłaty regulacyjne pojawiają się na wyciągu. Poślizg cenowy nie jest wykazywany. Jest to różnica między ceną widoczną na ekranie a ceną uzyskaną przy realizacji zlecenia. Jego dolną granicę wyznacza spread bid-ask, czyli różnica między najlepszą ofertą kupna a najlepszą ofertą sprzedaży w danym momencie. Kupujący płacą cenę ask, a sprzedający realizują transakcje po cenie bid. W rezultacie transakcja kupna i sprzedaży pokonuje spread dwukrotnie. Spread nie jest stały.
Dokładny kod SQL dla każdej liczby
WITH quotes AS (
SELECT ticker,
toStartOfInterval(toTimeZone(sip_timestamp, 'America/New_York'), INTERVAL 30 MINUTE) AS bucket,
toFloat64(ask_price - bid_price) / toFloat64((ask_price + bid_price) / 2) * 10000 AS spread_bps
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('AAPL', 'KO')
AND sip_timestamp >= toDateTime('2026-07-17 13:00:00')
AND sip_timestamp < toDateTime('2026-07-17 21:00:00')
AND bid_price > 0
AND ask_price > bid_price
)
SELECT formatDateTime(bucket, '%H:%i') AS et_time,
round(avgIf(spread_bps, ticker = 'AAPL'), 2) AS aapl_spread_bps,
round(avgIf(spread_bps, ticker = 'KO'), 2) AS ko_spread_bps
FROM quotes
WHERE spread_bps > 0 AND spread_bps < 500
GROUP BY et_time
HAVING countIf(ticker = 'AAPL') > 0 AND countIf(ticker = 'KO') > 0
ORDER BY et_timePanel obejmuje 16 półgodzinnych przedziałów w jeden piątek: od przedziału 09:00 przed otwarciem rynku do przedziału 16:30 po zamknięciu. W pierwszym przedziale spread dla AAPL wynosił 10.53 punktów bazowych, a w ostatnim 3.27. W przypadku KO było to odpowiednio 28.87 i 8.04. Najwęższe kwotowania z całego dnia znajdują się w środkowej części wykresu, między tymi dwoma krańcami. Strategia, która zawiera transakcje na otwarciu na dwóch spośród najbardziej płynnych walorów rynku, ponosi inne koszty niż jej wersja realizowana w środku dnia. Test historyczny zakładający zerowe koszty nie uwzględnia żadnego z tych wariantów. Spread bid-ask definiuje tę wartość, dlaczego spready rozszerzają się na otwarciu wyjaśnia przebieg krzywej, a ile kosztuje zawarcie transakcji na akcjach przedstawia pełny koszt kupna i sprzedaży. Między czystym testem historycznym a realnym kapitałem pozostaje jeszcze jeden etap: handel na rachunku demonstracyjnym przed użyciem realnego kapitału.
Które elementy programu nauczania dotyczącego akcji A można przenieść na akcje amerykańskie?
XQuant i podobne materiały opracowano z myślą o chińskich akcjach A i ETF. Sama metoda przenosi się bez zmian: kolejność etapów, definicje, dyscyplina w zakresie przeuczenia, nawyk ujmowania kosztów jako osobnej pozycji zamiast traktowania ich jako kwestii drugorzędnej oraz wszystkie elementy obliczeń dotyczących wielkości pozycji. Wykresy cenowe pozostają wykresami cenowymi. Nie przenoszą się natomiast regulacje, które ich dotyczą.
- Na rynku akcji A obowiązuje rzeczywiste ograniczenie T+1: akcji kupionych dzisiaj nie można sprzedać do następnej sesji. W USA T+1 jest konwencją rozrachunku i nie blokuje handlu w ciągu dnia, choć zasada pattern day trader ogranicza rachunki margin poniżej 25 000 USD do trzech transakcji jednodniowych w ciągu pięciu dni roboczych.
- Akcje A z głównego rynku mogą zmienić wartość maksymalnie o 10% dziennie, a na rynkach wzrostowych limit wynosi 20%. Akcje amerykańskie nie mają dziennego limitu, a przerwy w notowaniach wynikają z przedziałów zmienności i wstrzymań handlu związanych z informacjami.
- Zlecenia dotyczące akcji A są realizowane w pakietach po 100 akcji. Wielu brokerów amerykańskich realizuje zlecenia na ułamkowe części akcji, co zmienia zakres wartości, jakie może wyrażać reguła dotycząca wielkości pozycji.
- W Chinach od strony sprzedaży pobierany jest podatek od transakcji. Sprzedający w USA ponoszą niewielkie opłaty regulacyjne o innym poziomie i innej konstrukcji.
- Struktura sesji jest odmienna, w tym z przerwą w środku dnia w Szanghaju i Shenzhen. Godziny handlu na amerykańskim rynku akcji obejmują ciągłą sesję i kończą się aukcją zamknięcia.
Każda stała dotycząca kosztów lub czasu, skopiowana z kursu do własnego kodu, jest błędem oczekującym na pierwsze zlecenie na rachunku rzeczywistym.
Przypinaj wersję referencyjną, nie plik README
W repozytorium nie ma otagowanych wydań na dzień sierpnia 2026 roku, dlatego trwałym odwołaniem jest commit: 016b66e, z dnia 14 lipca 2026 roku. Ma to znaczenie w przypadku książki, która nadal powstaje. Numery rozdziałów się zmieniają, pliki README są przepisywane, a nagłówki przenoszone. Odnośnik prowadzący do rozdziału siódmego może po cichu zacząć prowadzić do czegoś innego. Należy podać commit i datę oraz zapisać tytuł przeczytanego rozdziału, a nie jego numer. Dzięki temu notatki pozostaną weryfikowalne także rok później. Manuskrypt jest publikowany na licencji CC BY-NC-SA 4.0, a skrypty kompilacji na licencji MIT. Ta sama zasada stanowi ostatnią lekcję samego sylabusa: strategia, której nie można ponownie uruchomić na podstawie przypiętego snapshotu danych, jest opowieścią, a nie wynikiem.
FAQ
Czy można nauczyć się tradingu kwantytatywnego z bezpłatnej książki open source?
Jeśli chodzi o mapę, tak. Otwarty manuskrypt pozwala sprawdzić każde twierdzenie u źródła. Książka nie zapewni jednak danych, kosztów ani zasad obowiązujących na własnym rynku. Właśnie w tym miejscu program napisany dla jednej giełdy przestaje odpowiadać warunkom brokera.
Na którym etapie programu nauki tradingu kwantytatywnego większość początkujących napotyka największe trudności?
Na backteście. Występują tam dwa błędy, a oba poprawiają pozorny wynik. Pierwszy to błąd przetrwania, wynikający z zestawienia instrumentów po fakcie. Drugi to błąd spoglądania w przyszłość, wynikający z realizacji po cenie, której rynek nie opublikował jeszcze w danym momencie. Tylko 50% tickerów notowanych w tamtym czerwcowym tygodniu 2016 pozostawało w obrocie dekadę później.
Jaka jest różnica między błędem przetrwania a błędem spoglądania w przyszłość?
Błąd przetrwania dotyczy uniwersum. Testowane nazwy wybrano dlatego, że przetrwały. Błąd spoglądania w przyszłość dotyczy czasu. Strategia wykorzystuje wartość, która nie istniała jeszcze w chwili, gdy zlecenie miało zostać złożone. Pierwszy zawyża skład uniwersum, a drugi zawyża cenę realizacji.
Czy kurs tradingu kwantytatywnego dotyczący chińskich akcji typu A sprawdzi się w przypadku akcji amerykańskich?
Metoda tak. Zasady rynku nie. Należy zachować kolejność etapów, dyscyplinę ograniczającą przeuczenie oraz rozliczanie kosztów. Następnie, przed zaangażowaniem kapitału, trzeba zastąpić rozwiązania dotyczące danych, ograniczenie sprzedaży w systemie T+1, dzienne limity cenowe i wielkości pakietów ich amerykańskimi odpowiednikami.
Każdy panel powyżej jest zapisanym zapytaniem z umieszczonym pod nim kodem SQL. Należy otworzyć wybrany panel, podmienić tickery lub daty i samodzielnie uruchomić zapytanie na terminalu Strasmore.