Блог им. dmitry0xff

Эффективный трейдинг и автоматизация

    • 11 марта 2025, 17:06
    • |
    • Dmitry
  • Еще

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

[ Предыстория ]

По основной профессии — я программист. Почти 20 лет в этой сфере. Основной язык — Golang (это как бы современный Си). Трейдингом увлекся еще в далеком 2009. Тогда начал торговать акциями на Московской бирже. Именно спекулятивный трейдинг. Трейдил где-то 2 года. Опыт был успешным, купил себе первую хорошую машину.

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

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

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

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

Возможно, прошлый опыт спекулятивного трейдинга и сыграл против меня. Т.к. я пропустил немало хороших точек для входа в рынок. Я тогда еще выработал привычку — без четкой стратегии обработки риска, которую я придерживаюсь безусловно, я не открываю ни одной позицию. Я просто не мог физически заставить себя купить какой-то инструмент без его тщательного исследования и просто ждать. Наблюдая, как он проваливается в сильную просадку, если не повезет (что происходит намного чаще). Аналогично, для меня тактика усреднения — это что-то на уровне исцеления больного знахарем-шаманом. Т.е. тут как повезет. Поэтому просто наблюдал за рынком и делал записи.

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

Так же, я смотрел на рынок именно как трейдер и понимал его вероятностную природу. Что имея даже соотношение риск-профит 1/99, если не обрабатывать риск, то рано или поздно нарвешься на этот ничтожный процент, который сольет твой депозит. Это чистая теория вероятностей. Поэтому для меня единственная хорошая стратегия спекулятивного трейдинга — это сумма стратегий, которые эффективно работают сейчас и эффективно будут работать через 10 лет. Другими словами трейдер постоянно исследует и адаптируется под рынок. Под каждую торговую пару.

[ Разработка системы ]

В 2022 году, после некоторых событий в нашей стране, я уволился из компании, где работал, т.к. та сильно поплыла в экономическом плане. И приступил к разработке (программированию) системы. К тому моменту уже было накоплено масса данных, исследований, наработок.

Что лежит в основе любой эффективной стратегии трейдинга? То, что на рынке периодически возникают моменты с хорошим соотношением риск/профит. В эти моменты рынок становится значительно более прогнозируемым. Но эти моменты длятся очень недолго и быстро откупаются. Конечно же, нужно иметь адское терпение и дисциплину, чтобы дожидаться таких моментов. Я, как трейдер, прекрасно понимаю насколько это эмоционально сложно. Для трейдера это усугубляется еще и тем, что такие кейсы могут возникнуть на любой торговой паре в любой момент времени. Вручную отслеживать все ликвидные пары просто невозможно. А это вызывает стресс от упущенной возможности.

Далее, хорошая спекулятивная стратегия — это небольшой, но стабильный профит. Если пытаться хапнуть сразу много, то рано или поздно хапнешь большой минус.

[ Первая задача ]

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

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

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

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

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

[ Вторая задача ]

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

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

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

Результат. Перенести стратегии на программный уровень возможно, используя доступные мне ресурсы.

[ Третья задача ]

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

Важная часть — это скорость расчетов. Данные поступают непрерывно и данных много. Считать нужно так же много и очень быстро. Система не ориентируется на высокочастотный трейдинг (HFT), поэтому микросекунды здесь не нужны. Переходим на уровень, который измеряется в миллисекундах. Это тоже подразумевает очень быстрые расчеты.

Отдельный большой блок — это система обратного тестирования или бэктестинг. Здесь ключевые моменты: точность (было описано в первой задаче) и скорость. Чем больше стратегий за единицу времени можно протестировать, тем больше гипотез можно проверить.

Конечно, сперва я посмотрел, что уже есть на рынке. И конечно же, уже есть готовые продукты.

Первое, брать готовые IT-решения — это всегда некоторый «кот в мешке». Всегда есть риск, что работать они будут не так, как надо. Будут написаны криво, что исходя из моего опыта, обычно и происходит. Это банальная экономия на качественных специалистах. Тем более, что потеря ваших денег это не проблема сторонней платформы — это ваша проблема. «Вы плохо прочитали нашу документацию и лицензионное соглашение.»

Второе, те продукты, которые я нашел были написаны на языке C# (си-шарп). Классный язык, но такой же ресурсоемкий, как и Java. Мне же нужен был язык, который позволяет эффективно создавать микросервисы и использовать меньше серверных ресурсов. Т.к. чем больше потоков и памяти используется по назначению, тем быстрее работает система. Тем больше данных можно обработать за единицу времени.

Респект языку Golang за его скорость и классную систему управления потоками. Можно было написать проект на чистом Си или на Rust. Но это было бы заметно дольше/дороже. Golang, по скорости исполнения + стоимость разработки, подходит намного лучше. Тем более, что наиболее нагруженные участки системы можно без проблем написать на Си.

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

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

Результат. Есть платформа для трейдинга и для быстрого создания стратегий. Есть платформа для бэктестов.

[ Четвертая задача ]

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

Первое, что приходит в голову — это машинное обучение. Но, как человек, который долго работает IT, я прекрасно понимаю, что провести качественное ИИ-обучение — это трудоемкая задача. Вариант взять некоторый ИИ-движок и скормить ему массу биржевых данных и получить хороший результат… тут кому как повезет. Для меня это, как хаотично ставить точки на листке бумаги и получить свой автопортрет. А на везение я не хочу опираться. Только на расчеты и вероятности.

Поразмыслив над этой задачей некоторое время, я разбил ее на две составляющие. Первая — классические программные алгоритмы. Они будут представлять из себя каркас логики и все значимые расчетные величины. Вторая — это ИИ-компоненты. Они будут дополнять первую часть, добавляя новый функционал. В случае сбоя (неверного поведения) во второй части, ее можно было бы отключить, без критического ущерба для всей системы. Чисто экономически, такой вариант компоновки системы был для меня наименее рискованным и при этом эффективным. Поиск ошибок в обученной ИИ-модели — сложное и трудоемкое занятие. Намного сложнее, чем найти и исправить ошибку в классическом программном алгоритме.

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

Что мне было нужно:

1) Сделать множество расчетов по графикам торговой пары. Большинство параметров не видны невооруженным глазам. Их нужно рассчитать. Применить математику и статистику.

2) Подать результаты расчетов на вход в модуль анализатора и контроллера стратегий.

3) Принять торговое решение.

Важные моменты:

1) Учитываем, что поведение каждой торговой пары уникально.

2) Стратегия должна быть самоадаптируемой к меняющемуся рынку.

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

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

Результат. Запрограммированная стратегия (комплекс атомарных стратегий).

[ Пятая задача ]

Тестирование стратегии. Фактически, это наличие гипотезы, которая должна быть проверена на ее истинность или ложность.

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

Данных было много: 3.5 года посекундных OHLCV-свечей, для 20 самых ликвидных торговых пар (инструментов).

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

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

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

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

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

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

Результат. Что получилось по итогу. Стратегия (комплекс атомарных стратегий) показала 155% годовую доходность при средней просадке в 8.5%. Плечо было взято 3х.

[ Тестирование на исторических данных ]

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

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

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

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

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

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

[ Гипотеза эффективного рынка ]

Гипотезу сформулировал американский экономист Юджин Фама в 1965 году. Пересказывать ее нет смысла. Я лишь хочу привести фразу из недавнего интервью Юджина Фама. Он говорит: «Есть моментум, который противоречит теории, я это отрицать не могу».

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

[ На каком этапе проект ]

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

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

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

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

Разработка и программирование торговых стратегий — это трудоемкий процесс. Его предстоит оптимизировать и ускорить. Чтобы от гипотезы до получения эффективной торговой модели проходило минимум времени.

[ Какие цели у проекта ]

Система, которая эффективно трейдит сейчас. И будет эффективно трейдить через 5 лет, и через 10, и через 20.

Основной ориентир — это высокая доходность при низкой просадке.

Какие рынки: криптовалюта, валютный рынок Форекс, фондовый рынок, товарный рынок.

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

[ Что точно не планируется ]

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

Продавать сигналы. Аналогично тиражированию стратегий. Итоговый результат будет такой же.

[ Кто дочитал до конца ]

Если вы: трейдер с опытом реальной торговли или у вас есть экспертиза в аналитике, или в финансовой сфере, или вы — программист с опытом разработки подобных систем, то пишите свои комментарии. Будет очень полезно услышать ваше мнение. Заранее спасибо!

20 комментариев
— Я 50 лет все обдумывал, просчитывал и наконец с уверенностью могу сказать: «Я созрел и готов вступить в половые отношения!»
avatar
myaucha, :)))
avatar
Система не ориентируется на высокочастотный трейдинг (HFT), поэтому микросекунды здесь не нужны. Переходим на уровень, который измеряется в миллисекундах.

Если среднее время в позиции не больше нескольких секунд, то почему это не HFT? А если это среднее время в позиции не меньше 5 минут, то зачем миллисекунды?
avatar
А. Г., среднее время в позиции — 1-3 дня. Быстрые расчеты нужны, чтобы меньше зависеть от устаревания данных и попадания на локальные коррекции. А HFT — это высокие технологии. Тут FPGA нужен и Direct Access. Это сразу очень дорого.
avatar
Не взлетит, имхо. Потому что в итоге нет главного — торговой системы. Уже готовые системы с трудом удается переложить на код.
avatar
Volahub, Торговая система то как раз и есть. Я перекладывал на код то, как сам трейдил вручную.
avatar
Не очень понятно чего вы хотите услышать, но если кратко, то сколько вы там лет программировали на php (современном Си) имеет очень мало корреляции с успехом в трейдинге, как и желание сделать мега систему для заработка денег. Желающих много, в том числе с умением программировать, достигших каких-то разумных результатов мало
avatar
Михаил, согласен с вами. В принципе, в любой сфере, достигших успехов мало. И это нормально. Я использую не только умение программировать, но и умение торговать. Что же я хочу услышать — в принципе, как раз то, что в коментах и пишут. Мнение со стороны.
avatar
Dmitry, я если честно не понимаю, какую пользу вы извлечете из услышанного. С одной стороны люди с очень разными подходами добиваются успеха, с другой стороны, другие люди ровного с такими же подходами не добиваются успеха. Поэтому рассуждение на пальцах мало пользы несет
avatar
Хороший пример тут есть у одного человека, который хорошо знает C# — давно понял, что легче впаривать разным лохам программку для автоматизации торговли, чем торговать самому. В итоге каждый день, а то и два мы видим в этом замечательном форуме посты про его мегапрограмму
avatar
Михаил, и это тоже, к сожалению повсеместная практика. Но это не только в трейдинге происходит. Почти везде пытаются что-то впарить. Прикрываясь бонусами, скидками, акциями и т.п. В расцвете всяких Остапов бОльшая вина лежит на людской жадности и глупости.
avatar
Или вот еще один — рисовал дизайн мега системы c DL и прочими плюшками, но как-то до результата не дошло. Но ролики были прикольные — всяко лучше мути про OsEngine
avatar
Михаил, архитектура, в целом, аккуратная. Тут вопрос про стоимость такой разработки. Есть деньги — можно сделать. Будет ли работать — неизвестно. Нужен финплан, расчеты.
avatar
Как же мало реплик про стратегии на СЛ? Архи мало! И зря. В который раз читаю очередного искателя грааля. Если решишь проблему статического периода в индикаторах, то все решишь. Коридор — это правильно.Регрессия — это правильно.Но прогноз — это вероятность твоего знания законов графика .
В проге Нирвана 400 стратегий выдают один сигнал.Там компот из всех индюков из всех таймов. Но вопрос — сила индикатора? Сила тренда? Кто знает силу каждого индюка? Я знаю все индюки тк 7 лет посвятил Метастоку 7.2.В 2007 г я отказался от индикаторов в пользу ВА Эллиота. Кроме того есть правило размаха свечи в каждом тайме. Это VSA.Эти 2 знания и есть вход в свечной анализ. Торговать надо фракталы! А что это за зверушки? Читаем Билла В. Он бросил кость ( фрактал из 5 свечей ) нам, трейдерам . 
Мораль — учимся читать график по каждой  свече и учим ИИ этому .
Фракталы — это суть, график, и есть он.
avatar
ezomm, спасибо. Это, как раз и есть моделирование. И это трудоемкий процесс.
avatar
Современным С назван язык c gc. Т.е. подразумевающий, что программист не в состоянии определить иерархию владения ресурсами. Куда катится этот мир...

Зачем вам какие-то фиксированные участники, совсем непонятно. Нет своих рабочих стратегий, хотите у кого-то увести?
Кирилл Гудков, про языки программирования дискутировать, думаю нет смысла. Форум не об этом.

По поводу фиксированных участников. Как я написал в статье, сейчас есть одна рабочая стратегия, которая пойдет в боевой запуск. Есть еще 20 с лишним стратегий, описанных в виде механик. Запрограммировать, отмоделировать, протестировать одну стратегию — трудоемкий процесс. Но это единственный вариант, не рискуя живыми деньгами получить внятную оценки своей торговой системы.

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

По поводу «хотите у кого-то увести», здесь могу сказать так. Допустим у трейдера есть проверенная и работающая стратегия. Это его тайна за семью печатями. Он стратегию никому раскрывает. Меняет торговые площадки, чтобы его стратегию не декомпозировали местные админы. Но у этого же трейдера с большой вероятностью есть масса гипотез и предположений, о том как еще можно торговать. Во всяком случае у меня именно так и было. И тут вариант, держать гипотезу при себе, которая так и останется гипотезой. Либо проверить ее и если она работает, то получить с этого результат. Это как продать долю от компании, получить финансирование и построить бизнес. Либо чахнуть со своей гениальной идеей и не получить ничего.

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

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

Более того, тестировать можно не всю стратегию, а только фрагменты. И на основе полученных цифр делать выводы.

И важный момент, это собственно сама автоматизация. Но она должна быть качественной и четко выполнять свои задачи. Это упрощение трейдинга, это экономия времени, экономия ресурсов, избавление от рутинных и типовых задач. Даже банально, отложенный ордер — это уже автоматизация. А то почему бы самому не ждать того заветного момента, когда нужно открыть или закрыть позицию вручную.
avatar

теги блога Dmitry

....все тэги



UPDONW
Новый дизайн