Блог им. elektroyar

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

По моему опыту в алготрейдинге (под алготрейдингом я подразумеваю поиск закономерностей и их использование) большая часть времени уходит на исследования, это примерно 90% времени. Однако, часто можно услышать критику примерно следующего плана.
  • Нужно писать код на питоне/джаве, можно в два счета набросать торгового робота. Нафиг Си и С++, сложна.
  • Не нужно изобретать велосипеды, все уже сделано за нас. Зря потратить время, бери готовое и действуй. Метатрейдер в помощь.
  • Нужно всегда писать чистый код, а не говнокод. 
Если все это верно, то получается, что успех в алготрейдинге (да и в IT) должен зависеть от этих факторов. Однако, к примеру, на практике большая часть доли в проекте принадлежит обычно не программистам (т.е. людям, которые вообще могут не уметь программировать), хороший код не обязательно принесет много денег, да и сложные алгоритмы порой без разницы, на каком языке реализовывать, быстрее они не напишутся.

Если объяснить проще, то успех не равен чистоте, хорошести и прочим характеристикам кода. Тогда почему происходит акцентуация на подобные факторы? 

В качестве примера, возьмем начальное условие, что известен алгоритм «грааля» (допустим, случайно попала инсайдерская информация), но навыков в программировании ровно как у вчерашнего студента. И ситуация наоборот: допустим, навыки программирования как у senior'a, за плечами лет 20 работы в разных крупных фирмах, но при этом в трейдинге — полный ноль. 

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

Поэтому, я бы выделил другие важные пункты в алготрейдинге (и не только в алго):

  • Нужно уметь работать с переживаниями. Эмоции могут влиять на восприятие, заставлять принимать неверные решения, вызывать избирательность внимания, что в конечном счете может свети результат работы к нулю, даже если это исследования. В алготрейдинге стресса хватает, поэтому этот пункт актуален. Ошибаются все люди, но если есть адекватное восприятие реальности, то после ошибки можно продолжить эффективно работать над проектом. Если же переживания поглощают сознание, то тут уже ничего не сделаешь, все пойдет по неудачному сценарию, так как по факту нет контроля над ситуацией, даже над самим собой нет контроля. 
  • Важно вовремя соскочить с идеи, если становится понятно, что идея не несет в себе смысла. К примеру, можно угробить на нейросети несколько лет, пытаясь заставить их прогнозировать рынок. А можно, повозившись с нейросетями месяц-другой, прийти к выводу, что эта задача данным инструментом просто так не решается, и приступить к другим исследованиям.
  • Не путать скептицизм с предвзятым негативным мнением. Риск может быть уместен. Впрочем, данный пункт все алготрейдеры скорее всего соблюдают, иначе не пошли бы в данную сферу деятельности, а прислушались бы к мнению большинства.
  • В разработках нужно уметь не зарываться в сами разработки, важен результат. Поэтому говнокод порой уместен.
  • Если речь идет про создание достаточно сложной системы, то писать много кода придется в любом случае, и разница между Си, С++, джавой, питоном тут будет стираться. Если это высокочастотная торговля, то конечно выбор очевиден. Но в других случаях может показаться, что проще будет работать в более «простых» языках. На самом деле, если есть хоть какой-то опыт в программировании, то мне кажется что язык программирования не столь важен, он за вас сложный алгоритм не распишет и всю систему не выстроит. Гемороя будет в любом случае много, а современные языки во много схожи между собой, имеют схожий синтаксис. Не думаю, что тут есть принципиальная разница. Кто начал с питона, тому проще будет на питоне. Кто начал с Си, тому проще будет дальше на Си. Разве что для питона много библиотек для машинного обучения.
  • Велосипед конечно не всегда нужен. Но на практике, если велосипед небольшой, на него не уйдет много времени, и уж точно он не станет черной дырой проекта, потому что черной дырой являются исследования закономерностей, которые могут при желания растянуться до бесконечности.
★9
47 комментариев
Странно что алготрейдеры не юзают Rust
avatar
Павел, нафиг это г**но в алготрейдинге не уперлось.
avatar
suren, ну может потому что безопасность и скорость? Я так смотрю, что безопасность вообще мало кого волнует, ну будет UB ну и хрен с ним) А Rust это скорость С++ и безопасность, в то же время есть так необходимые высокоуровневые конструкции, чтобы не изобретать велосипеды. В С++ нет даже пакетного менеджера 
avatar
за плечами лет 20 работы в разных крупных фирмах

Лично я опыт в крупных фирмах не считаю, там в основном заняты политиграмы нежели поднятия квалификации.
avatar
Автор? В чем мораль? Ищем индюки или ставим заявки перед большим объемом?
avatar
Eugene Logunov, допустим для С++ есть куча библиотек, которые позволяют по быстрому считать все что нужно, хоть GARCH модель построить, хоть график построить, любую статистику посчитать. Причем пусть эти библиотеки являются частью стандарта, чтоб совсем уже было шоколадно. Тогда будет разница между R и С++? Или на R все равно будет быстрее все набросать? 
avatar
elektroyar, я очень согласен с Eugene Logunov. Прототипы пишутся на R или питоне. Это быстро сделать. А сама реализация — на Си или подобно. Это быстро работает.
За день можно кучу алгоритмов перебрать, много бесполезных, и писать их на Си… Ну не.
И это стандарт в мировой индустрии
avatar
Ну кто-то и в ТСЛабе нормально себе живет и не заморачивается 
avatar
Все, что написал автор верно, но не только для алготрейдинга, а вообще для любой предметной области, где используется прогаммирование.
avatar
В то же время верно и обратное — в алготрейдинге так же как и в просто трейдинге важно понимать, в чём именно состоит твоё рыночное преимущество? Мало хорошо уметь программировать, это умеет очень много народу и очень хорошо умеет. Нужно ещё знать и понимать что-то такое, что мало кто знает и понимает получается, и чтобы это что-то было не просто красивой штукой, в которой прикольно разобраться, но и давало реальное преимущество в торговле.
То есть например те же нейросетки или ещё какой другой подход мало просто попробовать, надо сначала знать теорию, чтобы представлять как именно пробовать и куда копать. Дерево вариантов растёт очень быстро )
А если просто брать библиотечки и ваять что-то простенькое и пробовать — ничего серьёзного так найти нельзя.
Согласен по основным моментам, да. Очень важны какие-то другие качества, программистов в трейдинге много, хороших тоже не мало, математики и т.д., ни что из этого само по себе не дает какого-то прорывного преимущество. На мой взгляд важнее такие вещи как грамотное отношение к риску, понимание вероятностной природы происходящих вещей, настойчивость, гибкость, логическое мышление, творческое начало (это очень важный компонент) и вот это вот все.
avatar
Eugene Logunov, Как далеки вы от реальности. И это радует.
avatar
 Пока есть такое глубокое заблуждение, что якобы на рынке есть некая закономерность, которую вижу только я и больше никто, и я сейчас все это запрограммирую и получу кучу бабла, так вот, пока есть такое, мы будем зарабатывать. Ну нет на рынке никаких закономерностей. Как только они появляются, куча людей кидаются на них и они исчезают. 
avatar
Karim, 

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

Это тоже глубокое заблуждение ))
Karim, а она тем не менее есть))) 
avatar
Проходят годы, а проблемы, волнующие трейдеров не меняются.
Процитирую целиком лучший пост на эту тему из уважения к героям прошлых лет (2012 год):

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

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

Так вот приходит такой трейдер в творческий тупик, и начинает сразу думать о путях выхода, и как правило речь идет не о том, чтобы искать решения в себе. А о поиске внешних средств, несколько простых кейсов, чтобы было понятно о чем я:
1. Excel медленно считает, нужно написать свою программу для расчетов
2. Эх, если бы у меня была программа Х я бы натянул рынок, не то что с этой программой Y
3. У меня не получается торговать руками, но вот если купить робота за 3000 рублей, вот тогда я стану богатым
4. Хранить историю котировок в текстовых файлах не кошерно, надо придумать свой формат сжатия
5. Программа Z не умеет тестировать тот класс стратегий, что мне надо напишу ка я свой фреймворк/бэктестер/терминал для этого
6. А напишу ка я свой бэктестер, потому-что свой, потому-что удобнее и не то что у других

Все это, господа — секс с феями. Все трейдеры в душе перфекционисты, все хотят быстрее, выше, сильнее. Но время — ресурс невосполнимый, и тратя его на одно дело, мы забираем его у других. Поэтому я оглянулся назад и оценил, сколько работы я сделал зря ради красоты и перфекционизма. Многие проекты были заброшены сразу после того как доведены до стадии какой-то работоспособности. Мне стало грустно, конечно опыт остался, очередного робота(order management system) или бэктестера я могу за пол месяца написать на хорошем уровне, но не хочу!

Поэтому выработал для себя несколько правил:
1. Если проблему можно решить за 1 день, написав под это узкую программу, или за 30 дней, написав под это фреймворк. Нужно писать узкую утилиту, потому как есть вероятность, что больше никогда к этому не вернешься. Однако и утилиту можно сделать гибкой.
2. Если чешутся руки создать что-то глобальное и красивое, задайся вопросам а науха это надо? Какую конкретно задачу это красивое-доброе-совершенное будет решать, и сколько бенефита оно принесет? Если задача все равно важная, см. п. 1.
3. Если при решении задачи возникает желание создать что-то глобальное, с формулировкой, например «а хорошо бы иметь свой бэктестер» — значит задача поставлена неверно, или слишком общО сформулирована.
4. Если задачу можно сделать как-то через жопу имеющимися средствами — делай через жопу
5. Всегда стараться сократить время на решение задачи путем повышения эффективности. Если есть 100% уверенность повторяемости действий, нужно делать фреймворк. Но не нужно писать новый Амиброкер или Омегу, нужно делать только то, что даже через п.4 не делается. Если решился делать фреймфорк, делай масштабируемую архитектуру (напр для роботов-исполнителей), но реализовывать нужно только, то что потребуется здесь и сейчас для решения задачи.
6. Для каждого гвоздя должен быть свой микроскоп! Глупо тестировать торговые системы на ассемблере, глупо делать двойную работу переписывая алгоритмы в разных платформах, глупо писать свое если есть уже готовое.
Дмитрий Овчинников, Здраво, а чье это?
avatar
Replikant_mih, 
Я так понимаю, что его:
https://smart-lab.ru/profile/ubertrader/
Дмитрий Овчинников, ++++++++
Очень жизненно!
avatar
С++ используется там, где нужна скорость. Если скорость не нужна — не используйте.
Eugene Logunov, «elektroyar, В гипотетическом мире со всеми нужными библиотеками без разницы на чём писать. Наверное только ассемблер не подойдёт.» И я об этом) потому что язык программирования — просто язык. Если мы будем спорить о том, какой язык лучше с точки зрения синтаксиса, получим один результат, возьмем с точки зрения производительности — другой, возможностей — третий, количества библиотек — четвертый и т.д. 

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

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

avatar
Karim, вы будете «зарабатывать на отсутствии закономерностей»?
Видимо поэтому ваш блог заполнен разными индикаторами )))
Уровни и кумулятивная дельта — тоже не использование закономерностей?
Вы либо бредите, либо вводите в «глубокое заблуждение».
avatar
VladMih, эти индикаторы позволяют видеть то, что не видит большинство. А это хоть и маленькое, но приимущество.
avatar
Karim, я сам индикаторщик.
А вы уже забыли о чём ВЫ писали, на что я отвечал…
И будто не видите о чём я спросил, занимаетесь демагогией.
avatar
VladMih, Причем здесь индикаторы и закономерности? Да, видимо я далек от народа и, тем более, от форекса. Сорри…
avatar
Karim, какая разница форекс или нефорекс?
Вы действительно далеки… от рынка.
avatar
VladMih, Ну да, и торговать толком не умею.
avatar
Karim, на 99% уверен, что не умеете. Ваши «19 лет на рынке» в профиле меня не впечатлят, ибо я вижу как вы не держите тему разговора, избегаете конкретных вопросов (два из двух), значит вам проще умничать общими фразами, чтобы не выдать своё реальное «знание».
1% за «умеете» — это оставляю на везение, оно может быть и 19 лет.
avatar
VladMih, Ну, наверное, вы правы. Но все же иногда везет )).   https://www.comon.ru/user/UKimovich/strategy/detail/?id=14717
avatar
 почему происходит акцентуация на подобные факторы? 
Очень просто — программист, считающий себя хорошим специалистом, обычно превозносит именно качества хорошего программиста.

А я с вами согласен — успех в алготрейдинге зависит больше от алгоритма, чем от его реализации в коде (чистоты, «тяжести»).
На мой взгляд это очевидно.
avatar
Забавно видеть, как появляются и теряют популярность легкие высокоуровневые языки: Паскаль — Делфи — Visual Basic — Си шарп и вот теперь Питон(или пайтон). И только C/C++ является вечностью)

avatar
chizhan, ну убийц было много, но пока только Rust реально начал конкурировать и убивать, точнее поглощать и С и С++. А разгадка одна — наследие. Все бы и рады взять что-то получше, но зависят от либ. А Rust такой херак и вот вам совместимость. Неудивительно что сейчас Rust везде — от блокчейна и WASM до андроида и FFI. Для чуть менее требовательных к производительности проектов есть Go. А С++ продолжает маргинализироваться.   
avatar
Павел, поговорим о вашем ЯП лет этак через 10-15) А так залезая даже в программирование ГПУ или ардуинки, я вижу синтаксис старого доброго Си. Да и кошель биткоина с его мегаблокчейном писался на Си о чем вы. Откройте исходники с гитхаба)

Так что в действии бритва Оккама «Не следует множить сущее без необходимости»
avatar
chizhan, ну да, биткоин сделали до появления Раста) А так если посмотрите на вакансии связанные с криптой то там поголовно Раст. Язык слишком молодой чтобы вытеснить С и С++ за такой срок полностью. Вроде как есть для Ардуины https://github.com/avr-rust/rust про GPU вот список того что есть http://www.arewelearningyet.com/gpu-computing/ Не эксперт в обоих областях, но вроде не проблема.
avatar
При этом, совсем не факт, что автор библиотеки не воспользовался любимыми фишками своего компилятора, которые другие компиляторы не воспринимают, или задумывался о кросс-платформенности своего кода.

Eugene Logunov, я бы не стал использовать такую библиотеку.
avatar
Excel+ass, не?
А если серьезно, не вижу современных языков, позволяющих на уровне команд проводить множественное разветвление процесса оценки критерия с дальнейшим копанием каждой ветки (ну. типа ЛИСПа). Кто знает, подскажите.
Кухонный трейдер, а чем проблема то, компилятор  Lisp есть, берем и пишем то то надо, Lisp правда не особо развивается, НО есть Prolog и для него есть очень хорошие компиляторы и в нем можно писать даже лучше чем на Lisp.
avatar
какие прекрасные комменты
avatar
вроде же на си самое простое, а потом уже C++/C#/Java и прочие абстракции из библиотек, над которыми ты должен думать как они работают внутри


avatar
meat, на С самое простое? Ну накидайте по быстрому реализацию универсального динамического массива на С, чтобы потом с этим можно было просто работать — типа как в С++.
Проще писать на С#/Java благодря довольно большому количеству реализованных классов в SDK и большому количеству имеющихся библиотек и довольно просто работе с памятью. Ну или на JavaScripte c NodeJS.
avatar
Sergeyka, у нас разные понятия о простоте ЯВУ

для вас это прежде всего набор готовых библиотек и сборщик мусора
avatar
¯ _ (ツ) _ / ¯,  Бог в помощь. 
avatar

теги блога elektroyar

....все тэги



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