Финансовая Лаборатория
1.16K subscribers
36 photos
11 videos
1 file
208 links
Личные финансы, инвестиции, трейдинг
Download Telegram
Раз уж взялся рецензировать и комментировать книги по финансовой грамотности, то решил переделать давнюю рецензию на книгу Джорджа Клейсона "Самый богатый человек в Вавилоне". Как обычно, со своим взглядом на управление личными финансами. Читайте в новом посте здесь >>>
Мы с вами выходим на финишную прямую 10-го торгового сезона 2021-2022 "Финансовой Лаборатории". Я хотел бы от вас получить обратную связь на тему: Чего бы "докрутить" в BackTrader?

Вместе с трейдерами "ФинЛаба" обсудим этот вопрос в закрытом чате "Автоторговля". Пожалуйста, пишите ваши мысли туда.

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

Свои мысли расскажу прямо здесь. И вот первая из них...
События изменения статуса заявки (notify_order) и изменения статуса сделки (notify_trade) фиксируются в BT по мере их выполнения. Однако, в ТС они передаются только со следующим пришедшим баром. Данные события должны приходить в ТС во время их выполнения без привязки к приходу бара.

Решение этого вопроса достаточно простое. Нужно при инициализации Cerebro поставить параметр quicknotify=True. Вот так:

cerebro = bt.Cerebro(quicknotify=True)
Продолжаю публикацию своих мыслей по улучшению BackTrader. Сегодня будет про улучшение визуального представления баров, индикаторов, графиков.

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

- Красивое отображение свечей/баров с возможностью настройки цветовой палитры
- Прокрутку баров по оси времени
- Отображение линий индикаторов заданными цветами / типом линий
- Закрашивать область графика/индикаторов вертикально (например, для визуализации трендов) и горизонтально (например, экстремальных зон индикаторов)

Решением может стать отображение данных в браузере через библиотеку на JS.

Есть готовое решение через расширение функции вывода plot. В нем используется библиотека Bokeh.

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

В веб-клиенте Astras от Алора используются ng2-charts (chart.js) + lightweight-charts.

В общем, материала для доработки визуализации достаточно много. Летом буду интенсивно тестировать.
На очереди работа с брокерами в BackTrader.

В архитектуре BT к Cerebro можно подключить только одного брокера. Внутри этого брокера можно выбрать только 1 счет при подключении.

cerebro = bt.Cerebro()
cerebro.setbroker(broker)

Нужно сделать так, чтобы для каждой ТС, добавленной к Cerebro, можно было бы выбирать брокера и счет.

Самое простое решение для работы с разными брокерами - сделать отдельное окружение Python для каждого брокера. Под каждым окружением запустить свою версию Cerebro с привязанным брокером и торговыми системами.

Разбить красиво на счета не получится, т.к. BT использует get_notification, get_cash, get_value, get_position для анализаторов показателей торговых систем (например, коэфф. Шарпа) и наблюдений (например, изменение счета, точки входа/выхода, просадка). Если внутри Cerebro менять счета, то эти функции будут сбиваться, и выдавать неверные значения.

Вот дискуссия про работу на нескольких брокерах/счетах.

Чтобы из одного Cerebro работать с несколькими брокерами и несколькими счетами в одном брокере, нужно переделывать архитектуру BackTrader. Посмотрим, насколько это сложно...
Переходим к работе ТС с заданными тикерами в BackTrader.

ТС, как и данные, подтягиваются к Cerebro. Например:

cerebro = bt.Cerebro()
cerebro.addstrategy(ts1)
cerebro.addstrategy(ts2)
cerebro.adddata(data1)
cerebro.adddata(data2)

И ts1 и ts2 будут получать data1 и data2. Нужно сделать так, чтобы можно было выбирать, какие данные в какие ТС отправлять.

Трейдеры "Финансовой Лаборатории" придумали простое решение. В каждой ТС может быть сколько угодно параметров. Нужно сделать параметр в виде кортежа, где передавать номера тикеров. Например, для 1-го, 3-го и 4-го тикера параметр будет data_ids = (0, 2, 3)

Событие next будет вызываться для каждой ТС по приходу нового бара каждого тикера. Нам нужно "поймать" состояние, когда пришли все новые бары всех тикеров по ТС.

Решений здесь можно придумать много. Один из вариантов такой. Вводим логическую переменную синхронности тикеров ТС. Изначально ставим ее в False. На каждом next сравниваем дату/время последнего бара каждого тикера ТС (номера их мы знаем из параметра ТС). Если тикеры до next были не синхронные, а с приходом next синхронизировались по времени, то выполняем расчеты алгоритма ТС. Ставим логическую переменную синхронизации тикеров в True. Если с приходом next дата/время тикеров ТС не синхронны, то ставим логическую переменную синхронизации тикеров в False. Расчеты алгоритма ТС не выполняем.

Этот алгоритм синхронизации можно использовать даже если данные приходят по разным временнЫм интервалам.
Переходим к глобальным вопросам. Одна из самых проблемных сущностей систем автоторговли.

Расписание торгов

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

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

Все решения, которые я видел в системах Технического Анализа, предлагали простые варианты. Стандартное время начала и окончания сессии. Даты с особым временем начала и окончания.

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

Перевод работы с данными и индикаторами на библиотеки numpy/pandas.

Много кода в BT дублирует эти библиотеки. Т.к. часть кода в numpy/pandas реализована на C, то, возможен прирост производительности.

Сейчас приходится дублировать код компонент и индикаторов в исследованиях и ТС. В исследованиях мы используем "чистый" Python с numpy/pandas. Для ТС мы должны работать с Lines, которые не совместимы с Series/DataFrame.

Неизвестно, что будет лучше. Перевод существующего кода BT на numpy/pandas или написание своей библиотеки "с нуля". В любом случае, маловероятно, что новая библиотека будет обратно совместима с BT.
В курсе Проектирование фильтра Калмана я использовал формулу Optimal Tracking Index. Благодаря этому индексу не нужно вручную подбирать альфу, бету и гамму для фильтров. Все что нам нужно, это ошибки процесса и измерения. Данный метод в 1984-м году представил Пол Калата.

Я ничего не принимаю на веру. Изучил его статью. Понял как появилась эта формула. Делюсь своими объяснениями с вами в летнем бесплатном мини-курсе Вывод формулы для Optimal Tracking Filter здесь >>>

Это мой первый опыт публичного разбора научной статьи. Жду ваши лайки :-)
В некоторых тикерах могут содержаться точки. Поправил код Провайдера для автоторговли в BackTrader из Quik чтобы с такими тикерами можно было работать. Благодарю Олега Шпагина за то, что обратил на это внимание!
В курсе Проектирование фильтра Калмана для трейдеров в бонусном видео, где разбираю формулы и код альфа-бета фильтра, есть небольшая ошибка. Поскольку у нас движение равномерное, а не хаотическое как в альфа-фильтре, то ошибку процесса нужно измерять с учетом скорости. Правильные формулы прописал под видео в уроке. У кого есть (приобретен) этот курс, обязательно посмотрите.
Ввожу новую сущность комбо курсов. Что это такое, и как они устроены, смотрите в новой записи блога здесь >>>
Предлагаю вашему вниманию первый комбо курс. Он построен на стыке курсов Проектирование фильтра Калмана для трейдеров и Замена индикаторов ATR, DMI, RSI, CSI.

Курс бесплатный.

Подробное описание курса смотрите здесь >>>

В описании есть условие получения курса.

Если есть вопросы, то пишите в личку Discord (для трейдеров ФинЛаба) или через обратную связь на сайте https://finlab.vip
Очень просили трейдеры "Финансовой Лаборатории" перевести один из моих лучших курсов Система Игоря Чечета: Торговля частотных полос на Python для платформы BackTrader.

Я не только аккуратно перенес код, но и вписал систему в настоящий скринер с ограничением по кол-ву одновременных позиций. Гурманы оценят 😊Про это записал 5 новых видео. Они находятся в конце курса.

Посмотрите описание курса здесь >>>
Посмотрите 8 открытых вводных видео прямо здесь и сейчас >>>
Летом "Финансовая Лаборатория", традиционно, на каникулах. Я отдыхаю, набираюсь ума-разума, провожу исследования, перевожу курсы на Python/BackTrader. Словом, готовлюсь к очень плодотворной работе в торговом сезоне 2022-2023. Хорошего всем отдыха! До встречи!
Пока все массово убегали из Тинькофф, я его прикупил. Вот результат.
Получил несколько писем с вопросом установки matplotlib 3.2.2 Дело в том, что в последней версии Python эта библиотека при установке выдает ошибку.

Решение такое. Сначала ставите Python 3.8.6, затем matplotlib 3.2.2, затем backtrader. Такая конфигурация будет рабочей.

Благодарю Павла за этот сетап!

P.S. Чует мое сердце, скоро полезем backtrader править. Уж слишком много вопросов к нему накопилось 😊

P.P.S. Напоминаю, что для работы matplotlib нужно поставить Microsoft Visual C++ Redistributable for Visual Studio 2015, 2017 and 2019
Небольшие изменения в QuikPy. Когда перебираем позиции, то работаем с копией текущих позиций, т.к. в это время могут появляться и закрываться другие позиции.
Пришли модификации для AlorPy от Андрея, за что его благодарю!

1. Уникальность транзакции должна быть не до секунды, а меньше, т.к. за одну секунду может быть несколько транзакций. Уникальность сделана до наносекунды.

2. При получении ошибкок с сервера их нужно декодировать в UTF8.

3. Унификация аргументов в функциях GetTrade и GetFortsRisk. Сначала передаем портфель, затем биржу.

Новая версия библиотеки AlorPy ждет вас здесь >>>