CNN TürkEnerji Bakanı Bayraktar CNN TÜRK'te: "Hedefimiz 100 bin varilin üzerine çıkmak"RTP DesportoOuro renovado. Iuri Leitão volta a sagrar-se campeão mundial de ciclismo de pistaESPN DeportesSe abre oportunidad para Obed Vargas ante bajas de Koke y CardosoESPNThe expansion no one asked for: CFP's 24-team move has problemsInquirerLacson hits 3 minority senators over bid to oust Erwin TulfoPunchKogi LG poll: Ododo votes, hails peaceful conductХабрVite, OOM и сервер на 4 ГБ: как мы снизили память сборки на 52%ZDF heuteAktuelle Pressemitteilungen des ZDFBBC NewsEngland stunned by Tonga in World Cup openerسكاي نيوز عربيةتقنيات للتخلص من "نوبات الهلع".. هذه تجارب المشاهيرVanguard2027: We’ll defeat Tinubu in 12 battleground states, Makinde’s campaign vowsIl Fatto QuotidianoMigliaia di persone in corteo a Marsiglia: cassonetti bruciati e lancio di petardi
The Daily Newsstand · Free, Always
Saturday, October 17, 2026

Квант трейдинг для каждого и ловушка красивого графика

Translate

Торговая стратегия заработала 57% за год. Коэффициент Шарпа выше трёх. Код помещается на одном экране, график выглядит убедительно.

В этой стратегии вообще нет умения предсказывать рынок. Я сгенерировал 2000 случайных рядов доходности и выбрал самый удачный. На следующем отрезке эта же стратегия теряет 5%.

Разберём, где именно возникают трудности, какие программы решают часть задач и что придётся проверять, когда перед нами окажется настоящий торговый софт.

Что здесь означает слово квант

Речь пойдёт о количественной торговле, от английского quantitative trading. Квантовые компьютеры к ней отношения не имеют.

В основе такой торговли лежит проверяемая гипотеза. Исследователь описывает рыночное явление числами, задаёт правила сделки и проверяет, сохраняется ли результат после расходов и на новых данных.

Гипотеза может быть простой: после сильного движения цена какое-то время продолжает идти в ту же сторону. Может быть сложнее: расхождение цен двух связанных инструментов зависит от стоимости финансирования, доступного объёма и срока до расчётов.

Обученная локальная нейросеть, микросекундная скорость и диплом по математике обязательными признаками здесь не служат. Исследование вполне может касаться портфеля, который меняется раз в месяц.

Полезно различать три вещи.

Понятие

Что оно описывает

Количественный подход

Как мы формулируем и проверяем торговую идею

Алгоритмическая торговля

Как программа выполняет заданные правила

Высокочастотная торговля

Класс задач, где особенно важны скорость и устройство торговой площадки

Поэтому при виде слов «квантовая платформа» или «институциональный алгоритм» сначала стоит выяснить, какую конкретную задачу решает продукт. За одним названием могут стоять исследовательская библиотека, торговый терминал, набор индикаторов или готовый робот.

За что рынок должен вам заплатить

Допустим, стратегия обнаружила закономерность. Следующий вопрос: почему она вообще может приносить деньги?

Возможны разные объяснения.

Идея

Откуда может взяться доход

Что может пойти плохо

Следование за трендом

Движение цены иногда продолжается достаточно долго

Частые развороты дают серию убыточных входов

Возврат к среднему

Временное отклонение цены сокращается

Условия изменились, прежний уровень больше не имеет смысла

Парная торговля

Расхождение связанных инструментов уменьшается

Связь ослабла, вторую позицию дорого открыть или закрыть

Поддержание ликвидности

Участники платят разницу между ценами покупки и продажи за возможность быстро совершить сделку

Исполняется преимущественно та сторона ваших заявок, которая вскоре станет убыточной

Перенос позиции с получением премии

Рынок вознаграждает за принятый риск и связанные с позицией ограничения

Доход за долгий период съедает редкое сильное движение

Это возможные механизмы, которые ещё предстоит проверить для конкретной стратегии. Сам по себе индикатор причины заработка не объясняет.

Даже найденное преимущество может ослабнуть. McLean и Pontiff изучили 97 опубликованных признаков, по которым прогнозировали доходность акций. Средняя доходность соответствующих портфелей после публикации оказалась на 58% ниже уровня исходных исследований. Авторы связывают часть снижения с торговлей участников, узнавших о результатах.

Когда вам предлагают общедоступное правило с большой и стабильной доходностью, полезно выяснить, что мешает остальным участникам использовать его в большем объёме. Иногда ответ существует: ограниченная ликвидность, неприятный риск, сложное исполнение, небольшой доступный объём сделок. Его стоит услышать до обсуждения доходности.

Несколько строк кода скрывают несколько страниц допущений

Возьмём обычное правило: держать актив, когда средняя цена за последние 20 дней выше средней за 100 дней.

fast = close.rolling(20).mean()
slow = close.rolling(100).mean()
target = (fast > slow).astype(int)

Получился ряд желаемых состояний: единица означает держать актив, ноль означает оставаться без позиции. До торговой системы пока далеко.

Нужно договориться, что означает цена close, когда она становится известна и в какой момент можно отправить заявку. Если решение использует окончательную цену закрытия, исполнение по этой же цене требует отдельного обоснования. В простом консервативном тесте можно исполнять заявку после появления сигнала, например на следующем открытии, с учётом расходов.

Дальше появляются практические вопросы. Какой объём купить? Что делать, если денег хватает только на часть лота? Как учитывать дивиденды? Можно ли продать инструмент без покрытия? Где хранится заявка после перезапуска? Как понять, что брокер принял её, если ответ потерялся?

Каждый ответ меняет результат. Две программы с одинаковыми скользящими средними могут получить разные сделки из-за порядка обработки событий и правил исполнения.

Удобный интерфейс позволяет быстрее выразить правило. Все допущения продолжают действовать, даже если программа прячет их за настройками по умолчанию.

Как случайно научить программу видеть будущее

Самый простой способ испортить проверку выглядит почти невинно:

df["buy"] = df["close"].shift(-1) > df["close"]

В текущую строку попала цена следующего периода. Программа покупает, уже зная, чем закончится ожидание. Такую ошибку легко показать на доске. В настоящем исследовании будущее обычно просачивается менее заметно.

Дата отчёта перепутана с датой публикации. Финансовый результат относится к кварталу, который закончился 31 марта. Компания раскрыла его в мае. Стратегия, использующая этот результат в апреле, получила знание раньше рынка.

Часовая свеча закрылась раньше времени. Для решения в 12:15 подтянули окончательные значения свечи с 12:00 до 13:00. В таблице время выглядит подходящим, но большая часть свечи ещё находится в будущем. В документации Freqtrade этот случай разобран при объединении данных разных интервалов.

Масштаб признаков вычислен по всей истории. Перед обучением модели исследователь нормализовал данные, используя среднее и разброс сразу за все годы, включая проверочный период. Будущие наблюдения повлияли на подготовку обучающих данных. Разработчики scikit-learn относят такую обработку к утечке данных.

Список инструментов пережил собственное прошлое. Сегодня мы выбрали действующие компании и проверили, как торговали бы ими десять лет назад. Исчезнувшие, обанкротившиеся и снятые с торгов бумаги в список не попали. Стратегия получила привилегию заранее знать, кто доживёт до конца исследования. Это называют ошибкой выжившего.

Есть ещё дробления акций, дивиденды, пересмотры данных и склейки фьючерсов. Скорректированная цена полезна для расчёта доходности, но при моделировании сделки нужно понимать её связь с ценой, которая действительно существовала в тот день. У поставщика истории должны быть ясные правила обработки таких событий. Пример того, сколько деталей возникает даже для обычных акций, есть в описании корпоративных действий в LEAN.

У всех этих случаев общий вопрос: какая информация была доступна системе к моменту решения? Дата в строке сама по себе ответа не даёт.

Как получить отличную стратегию из случайных чисел

Предположим, мы избежали утечки будущего. Остаётся перебор.

Мы проверили 20 вариантов периода средней, 15 порогов входа, 10 уровней выхода и 8 фильтров. Если перебрать все сочетания, получится 24 000 конфигураций. Часть неизбежно будет выглядеть лучше остальных. Для существования победителя полезный рыночный сигнал не требуется.

Масштаб проблемы можно оценить на простом примере. При 100 независимых статистических проверках, каждая из которых даёт ложное срабатывание с вероятностью 5%, шанс получить хотя бы одно ложное срабатывание составляет:

1 - 0,95^100 ≈ 99,4%

Предполагается, что во всех проверках реального эффекта нет. Результат 99,4% относится именно к независимым проверкам с заданными свойствами. Настройки торговых стратегий часто связаны между собой, поэтому подставлять число прогонов в эту формулу без поправок нельзя. Но сотни похожих попыток тоже нельзя выдавать за одну заранее выбранную гипотезу.

Теперь воспроизводимый опыт из начала статьи. Создадим 2000 независимых искусственных рядов дневной доходности. Для каждого зададим нормальное распределение с нулевым математическим ожиданием и стандартным отклонением 1%. В первой половине выберем ряд с максимальным коэффициентом Шарпа. Затем посмотрим на вторую половину этого же ряда.

import numpy as np

rng = np.random.default_rng(2026)
r = rng.normal(0.0, 0.01, (2000, 504))
train = r[:, :252]
score = np.sqrt(252) * train.mean(1) / train.std(1, ddof=1)
best = score.argmax()
test = r[best, 252:]

print(score[best])
print(np.prod(1 + train[best]) - 1)
print(np.prod(1 + test) - 1)

На первом отрезке победитель заработал 57,47%, его Шарп составил 3,02. На втором отрезке доходность составила минус 5,22%, Шарп оказался около минус 0,23.

Это искусственные ряды результатов, созданные для демонстрации отбора. Здесь нет рыночных котировок и проверки настоящих стратегий. Число 252 задаёт условный торговый год, расходы отсутствуют. Второй отрезок мог случайно оказаться прибыльным: его ожидаемая доходность после выбора по первому отрезку всё равно равна нулю.

Опыт показывает, почему одного красивого графика недостаточно. Нужно знать, сколько графиков построили до него и по какому правилу выбрали именно этот.

Проблема подробно исследована в работе The Probability of Backtest Overfitting. Для оценки результата с учётом отбора Bailey и López de Prado также предложили статистику Deflated Sharpe Ratio. Она учитывает множественный поиск, длину выборки и особенности распределения доходностей. Для её осмысленного применения нужна информация об исследовательских попытках. Один отчёт победителя её не содержит.

Проверочный период тоже можно испортить

Обычный совет звучит разумно: подбирать настройки на одном участке истории, проверять на другом. Это полезный первый шаг.

Проблема начинается, когда второй участок смотрят снова и снова. Первый вариант провалился, поэтому мы изменили фильтр. Второй тоже провалился, поэтому поменяли инструменты. Третий оказался прибыльным, его и опубликуем.

Проверочный участок участвовал в выборе правил. Его независимость закончилась после первых решений, принятых по его результатам.

Рабочая процедура требует дисциплины. Сначала мы выделяем данные для исследования, внутри них выбираем модель и настройки. Потом фиксируем правила и открываем отдельный участок для итоговой проверки. Если после просмотра меняем стратегию, результат становится частью дальнейшего исследования. Для следующего независимого вывода потребуется новый материал.

Полезна и последовательная проверка по времени, которую часто называют walk-forward. Например, на данных за два года выбираем параметры, следующие три месяца используем только для проверки. Затем сдвигаем окно и повторяем процедуру. Длины окон здесь условные: они зависят от частоты сделок и характера гипотезы.

Такая проверка оценивает целиком процедуру, включая переобучение. Правило «переобучаться раз в квартал» тоже является частью стратегии и само может оказаться результатом перебора.

С временными рядами нужно сохранять причинный порядок. Обычное случайное перемешивание строк способно отправить будущие наблюдения в обучение. Именно эту проблему учитывает TimeSeriesSplit в scikit-learn.

При этом одного деления по времени бывает мало. Если целевая переменная для сделки содержит доходность следующих пяти дней, последние обучающие примеры могут захватить движение уже внутри проверочного периода. Такие пересечения нужно убрать или разделить достаточным промежутком. Величину промежутка определяют по устройству данных и цели модели.

Проверка на истории полезна ещё и тем, что быстро отбрасывает слабые идеи. Сложности начинаются, когда от неё ждут окончательного доказательства будущего заработка.

Комиссии могут оказаться больше всей вашей идеи

Допустим, без расходов стратегия в среднем зарабатывает 0,12% на полный вход и выход из позиции. Для суммы сделки 100 000 рублей это 120 рублей.

Зададим условные расходы:

Статья

За вход и выход

В рублях при сумме 100 000 рублей

Результат до расходов

+0,12%

+120

Комиссии по 0,02% на сторону

−0,04%

−40

Пересечение спреда

−0,04%

−40

Дополнительное проскальзывание

−0,06%

−60

Результат после расходов

−0,02%

−20

Здесь доход до расходов считается по средней цене между лучшей покупкой и лучшей продажей. Спред учтён отдельно. Под дополнительным проскальзыванием понимается дальнейшее ухудшение исполнения из-за задержки и доступного объёма. Если ваша оценка проскальзывания уже включает спред, повторно вычитать его нельзя.

Все ставки в таблице придуманы для примера. На практике они зависят от инструмента, площадки, тарифа, типа заявки и времени сделки. Для коротких позиций добавляется стоимость заимствования, для части производных инструментов важны расходы на финансирование и перенос позиции. Периодические платежи по бессрочным контрактам могут как уменьшать, так и увеличивать результат.

На этом расчёт затрат не заканчивается. Из итогового дохода проекта придётся оплачивать данные, серверы, программное обеспечение и собственное время. Налоги считают с учётом правил конкретного счёта и юрисдикции.

Особенно опасен вывод «сейчас прибыль маленькая, потом увеличу объём». При росте заявки меняется цена исполнения. На ближайшем уровне может оказаться мало встречного объёма, часть сделки уйдёт по худшим ценам. Доступная прибыль ограничена ёмкостью стратегии.

У маленького счёта здесь есть преимущество: некоторые сделки он совершает почти незаметно для рынка. Но расходы на данные и инфраструктуру распределяются на меньшую сумму капитала.

Торговые издержки вполне поддаются исследованию. Frazzini, Israel и Moskowitz анализировали реальные исполнения крупного управляющего и показывали, как затраты зависят от размера сделки и характеристик инструмента. Их результаты также напоминают, что расходы можно снижать качеством исполнения. Универсальная надбавка «на всякий случай» уступает измерениям на подходящем рынке. Trading Costs.

Чего свеча не расскажет об исполнении

Свеча хранит цену открытия, максимум, минимум и цену закрытия за интервал. Обычно к ним добавляют объём. Запись компактная, но большая часть событий внутри интервала потеряна.

Представим минуту, в которой цена открылась на 100, поднималась до 103, опускалась до 97 и закрылась на 101. У открытой позиции стоят стоп на 98 и цель на 102.

Что исполнилось первым? По такой свече определить нельзя. Порядок движения мог дать прибыль, убыток или вовсе другую последовательность событий с учётом времени входа. Тестирующая программа вынуждена принять правило.

С лимитными заявками возникает отдельная проблема. Касание нужной цены не обещает исполнение вашей заявки. Перед вами может находиться очередь. До цены могли дойти сделкой на небольшой объём, которого хватило только заявкам впереди.

И обратная ситуация: выставленная покупка наконец исполнилась, после чего цена продолжила падать. Для стратегии поддержания ликвидности важно, почему встречный участник согласился на вашу цену. Удобные исполнения и плохие последующие движения могут приходить вместе.

Более подробная история сделок и стакана помогает уточнить моделирование, но тоже имеет пределы. Записанный рынок существовал без вашей дополнительной заявки. Из записи нельзя полностью восстановить реакцию остальных участников на ваше присутствие. Эта граница прямо отмечена в документации NautilusTrader.

Отсюда простой вывод для выбора данных: их подробность должна соответствовать вопросу. Для первого исследования месячного сигнала могут подойти дневные цены. Стратегия с короткими целями, чувствительная к очереди и задержкам, требует совсем другой проверки.

Процент выигрышных сделок почти ничего не объясняет

Можно закрыть 99 сделок с прибылью по 100 рублей и одну с убытком 20 000 рублей. Доля прибыльных сделок составит 99%, итоговый результат будет минус 10 100 рублей ещё до расходов.

Поэтому рекламное «наш робот угадывает в 80% случаев» оставляет почти все важные вопросы открытыми. Как соотносятся средняя прибыль и средний убыток? Какой риск остаётся в незакрытых позициях? Что происходит при резком разрыве цены?

График баланса тоже способен создавать ложное впечатление. Если робот фиксирует небольшие прибыли и долго держит убыточные позиции открытыми, баланс растёт. Стоимость счёта с учётом этих позиций может в то же время падать. Для оценки нужна полная стоимость портфеля, включая текущие прибыли и убытки.

Например, сетка заявок может регулярно закрывать небольшие движения цены и одновременно накапливать актив на падении. Усреднение улучшает среднюю цену покупки ценой увеличения позиции. Проверять такую систему нужно с учётом всего накопленного объёма, доступного капитала и возможности закрыться после затяжного движения в одну сторону.

Коэффициент Шарпа учитывает среднюю избыточную доходность и её разброс. В обычной записи для дневных данных его годовую оценку часто считают так:

Шарп = средняя дневная избыточная доходность
       / стандартное отклонение дневной доходности × √252

Избыточная доходность здесь считается относительно подходящей безрисковой ставки. Множитель √252 соответствует принятому в примере числу торговых дней и требует допущений о временной зависимости доходностей. Для другого календаря и зависимых наблюдений механический пересчёт способен ввести в заблуждение. Эта проблема подробно разобрана у Andrew Lo в The Statistics of Sharpe Ratios.

Шарп удобен для сравнения, но редкие крупные потери и короткая история ограничивают его полезность. Максимальная просадка тоже описывает только уже увиденный путь. Будущая просадка вполне может оказаться глубже.

Тысяча сделок не обязательно даёт тысячу независимых наблюдений. Несколько десятков позиций, открытых на одном движении рынка, могут выражать почти одну и ту же ставку.

Наконец, нужен ориентир. Если стратегия заработала 25%, а сопоставимый по риску пассивный портфель за тот же период дал больше, цифра сама по себе мало что доказывает. При сравнении важно учитывать риск, долю времени в позиции и ограничения капитала.

У работающего робота бывают очень дорогие ошибки

Представим, что торговая идея пережила все проверки. Теперь программа отправляет настоящие заявки.

Она послала команду на покупку и не получила ответ. Что произошло? Возможно, запрос не дошёл. Возможно, биржа приняла заявку, а потерялось только подтверждение. Слепая повторная отправка может удвоить позицию.

Заявка исполнилась частично, после чего процесс перезапустился. В локальной базе осталось старое состояние. Следующий торговый сигнал рассчитан уже на неверный объём.

Данные перестали обновляться, но соединение ещё выглядит открытым. Стратегия продолжает принимать решения по устаревшей цене.

Эти случаи требуют журнала событий, устойчивых идентификаторов заявок, сверки с брокером и понятного поведения при неизвестном состоянии. Перед отправкой нужны проверки объёма, доступного капитала, свежести данных и допустимой частоты команд. Предел убытка на экране бесполезен, если его нарушение никак не влияет на торговлю.

Остановка процесса сама по себе может оставить на площадке действующие заявки и открытые позиции. Поэтому у аварийной остановки должен быть определённый порядок действий, включая отмену заявок и проверку фактического состояния счёта.

Известный пример масштаба последствий произошёл 1 августа 2012 года. По материалам SEC, ошибка развёртывания кода активировала дефектную функцию маршрутизатора Knight Capital. За первые 45 минут он отправил более четырёх миллионов заявок, пытаясь обработать 212 клиентских поручений. Потери фирмы превысили 460 млн долларов. Разбор SEC.

У этого случая другой масштаб и назначение системы, чем у частного торгового робота. Он показывает вполне переносимую проблему: автоматизация быстро увеличивает последствия ошибки, когда ограничения и реакция на сбой устроены плохо.

Нейросеть сокращает время написания кода

С языковой моделью гораздо проще получить первый вариант стратегии. Она напишет обработку таблицы, вызовы библиотеки, отчёт и пояснения к результату. Это полезная экономия времени.

При этом проверить получившийся код всё равно нужно. В нём могут оказаться сдвиг в неверную сторону, утечка при объединении таблиц, неправильный расчёт позиции или исполнение по недоступной цене.

Есть и проблема самого способа исследования. Если за вечер генерировать сотни вариантов и выбирать самый прибыльный, скорость написания кода увеличивает число попыток. Вместе с ним растёт шанс выбрать случайного победителя.

Сложная модель дополнительно требует контроля признаков, целевой переменной, процедуры обучения и всех решений по выбору архитектуры. Обычные правила чистого эксперимента продолжают действовать.

Для моделей, обученных на текстах, возникает ещё один вопрос: что они уже знают о проверяемом прошлом? Если современную модель попросить оценить старую новость, сведения о последующих событиях могли попасть в её обучение. Такой риск исследуется в работе Assessing Look-Ahead Bias in Stock Return Predictions Generated By GPT Sentiment Analysis. Использование старой даты в запросе само по себе историческую чистоту не обеспечивает.

Что именно делает реальный торговый софт

Сравнивать все программы одной таблицей доходности бессмысленно: они обслуживают разные части работы. Одни ускоряют исследование, другие моделируют исполнение, третьи организуют торговлю на площадке. Ниже разобраны семь примеров с разными задачами.

vectorbt

Удобная точка входа для исследований на Python. Идея библиотеки состоит в обработке массивов данных: разные инструменты и настройки можно представить отдельными столбцами и быстро посчитать много вариантов. Для ускорения используются скомпилированные вычисления. Устройство vectorbt.

Упрощённая последовательность работы выглядит так:

Цены → массивы признаков → сигналы → моделирование портфеля → статистика

Например, мы задаём несколько пар периодов скользящих средних, получаем сигналы пересечения и сравниваем результаты. Portfolio.from_signals строит портфель по входам и выходам; другие способы моделирования дают более подробный контроль. В API предусмотрены комиссии, проскальзывание и ограничения размера заявки. Моделирование портфеля.

Главная польза здесь в скорости эксперимента. Она особенно ценна при изучении устойчивости идеи: что происходит в соседних настройках и на разных отрезках истории.

При разборе нужно смотреть, как заданы цены исполнения, время сигнала, общий капитал и порядок операций. Если несколько инструментов используют одни деньги, очередность покупки и продажи влияет на доступный остаток.

Быстрый перебор сам по себе не исправляет процедуру отбора. Он позволяет быстрее получить и содержательный результат, и красивую случайность.

LEAN и QuantConnect

LEAN представляет собой движок с открытым исходным кодом для исследований, проверки на истории и реальной торговли. Он обрабатывает события и поддерживает стратегии на Python и C#. QuantConnect предоставляет платформу и сервисы вокруг него. Репозиторий LEAN.

В Algorithm Framework торговая логика разделяется на части:

Выбор инструментов → прогнозы → целевой портфель → ограничения риска → заявки

Модель Alpha создаёт прогнозные объекты Insight. Построение портфеля преобразует их в желаемые позиции PortfolioTarget. Затем блок риска может изменить цели, после чего исполнитель отправляет заявки для достижения нужных позиций. Описание Algorithm Framework.

Такое разделение помогает понять, откуда взялось конкретное действие. Один и тот же прогноз может привести к разному размеру позиции при разных правилах риска.

Для теста доступны модели комиссий, исполнения и проскальзывания. Важная деталь: у DefaultBrokerageModel модель NullSlippageModel задаёт нулевое проскальзывание. Это документированное допущение, которое пользователь должен оценить применительно к своей торговле. Оно не означает, что проскальзывание отсутствует во всех конфигурациях LEAN. Модели проскальзывания.

При разборе такой системы полезно пройти от прогноза до исполнения одной заявки и проверить все выбранные модели. Сам факт работы через профессиональный движок реалистичность настроек не гарантирует.

Freqtrade

Freqtrade ориентирован на автоматическую торговлю криптовалютами. Стратегия на Python рассчитывает индикаторы, отмечает условия входа и выхода. Отдельно задаются параметры позиции, стопы и другие правила. В исследовании используется история свечей, при реальной торговле система взаимодействует с биржей. Описание стратегии.

Общая логика:

Свечи → индикаторы → условия сделки → ограничения → торговая команда

Для поиска настроек есть Hyperopt. Он многократно оценивает варианты по выбранной функции потерь. Качество результата зависит в том числе от того, что именно эта функция поощряет и какие периоды участвуют в выборе. Документация Hyperopt.

Здесь особенно полезно прочитать список допущений исторического теста. В нём указано исполнение по запрошенной цене без проскальзывания, если цена попадает внутрь диапазона свечи. Это правило симулятора. Для реальной заявки дополнительно важны доступный объём, очередь и время отправки. Допущения тестирования Freqtrade.

У проекта есть команды lookahead-analysis и recursive-analysis. Первая ищет признаки использования будущего через сравнение повторных прогонов. Вторая помогает увидеть, как значения индикаторов зависят от количества предшествующих свечей. Это полезные средства диагностики со своими границами. Например, не сработавший во время проверки сигнал останется непроверенным. Lookahead analysis, Recursive analysis.

При будущем разборе Freqtrade интересно проверить, насколько итог зависит от допущений по свече и сохраняется ли результат после ограничения перебора параметров.

Hummingbot

В Hummingbot удобно изучать стратегии поддержания ликвидности и взаимодействие с криптовалютными площадками. В архитектуре Strategy V2 контроллер получает рыночные данные и формирует команды на создание или остановку исполнителей. Исполнители ведут жизненный цикл торговых действий. Архитектура Strategy V2.

Данные площадки → контроллер → исполнитель → заявки и их состояния

Контроллер отвечает за логику стратегии. Исполнитель занимается открытием, обновлением, отменой заявок и завершением операции по заданным условиям. Контроллеры, Исполнители.

Простейшая идея двустороннего котирования звучит привлекательно: держать заявку на покупку ниже текущей цены и заявку на продажу выше. Если обе исполнились при подходящем движении, разница может покрыть расходы и дать прибыль.

Но рынок не обязан исполнять стороны попарно. На падении можно накопить купленный актив. При попытке уменьшить такую позицию возникнут новые расходы. В схеме с хеджированием на другой площадке добавятся риск задержки, доступность капитала и возможность исполнить вторую сторону сделки.

Поэтому оценка такого софта должна включать изменение запасов актива и результат после выравнивания позиций. Собранный спред без оценки оставшегося риска создаёт неполную картину.

NautilusTrader

NautilusTrader строится вокруг обработки событий и разделения компонентов торговой системы. В нём есть движки данных, риска и исполнения, учёт портфеля, стратегии и адаптеры площадок. Историческая проверка и работа с реальными подключениями используют общее торговое ядро. Архитектура NautilusTrader.

Для заявки путь можно представить так:

Стратегия → RiskEngine → ExecutionEngine → адаптер → площадка

По обратному пути приходят события, которые меняют состояние заявки и позиции. Перед отправкой работают настроенные проверки полей, объёма, баланса и частоты команд.

Такая архитектура интересна для разбора границы между исследованием и исполнением. В историческом режиме площадку заменяет симуляция, которую тоже нужно настроить под имеющиеся данные.

В частности, тип модели стакана должен соответствовать типу истории. По дневным свечам нельзя восстановить очередь отдельных заявок. Даже моделирование очереди по подробной истории ограничено видимыми данными и правилами площадки. Данные исторической проверки, Исполнение и оценка очереди.

При обзоре стоит проверять качество данных и допущения исполнения вместе с производительностью движка. Скорость обработки событий не измеряет точность модели рынка.

MetaTrader 5

В MetaTrader 5 торговую логику обычно реализуют в советнике на MQL5. Советник реагирует на события, а встроенный тестер воспроизводит исторические условия в выбранном режиме. Доступны разные способы представления движения цены, включая реальные тики и тики, сгенерированные из менее подробной истории. Тестирование программ MQL5.

Исторические события → советник → торговые команды → модель исполнения → отчёт

Встроенные средства позволяют искать параметры и проверять выбранные варианты на отдельном периоде. Настройки тестера включают капитал, плечо, комиссии и условия моделирования. Тестирование и оптимизация советников.

В документации есть важный нюанс: даже в режиме реальных тиков при отсутствии данных или их несоответствии минутным барам тестер в описанных случаях использует сгенерированные тики. Поэтому название режима стоит читать вместе с правилами обработки истории.

Для обзора готового советника интересны исходный код, происхождение данных, реальные расходы и открытые убыточные позиции. Отчёт оптимизации не отвечает на эти вопросы автоматически.

OsEngine

OsEngine даёт пример системы, которую можно разбирать в контексте российского рынка. В официальном репозитории перечислены подключения, включая MOEX, и несколько отдельных программ для разных этапов работы. Репозиторий OsEngine.

Логика набора хорошо видна по его частям:

OsData → OsTester → OsOptimizer → OsTrader

OsData загружает историю. OsTester моделирует торговлю стратегий с общим портфелем. OsOptimizer подбирает параметры и поддерживает последовательные фазы проверки. OsTrader запускает роботов в торговлю.

Такой набор позволяет пройти путь от данных до работающего робота внутри одной среды. Он также оставляет хорошие точки для проверки: как подготовлена история, что оптимизируется, какие ограничения действуют в тесте и насколько они совпадают с настоящим подключением.

Перечень коннекторов в репозитории описывает возможности проекта. Доступность конкретного подключения для вашего счёта, условия брокера и поддержку нужных операций потребуется выяснять отдельно.

Можно ли заниматься этим одному

Да, частный исследователь может разрабатывать и проверять количественные стратегии. Многие первые эксперименты помещаются на обычном компьютере. Успешно начать обучение вполне реально.

Но обещание «подходит каждому» смешивает доступ к инструментам с шансом получать доход. Для исследования придётся разобраться хотя бы в статистике, устройстве данных, правилах рынка и исполнении заявок. Часть программирования можно переложить на библиотеку, конструктор или языковую модель. Ответственность за смысл расчёта остаётся у автора стратегии.

Сложность сильно зависит от выбранной задачи. Дневной или недельный сигнал оставляет больше времени на обработку данных и исполнение. Торговля короткими расхождениями цен между площадками чувствительна к задержкам и доступному капиталу на каждой стороне. Эти проекты требуют разных ресурсов.

Небольшой объём торговли иногда позволяет работать в нише, которая слишком мала для крупного фонда. Это возможное преимущество частника. Его ещё нужно выразить в проверяемых правилах и цифрах после расходов.

Для оценки экономики полезна простая арифметика. При условной доходности 20% годовых капитал 100 000 рублей даёт 20 000 рублей за год до налогов и постоянных расходов. Сама ставка 20% здесь выбрана для расчёта и ничего не обещает. Пример показывает, почему хороший процент и существенный денежный доход требуют разных оценок.

Попытка компенсировать маленький капитал большим плечом увеличивает чувствительность к движению цены, расходам и требованиям по обеспечению. Плечо не меняет причину, по которой стратегия должна зарабатывать.

И ещё одна неприятная часть работы: после нескольких месяцев качественного исследования можно получить вывод «эта идея не выдержала проверку». Для исследовательского проекта это содержательный результат. Человеку, которому обещали быстрый дополнительный доход, он вряд ли покажется достаточным.

С чего начать разбор конкретной программы

Установку и красивый отчёт стоит считать только началом обзора. Настоящая проверка начинается с одного понятного правила и возможности проследить каждую его сделку.

Для предметного разбора понадобятся ответы на несколько вопросов.

  1. Какую гипотезу проверяем? Правило можно изложить словами и связать с возможным источником дохода.

  2. Что знала система в момент решения? Понятны время публикации данных, часовые пояса и правила объединения таблиц.

  3. Сколько вариантов мы уже попробовали? Сохранились результаты неудачных попыток и критерий выбора.

  4. Как моделируется исполнение? Заданы цены, комиссии, доступный объём, задержки и правила частичного исполнения.

  5. Где действительно независимая проверка? Её результаты не участвовали в повторном подборе правил.

  6. Откуда взялась прибыль? Видно влияние рыночного движения, отдельных инструментов и нескольких удачных эпизодов.

  7. Что произойдёт при сбое? Проверены обрыв связи, повторное сообщение, перезапуск и неизвестное состояние заявки.

Несколько коротких опытов часто рассказывают о программе больше, чем длинная демонстрация интерфейса. Увеличить расходы. Исполнить заявку позже. Немного изменить параметры. Убрать самый удачный инструмент. Отдельно посмотреть результат без нескольких лучших сделок. Эти опыты оценивают чувствительность, поэтому их нужно показывать вместе с исходным результатом.

Затем можно сравнить исторические сигналы с наблюдением в реальном времени без денег. Такой режим проверяет расписание, данные и поведение программы, но сохраняет ограничения виртуального исполнения. Только сделки на площадке позволяют измерить фактические исполнения конкретного счёта. Даже небольшой опыт реальной торговли даст наблюдения лишь для тех условий и объёмов, которые в нём встретились.

Для следующего разбора программы полезно сохранить версию кода, настройки, источник данных и полный журнал операций. Тогда другой человек сможет проверить, почему возникла конкретная сделка и как посчитан её результат.

Доступ к торговым инструментам стал проще. Проверка идей всё ещё требует времени, аккуратности и готовности отказаться от результата, который очень хочется сохранить.

Самая лёгкая часть квант трейдинга состоит в том, чтобы найти прибыльную стратегию на уже известной истории. Всего 2000 случайных рядов хватило, чтобы получить +57% и Шарп выше трёх.

Прежде чем подключать деньги, стоит выяснить, сколько попыток понадобилось вашему роботу.

View the original on Хабр →

KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.