Инфраструктурно меня конкретно штормило раньше). Видимо, строить инфраструктуру (где-то в глубинах внутренних предпочтений) мне ничуть не менее интересно, чем рисёчить стратегии. Поштормило-поштормило, да подотпустило. Зато теперь у меня внутри нет никакой недосказанности вида «а что если своё попробовать написать», «а что если готовую вот эту специализированную взять» и прочих. Лучше жалеть о то, что сделал… и я делал)).
Сейчас самописная инфрастуктура. Не разраб, не кодер, не архитектор, но кой какие-то принципы усвоил – какие-то из своего опыта вынес, какие-то из курсов или ещё откуда. Соблюдение банальной IT гигиены на порядки облегчает жизнь. Пример: раньше мог запилить коннектор какой-нибудь, который корнями врастал в остальную часть инфраструктуры и чтобы заменить его на другой коннектор, если понадобится, приходится выкорчёвывать, а это долго, сложно и отличный повод запустить прокрастинационный цикл. А надо-то, банально, написать базовый класс и, много не надо, буквально несколькими с указанием сигнатур, дальше от этого класса наследоваться – всё. Пример: щас сделать Yahoo Finance адаптер для получения исторических данных конечно совсем не рокет саенс, но когда ты всё делаешь по красоте щас можно сделать ещё проще (так): уважаемый ChatGPT-4, вот базовый класс, отнаследуйся от него, сделай пож. класс для получения исторических данных по US Stocks с Yahoo Finance. Обязательно писать «Уважаемый», иначе ничего не получится). Ну и собственно почти всё, дальше небольшие корректировки и новый поставщик исторических данных готов, а главное готов для работы с имеющейся инфраструктурой.
Ну и в целом, пилить инфраструктуру с нуля – все этим вспомогательные библиотеки, классы – не тривиальная задача, много челленджей по ходу возникает. Но когда все готово и работает, дальше очень удобно переиспользовать. В этом аспекте мне нравилась S# — у тебя есть доступ к лоулевелу, у тебя есть готовые собранные из лоулевела детальки, у тебя есть целые отдельные «постройки» собранные из деталек, но если надо ты можешь всегда вернуться на лоулевел и поколдовать на этом уровне если требуется. У меня что-то похожее.
Взаимодействие с инфраструктурой условно-хардкорное. В сторону инфраструктуры (а, я наверно, не раскрыл что в это понятие вкладываю – ну сами библиотеки, бэктестеры, торговалки, коннекторы и прочее) это конфиги, код подшаманить и перезапустить, ну Jupyter. Со стороны инфраструктуру в мою сторону это логи, консоль, алерты в телегу и… снова Jupyter. А, ещё в сторону инфраструктуры – есть API простенький.
Как это работает (в общих чертах).
Начинается процесс с торговой идеи, понятно. Наследуюсь от базового класса стратегии, пишу стратегию. Когда эту часть разрабатывал один из основных приоритетов был чтобы при создании стратегии не надо было лишний код писать: вот мы что-то инициируем, вот ещё что-то, а вот без этой строчки ничего не запустится и т.д., такое тоже видел в других системах. Да, человечество изобрело такие штуки как шаблоны, но всё равно не то и как минимум ухудшает наглядность.
Сейчас чтобы разрабатывать стратегию на первом этапе у меня есть Jupyter Notebook под это. Не громоздкий, с понятной структурой, удобный. Не громоздкий потому что код не в нём, код в библиотеке, а Jupyter просто создаёт объекты, инициирует переменные и подобный stuff.
Набросал стратегию, прогнал на паре тикеров, тут же в отдельной ячейке можно отрисовать свечи, вход, выход и что вокруг проиходит. На этом этапе я убеждаюсь, что стратегия находит то, что я ожидаю. На этих этапах часто рождаются инсайты относительно того, а то ли я ищу, относительно очертаний того, что я ищу и т.д. На этом же этапе делаю прикидки по разным параметрам и фильтрам. Jupyter в этом месте, конечно, супер удобен: notebook (Jupyter) для разработки стратегий он предполагает некий пайплайн (план, считай), но в любой момент можно отойти от него и сделать что-то ответвляющееся – трейды покрутить, графики какие-то доп. построить или что-то такое.
Когда поигрался со стратегией, дальше её путь в другой ноутбук – ноутбук про бэктесты – там указываю диапазоны параметров, кол-во прогонов, набор тикеров и прочее и погнали.
Дальше увесистый csv с резалтами идёт на вход следующему ноутбуку, который – деталей здесь не будет – анализирует результаты бэктеста. В общем тот этап где обычно определяют диапазоны или значения параметров и что-то такое).
Дальше отдельным приложением торговалка конкретной стартегией (на наборе тикеров). Запустили – погнали. Она генерит сигналы, сигналы идут на Execution API — оно берет сигналы и роутит их по соответствующим коннекторам. В будущем это API будет делать, конечно, много всего интересного, пока не много и не особо интересного. Всё. Создал новую стратегию – делаю под неё приложение запускаю, ничего перезапускать не надо.
Ещё есть некоторые блоки инфраструктуры, отражающие логику общего алго флоу, но их оставим за скобками.
Что удобно, когда инфраструктура своя – то, что ты всем управляешь (в рамках архитектуры, потому что если ты сделал криво, теоретические ты можешь сделать что угодно, конечно, но фактически скорее всего ты не сможешь или не будешь и не захочешь). Хочешь поменять процессы (например, ты провел какой-то мета-рисеч, который сказал, что сам процесс разработки стратегий нужно поменять вот так-то) – берешь и меняешь. Инфраструктура отражает твой подход, нет ничего лишнего. Также инфраструктура позволяет эволюционировать твоему подходу и подстраивать инфраструктуру под него.
Ну и микро кусок Jupyter тетради, где разрабатываю стратегии)).
