March 7

Мой первый видос про алго 2020 г.

Я не понял, как это произошло, но каким‑то образом Толян меня вытащил из ракушки, и я оказался в эфире «ИндексБара»:

Зеркало в VK VIDEO тут.

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

ОБЩЕЕ

Всё обучение и развитие в процессе ручной торговли для меня отдалённо напоминает принцип нейросетей. Люди из бесконечного количества графической информации со временем выкристаллизовывают похожие друг на друга повторяющиеся модели, явления. Сопоставляют в своей голове одни образы с другими. Что такое образы? Ну вот, например, какая‑нибудь фигура «голова и плечи» в нужное время в нужном месте — это некий ценовой образ. И узнаёте вы свои фигуры на графике точно так же, как узнаёте лицо знакомого человека, — никакого математического аппарата и чёткого алгоритма при этом не существует.

А при формализации этот алгоритм пришлось СОЗДАВАТЬ! А потом всё обучение и развитие становится ближе к какому‑то генетическому алгоритму. Потому что начинается подбор констант, уточнений, критериев, о которых я и не задумывался никогда, и с каждым новым изменением (по сути мутацией) проверяю, стал ли мой робо-анализ более правильным или нет (т. е. похожим на тот, который делал вручную, потому как он уже проверен временем). Если мутация удачная, то оставляю, если нет, то нет. Эдакий алгоритмический брутфорс :)

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

Но суть в том, что в виде графических образов мы воспринимаем различные явления на рынке, которые влияют (или якобы влияют) на рынок: всплески волатильности в определённые моменты или её отсутствие, всплески объёма в определённые моменты или его отсутствие, соответствует ли текущая динамика цены допустимому таймингу или нет, отреагировал ли рынок на какое‑то событие или проигнорировал его. А там, где явления, которые «что‑то значат», там и взаимосвязи, а где взаимосвязи/функции, там и константы. При торговле вручную о них даже и не задумываешься, но это не значит, что этого нет. И конечно же, они будут давать больший эффект, когда вы всё это идентифицируете, определите точные границы, критерии, константы и т. п. Так сказать, «оцифруете».

На текущий момент своего развития я считаю, что у любого состояния рынка есть конкретные допустимые границы, которые можно и нужно «оцифровать». У тренда, у флэта... у чего угодно. Эти границы могут зависеть от временных факторов, ценовых факторов и более сложных одновременных факторных комбинаций. Т. е., например, чтобы рынку продолжать быть трендовым, его динамика должна укладываться в допустимые границы. Выход за пределы одного типа границ превратит трендовый рынок во флэтовый, выход на пределы другого типа границ развернёт трендовый рынок в другую сторону, т. е. бычий тренд превратится в медвежий. Границы преодолеваются всегда количественными изменениями (других не встречал), когда они доходят до какого‑то допустимого предела, после чего приводят к качественному изменению, подобно тому, как вы постепенно повышаете температуру воды, и когда количественное изменение достигнет предела, т. е. 100 градусов, в воде начнутся качественные изменения, она начнёт испаряться, перейдёт из одного состояния в другое. А если температуру будете понижать, то после какого‑то предела вода превратится в лёд. В любых взаимосвязях, законах, состояниях существуют критические значения, после которых происходят качественные изменения. На рынке всё то же самое.

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

ПОЧЕМУ ТАК ДОЛГО

Я уже предвижу самые популярные вопросы типа:

«Тебе не кажется, что это замкнутый круг? Почему бы не запустить какую-нибудь из более‑менее работоспособных версий алгоритма, чтоб уже рубилось бабло, и параллельно уже прорабатывать более совершенные варианты?»

Теоретически — ДА, я мог бы очередное озарение (прорыв в понимании) «подвесить в воздухе» и закончить текущую версию. Но практически — каждый качественный скачок давал настолько более выгодную, более совершенную альтернативу, что это просто предложение, от которого невозможно отказаться. Старая концепция по сравнению с новой казалась ну просто глупой, и я не мог заставить себя продолжать тратить на неё время.

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

Теперь отдельно поясню, почему любую версию до запуска обязательно нужно было бы «доработать» и не абы как, а на 100% (а это, как вы понимаете, убивает кучу времени).
Дело в том, что когда начинаешь «оцифровывать» свой опыт за ~10 лет торговли, то алгоритм, скажем так, не может быть простым. В голове много знаний, взаимосвязей, определяющих поведение цены, поэтому и алгоритм будет многофакторный, многоступенчатый, а это значит, что любая ошибка в коде или недоделанный кусок схемы порождает искажение, которое на каждой последующей ступени только усугубляется, и получается такой вот «эффект бабочки»: здесь чихнули, а на другом конце океана (кода) ловите торнадо. Так что либо вы запускаете то, что работает идеально, полноценно, что протестировано, перетестировано 100 раз, либо лучше вообще не запускаете, ибо в итоге там, где вы должны были покупать, вполне вероятно, будете продавать. Короче, риски будут непредсказуемыми.

КАК СЭКОНОМИТЬ ВРЕМЯ. МОИ СОВЕТЫ

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

«Всё, что может быть отложено в сторону, должно быть отложено в сторону. Делать нужно только самое главное и самое важное».

Я понимаю, что звучит очевидно, но на практике нет‑нет да и подмывает проверить какую‑то «гениальную идею», которую вроде бы можно быстро закодить, получив при этом очень существенный эффект ☻ (хотя ещё сама основа не дописана до конца). Или, допустим, хочется начать с того, что легче и быстрее делается, и за один присест закрыть целую кучу мелких вопросов и задач, просто чтоб «отстреляться», хотя это не относится к самому важному и базовому в вашем алгоритме. Короче, так или иначе, постоянно что‑то провоцирует отдалиться от этого базового правила.

Так вот, почему это так важно, причины две.
Во‑первых, казалось бы, простые и лёгкие на первый взгляд задачи могут оказаться настоящими убийцами времени, вы можете наступить в такое болото — это пипец. То, что кажется, мол, займёт неделю, может занять несколько месяцев, невозможно просчитать все последствия даже маленьких апдейтов в сложном коде (вспоминаем «эффект бабочки»).

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

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

Я это наблюдал на каждом своём качественном скачке. Как только происходит качественный скачок — я открываю перечень неразрешённых проблем и вопросов, каких‑то рыночных ситуаций, которые я не мог объяснить, и прочее. Большую часть этого перечня можно просто удалять. А если какой‑то перечень заморозить и вернуться к нему через 2–3 качественных скачка, то его, скорее всего, весь можно удалять.

Получается, что, если б я потратил на них время, я б потратил его впустую.

Если максимально популярно объяснить, представьте: самое главное и основное в вашей концепции — это ствол дерева. Пускай будет берёза. Этот ствол неизбежно пытается обрасти мелкими нюансами, критериями, константами, расширенными возможностями, это как какие‑то веточки из ствола в разные стороны. Так вот, пока вы эти веточки не приделали к стволу, они там лежат где‑то в куче, ждут вашего внимания. И когда происходит качественное изменение ствола, он уже становится не берёзовым, а каким-нибудь там... каучуковым. Но веточки у вас берёзовые, вы их к каучуковому стволу уже, во‑первых, не приделаете, а во‑вторых, их уже и нахрен не нужно приделывать. Поэтому чем больше в этой куче будет веток, тем больше вы времени, получается, сэкономили.

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


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

Короче, ребята... Эффект Даннинга — Крюгера меня просто расплющил на самом деле. До алгоритмизации я думал, что «всё знаю». Что там сложного‑то на рынке? :) Но я просто был неспособен осознать всю глубину своей некомпетентности, а сейчас ощущаю себя так, как будто какое‑то никчёмное одноклеточное существо пытается познать Бога. Одно только радует: чтобы зарабатывать на рынке — необязательно иметь ответы на все вопросы (но это неточно ☻).

Так... я от темы отдалился, т. к. писал, как можно сэкономить время. Тут я брошу вдогонку ещё один совет: даже делая самое главное и основное — вот этот самый «ствол», не пытайтесь писать «идеальный код». Ну, чтоб он был более эффективный, красивый, быстрый. Просто забудьте об этом, потому что, как показала лично моя практика, если «оцифровывать» какую‑то концепцию, которую вы совершенствуете на ходу, то ЛЮБОЙ кусок кода рано или поздно будет или частично переделан, или полностью переписан, или дополнен, или вообще полностью удалён. Когда наступит момент запуска робота в реальной торговле, ваш код будет по нескольку раз полностью переписан ))) Так что мой совет — пишите код как можно быстрее, игнорируя его «красоту». Оптимизацией займётесь после того, как он начнёт вам бабло рубить, т. е. для большинства, скорее всего, НИКОГДА.

РАЗНИЦА В МЫШЛЕНИИ

Прикольно, что многое воспринимается теперь совершенно не так, как при ручной торговле.
Например, раньше, открывая позицию, а затем наращивая или сокращая её объём (либо добавляясь, либо частично разгружаясь), я воспринимал это как работу по одной стратегии, с одной позицией, просто увеличивая или уменьшая её объём. Это, так сказать, «работа с позицией».
Но сейчас я понимаю, что, когда на откате я добавляюсь к позиции по лучшей цене, я не увеличиваю объём первого входа — я вхожу в совершенно другую стратегию. Т. е. 2 входа по разным ценам, но с одним тейк-профитом — это 2 абсолютно разные стратегии, у которых на дистанции будет разный профит-фактор, разный % прибыльных сделок, разная максимальная просадка, разное количество сделок (потому что лучшую цену, очевидно, рынок будет давать реже) и т. д. и т. п. Или же 1 вход, но с разгрузкой в 2 этапа... 50% по одной цене и 50% по другой — это тоже 2 абсолютно разные стратегии, и одна может быть прибыльной на дистанции, а другая убыточной (ну, типа, либо в первом выходе сильно недосиживаешь, либо во втором сильно пересиживаешь). Соответственно, в одной из них нет никакой необходимости.
И я уверен, что многие читатели в полной мере это пока не осознают — не мыслят такими категориями.

КОГДА ВАМ НАЧИНАТЬ АЛГОРИТМИЗАЦИЮ

Я не могу утверждать наверняка, но если у вас нет существенного опыта ручной торговли, то, возможно, вам лучше забыть всё, что я тут понаписал :) Ну т. е. если вы первый год торгуете на рынке, то что‑то там формализовывать будет просто смешно. Это, вероятно, не только не даст вам никакого развития, но даже наоборот — вы просто будете бессмысленно терять своё время. Объясню почему, в чём здесь разница между опытным и неопытным трейдером.

Дело в том, что, когда я начал «оцифровывать» свой торговый опыт, через 8‑то лет торговли, я в своём анализе оперировал целым арсеналом факторов, влияющих на поведение цены.

А если взять трейдера-новичка... Ну откуда у него возьмётся этот арсенал? Дай бог, чтобы он нашёл «хоть что‑то». И когда он будет бэктестить это «хоть что‑то в вакууме», то оно на истории будет срабатывать со случайной для него вероятностью, т. к. он никакие другие рыночные факторы не учитывает. А предположить, что трейдер-новичок найдёт «что‑то такое», что ВСЕГДА перебивает ВСЕ остальные факторы, вместе взятые, просто невозможно. Я даже не уверен, что такое вообще существует, это была б прям какая‑то Грааль.

Чтоб вы представляли, как я делаю ресёч по какому‑то одному определённому фактору:
🅰 Сначала бэктест отсеивает все ситуации с этим фактором.
🅱 Я вручную просматриваю все отобранные ситуации и вручную отбираю те примеры, в которых действительно на рыночную ситуацию мог повлиять ТОЛЬКО ЭТОТ ФАКТОР и никакой другой из тех, что мне известны. Потому другие факторы находятся либо на несущественных таймфреймах (относительно моего), либо на достаточном расстоянии... ну и так далее. Я отбрасываю ситуации, в которых вижу, что

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

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

Но я могу ошибаться, это всего лишь мои поверхностные размышления. И уж тем более они не относятся к тем, кто будет программировать не опыт своей ручной торговли (рыночную логику, паттерны/⁠фигуры), а просто какие-нибудь инфраструктурные неэффективности или математические корреляционные расчётные модели, в чём я ничего не смыслю и ничего не могу прокомментировать.

КАКОЙ НУЖЕН БУДЕТ СОФТ/⁠ИНСТРУМЕНТАРИЙ

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

Значит, у меня полностью самописная программа (с нуля) на C#, которую я буду называть «самописным тестером».

  1. Т. е. скармливаю ему биржевые данные... ну, ленту сделок, из которой он в оперативной памяти строит свечи с нужными мне ТФ. Т. е. график находится в памяти, и его я, получается, и подвергаю анализу и бэктесту (ленту сделок можно экспортировать из многих торговых терминалов).
  2. Что касается визуальной части, т. е. как увидеть‑то этот график, сделки свои бэктестовые посмотреть, графический анализ свой посмотреть, — это всё выводится у меня в виде скриншотов. Т. е. в нужный мне момент (ну там вход/⁠выход из сделки, например) программа генерит график со всей этой информацией в виде скриншота. Если нужно несколько разных таймфреймов, значит, будет просто несколько скриншотов. 10 ТФ — 10 скриншотов. Проблем нет.

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

Ещё должен сказать, что за все эти годы разработки инфраструктура «самописного тестера» была в двух версиях:

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

В чём была разница между 1‑й и 2‑й версиями? В первоначальной версии мы использовали минутные данные (не тиковые), сначала строили из них всю доступную историю в памяти, а потом как бы постфактум на ней делали анализ и бэктест.

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

Поэтому мне пришлось всё переделать, и теперь:

  • график в памяти я теперь строю из тиковых данных, а не из минуток;
  • анализ поведения цены и бэктестовые сделки делаются непосредственно в момент построения графика, прям как бы в реальном времени, на каждом текущем тике, поэтому никакое «заглядывание в будущее» теперь невозможно.

⠀⠀