Изучите квантовую торговлю по книге с открытым кодом
Книга по количественной торговле с открытым исходным кодом описывает весь путь: от данных до заявки, типичные остановки новичков и применимость к акциям США.
Книга по количественной торговле с открытым исходным кодом — это бесплатная общедоступная учебная программа. В ней последовательно описан весь путь от исходных данных до выставления реальной заявки. Рукопись XQuant: Everyone Can Be a Quantitative Trader, опубликованная пользователем xingwudao на GitHub, по состоянию на август 2026 года получила 686 звёзд. Это наглядный пример такой программы. Её девять глав охватывают путь, который проходят почти все учебные курсы по количественной торговле. На этой странице этот путь разобран по этапам. Для каждого этапа указана характерная проблема. Также отмечено, какие элементы сохраняют применимость при переходе от китайских акций A к акциям США.
Что содержит книга по алгоритмической торговле с открытым исходным кодом?
Если убрать брендинг из любой учебной программы для начинающих, останется пять этапов в следующем порядке: получить и очистить данные, построить на их основе сигнал, проверить этот сигнал на исторических данных, определить размер позиции, затем отправить заявку и учесть издержки. Содержание XQuant в состоянии репозитория на коммит 016b66e от 14 июля 2026 года охватывает те же темы в девяти главах.
- Подготовка, затем глава первая: провести одну стратегию от начала до конца.
- Глава вторая, что покупать: начать с трех ETF.
- Глава третья, сколько покупать: сравнить между собой три метода распределения капитала.
- Глава четвертая, когда торговать: ребалансировка, стоп-лосс, тейк-профит.
- Глава пятая, как оценить качество стратегии: четыре точки зрения.
- Глава шестая, не праздновать успех слишком рано: предотвращение переобучения.
- Глава седьмая, от идеального к реальному: исполнение сделок.
- Глава восьмая, жизнь после запуска: мониторинг, диагностика, итеративное улучшение.
- Глава девятая, поиск новых возможностей: введение в факторные исследования.
Порядок тем заслуживает внимания. Определение размера позиции появляется в третьей главе, до обеих глав о бэктестинге, а факторные исследования рассматриваются в последней главе. Самостоятельное обучение обычно строится наоборот: сначала факторная идея, затем бэктест, а правила определения размера позиции нет вообще. Сопутствующий репозиторий с упражнениями (333 звезды на ту же дату) организован вокруг письменных спецификаций заданий, а не готового кода: читатель поручает AI-ассистенту их реализацию. Умение читать код, написанный не вами, по-прежнему определяет все последующие результаты, поскольку каждая следующая ошибка скрывается в одной детали реализации.
Этап первый: получите данные, затем определите совокупность
Очистка данных — видимая часть работы: исправление ошибочных сделок, пропущенных торговых сессий, сплитов и дивидендных корректировок. Выбор бумаг для анализа — невидимая часть. Именно здесь возникает ошибка выжившего — ещё до появления первой строки кода стратегии. Возьмите все тикеры США, по которым в течение одной июньской недели проходили сделки, отдельно для каждого года, и выясните, сколько из них продолжали торговаться в ту же неделю 2026 года.
Точный SQL-код для каждого числа
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 yearИз 8224 тикеров, торговавшихся в ту неделю 2016 года, 50% продолжали торговаться в ту же неделю 2026 года. Остальные были приобретены, объединились с другими компаниями, сменили название или были исключены из листинга. Бэктест, построенный на текущем списке бумаг, анализирует только те компании, которые сохранились, и приписывает стратегии результат владения компаниями, выбранными задним числом. Начальный источник данных передаст вам этот список выживших без предупреждения: в руководстве по бесплатному API данных фондового рынка рассказывается, какие данные такие источники предоставляют, а какие — нет.
Этап два: превратите данные в сигнал
Сигнал — это правило, которое оценивает акцию в определённый момент времени. Фактор — это сигнал, который, по вашему мнению, работает одновременно для многих акций. Классические примеры — моментум, стоимостной фактор и низкая волатильность. На этом этапе основная ошибка — проверять правила до тех пор, пока одно из них не даст результат. Двадцать вариантов пересечения скользящих средних на данных за одно десятилетие по одному индексу всегда дадут вариант-победитель. Им окажется тот, который лучше всего подогнался под шум. Защита от этой ошибки не выглядит впечатляюще: зафиксируйте правило до его измерения, отложите часть истории и не анализируйте её, учитывайте каждый опробованный вариант и отдавайте предпочтение меньшему числу настраиваемых параметров. В XQuant этому вопросу посвящена целая глава, которая предшествует исследованию факторов. Это правильный порядок.
Третий этап: бэктест, на котором останавливается большинство начинающих
На этом этапе заканчиваются большинство самостоятельных проектов. Обычно это происходит незаметно — с очень привлекательной кривой капитала. Ошибка выжившего, описанная выше, — первая из двух ошибок. Вторая — смещение взгляда в будущее: стратегия использует показатель, который рынок ещё не успел предоставить к моменту выставления заявки. Наиболее распространённый вариант — правило рассчитывается по цене закрытия текущего дня, а сделка исполняется по этой же цене закрытия. Оцените расстояние, которое скрывает такое допущение.
Точный SQL-код для каждого числа
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 monthВ July 2026 среднее расстояние между одним закрытием и следующим открытием составило 40.8 базисного пункта для SPY и 107.4 для NVDA. Базисный пункт — это одна сотая процентного пункта. Все 24 месяцев в панели, начиная с August 2024, имеют положительное значение. Бэктест, который принимает решение на закрытии и исполняет сделку по этой же цене закрытия, получает это расстояние бесплатно в каждой сделке. В реальной торговле такой возможности нет. Смещение взгляда в будущее в бэктестинге подробно разбирает этот механизм, а почему акции испытывают гэпы за ночь объясняет сам гэп.
Этап четыре: определите объём покупки
Проблема здесь — отсутствие правила. Большинство трейдеров-самоучек никогда не формулируют правило определения размера позиции. Поэтому такое правило у них возникает случайно. Обычно они вкладывают одинаковую сумму в каждый инструмент или используют весь доступный денежный остаток. Одинаковые суммы не означают одинаковый риск.
Точный SQL-код для каждого числа
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 DESCЗа двенадцать месяцев по 31 июля 2026 года годовая волатильность COIN составила 68%. Для SPY, инструмента с самой низкой волатильностью в выборке, этот показатель составил 12.7%. В ходе худшей торговой сессии цена COIN закрылась на 13.34% ниже предыдущего закрытия. Для SPY снижение в худший день составило 2.69%. Одинаковая сумма в каждом инструменте приводит к совершенно разным дневным колебаниям. Именно эти колебания, а не сигнал, фактически ощущает начинающий трейдер. В разделе определение размера позиции по критерию Келли изложен один формальный подход. В разделе риск концентрации показана структура неформального подхода.
Пятый этап: исполнение и издержки, которые забывает бэктест
Две категории издержек, но видна только одна. Комиссии и регуляторные сборы отражаются в отчёте. Проскальзывание — нет. Это разница между ценой на экране и ценой, по которой вы заключаете сделку. Его минимальный уровень задаёт bid-ask spread — расстояние между лучшей ценой покупки и лучшей ценой продажи в этот момент. Покупатели платят по цене ask, а продавцы продают по цене bid, поэтому сделка в обе стороны пересекает spread дважды. Spread не является постоянным.
Точный SQL-код для каждого числа
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_timeПанель охватывает 16 получасовых интервалов одной пятницы: от интервала 09:00 до открытия торгов до интервала 16:30 после закрытия. В первом интервале котировки AAPL имели ширину 10.53 базисных пункта, а в последнем — 3.27. Для KO эти значения составляли 28.87 и 8.04 соответственно. Самые узкие котировки дня находятся в середине графика, между этими двумя крайними значениями. Стратегия, которая торгует на открытии двумя наиболее ликвидными бумагами рынка, несёт иные издержки, чем та же стратегия в середине дня. Бэктест с нулевыми издержками не учитывает ни один из этих вариантов. Bid-ask spread определяет величину издержек, почему spread расширяется на открытии объясняет форму кривой, а сколько стоит торговля акцией суммирует издержки полного оборота. Между чистым бэктестом и реальными деньгами есть ещё один этап: бумажная торговля перед торговлей на реальные деньги.
Какие части учебной программы по акциям A share применимы к акциям США?
XQuant и аналогичные системы разработаны для китайских акций A share и ETF. Метод переносится без изменений: порядок этапов, определения, защита от переобучения, привычка указывать издержки отдельной статьёй, а не учитывать их постфактум, и все элементы расчёта размера позиции. Ценовые бары остаются ценовыми барами. Но правила, которые их регулируют, отличаются.
- Для акций A share действует полноценное ограничение T+1: акции, купленные сегодня, нельзя продать до следующей сессии. В США T+1 — это правило расчётов, которое не ограничивает внутридневную торговлю. Однако правило pattern day trader ограничивает маржинальные счета с капиталом менее $25,000 тремя внутридневными сделками за пять рабочих дней.
- Для акций основного рынка A share установлен дневной лимит изменения цены в 10%, а для бумаг рынков роста — 20%. В США дневного лимита нет. Вместо него действуют паузы из-за волатильности и остановки торгов по новостям.
- На рынке A share заявки исполняются лотами по 100 акций. Многие брокеры в США исполняют заявки на дробные акции. Это меняет сам набор размеров позиций, которые может выражать правило управления размером позиции.
- В Китае с продавца взимается гербовый сбор. Продавцы в США платят небольшие регуляторные сборы иного размера и характера.
- Структура торговых сессий также различается. В Шанхае и Шэньчжэне есть дневной перерыв. Часы работы фондового рынка США предусматривают непрерывные торги, которые завершаются закрывающим аукционом.
Любая константа издержек или времени, скопированная из учебного курса в собственный код, — это ошибка, которая проявится при первой реальной заявке.
Фиксируйте ссылку на ревизию, а не на README
По состоянию на август 2026 года в репозитории нет релизов с тегами, поэтому надежной ссылкой служит коммит: 016b66e от 14 июля 2026 года. Это важно для книги, которая еще пишется. Номера глав меняются, файлы README переписываются, заголовки перемещаются, и ссылка, которая вела на главу семь, незаметно начинает вести на другой материал. Указывайте коммит и дату, записывайте название прочитанной главы, а не ее номер — и ваши заметки можно будет проверить и через год. Рукопись опубликована по лицензии CC BY-NC-SA 4.0, а скрипты сборки — по лицензии MIT. Этот же принцип служит последним уроком самой программы: стратегия, которую нельзя повторно запустить на зафиксированном срезе данных, — это история, а не результат.
Часто задаваемые вопросы
Можно ли изучить количественный трейдинг по бесплатной книге с открытым исходным кодом?
Да, для общего понимания. Открытая рукопись позволяет проверить каждое утверждение по первоисточнику. Но книга не может предоставить данные, издержки и правила именно вашего рынка. Поэтому учебная программа, написанная для одной биржи, может не соответствовать условиям вашего брокера.
На каком этапе учебной программы по количественному трейдингу большинство новичков останавливается?
На бэктесте. Именно здесь возникают две ошибки, которые улучшают результат: ошибка выжившего, когда вселенная инструментов составлена задним числом, и ошибка использования будущей информации, когда сделка исполняется по цене, которая еще не была зафиксирована рынком. Только 50% тикеров, торговавшихся в ту июньскую неделю в 2016, продолжали торговаться десять лет спустя.
В чем разница между ошибкой выжившего и ошибкой использования будущей информации?
Ошибка выжившего связана с составом вселенной инструментов: в тест попали бумаги, выбранные потому, что они сохранились. Ошибка использования будущей информации связана со временем: стратегия использует показатель, которого еще не существовало в момент, когда должна была быть выставлена заявка. Первая завышает состав списка, вторая — цену исполнения.
Подходит ли курс по количественному трейдингу на китайском рынке A-акций для американских акций?
Методика подходит. Правила рынка — нет. Сохраните порядок этапов, контроль переоптимизации и учет издержек. Затем замените инфраструктуру данных, ограничение на продажу по правилу T+1, дневные ценовые лимиты и размеры лотов на американские аналоги. Только после этого используйте реальные деньги.
Каждая панель выше представляет собой сохраненный запрос с SQL-кодом под ним. Откройте нужную панель, замените тикеры или даты и самостоятельно выполните запрос в терминале Strasmore.