Aspiring Data Science
327 subscribers
390 photos
10 videos
6 files
1.46K links
Заметки экономиста о программировании, прогнозировании и принятии решений, научном методе познания.
Контакт: @fingoldo

I call myself a data scientist because I know just enough math, economics & programming to be dangerous.
Download Telegram
#trading #erema

Немного новостей по торговому боту. Пытаясь начать проект без МЛ (была у меня идейка, покупать дёшево и продавать дорого), потратил несколько недель и понял, что без МЛ, за счёт простого перебора параметров, не получается, это путь в никуда. Работу над биржевыми данными высокого разрешения вел около месяца, попутно улучшая свою библиотечку для временных рядов.

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

Прогресс существенный:

1) благодаря библиотеке AlorPy настроил сбор стриминговых данных от брокера и сохранение в базу. Прилетают просто сотни изменений стаканов в секунду.

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

3) сегодня несколько усложнил модель с использованием своей достаточно богатой библиотечки статпризнаков над 3 группами торговых факторов. Офигел от количества требуемых расчётов. На 16 ядрах 1 торговый день будет обсчитываться около часа. И это я ещё урезал хотелки. На первых порах домашний сервер сойдёт, но для серьёзной работы только облако, только Dask/Spark. Благо бэк сервиса поиска дешёвых серверов у меня готов и работает уже 2 недели без сбоев.

На сегодня план дописать многопоточный расчёт признаков. В течение недели:
1) обсчитать хотя бы месяц торгов и построить пару моделек с разными таргетами
2) написать простой бэктестер и потестить несколько торговых политик, основанных на прогнозах
3) научиться применять лучшую модель на живом потоке рыночных данных
4) запустить робота с лучшей политикой в работу

Всё это хотел сделать за выходные к сегодняшнему утру вообще-то, но теперь не уверен, хватит ли даже недели.
#trading #erema

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

В общем, решил не гнать лошадей ) Сверю форматы данных, проведу небольшой бэктест сегодня. А завтра уже попробуем сделки.
#trading #erema #tradingpolicy

Допилил бэктестер, выяснилось, что полученной предсказуемости на акциях едва достаточно, чтобы побить комиссию. Но это я построил 1 модель без тюнинга на первом попавшемся таргете, относительно небольшом датасете. Торговая политика тоже была недостаточно проработанной: к примеру, даже если ей подавать истинные вероятности изменения цены вместо прогноза (читерство), торгуя 1 лотом Магнита (~5 т.р.), за день можно заработать чистыми 500р., при этом комиссия брокера составит 300р. Наверняка это можно улучшить. Осознал, что ML и торговую части можно прорабатывать почти независимо, если у моделек сохранять предсказания на всех OOS днях.
#trading #erema #planning

Собрал воедино рой мыслей по поводу дальнейших шагов. Вырисовывается план из 3 фаз. 1ю попробую сделать в течение июля и на домашнем компе. Дальше посмотрим.
#trading #scalping #erema #mlops #experimenting #mlflow

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

Иногда при работе над очередным проектом думаешь: а что лучше, отдать работу с категорийкой на откуп бустингу, или попробовать что-то из category_encoders? И вообще, что считать категориальными факторами, то, что имеет тип данных categorical/object, или что имеет мало уникальных значений? А "мало" - это мало вообще, или по отношению к конкретному типу данных и диапазону? А может, вообще все непрерывные побить на с помощью KBinsDiscretizer, что тогда будет, лучше или хуже, и насколько? Или может, вообще удалить категорийку, вдруг будет не сильно хуже, но быстрее?

А пропуски как обрабатывать? А всё это вместе взятое сколько комбинаций составит?

Раннюю остановку использовать или нет, и когда?

Какая модель в итоге лучше сработает, бустинг или нейронка? Блин, а нейронке-то напрямую нельзя подать категориальные фичи, надо выкручиваться.

А если гиперпараметры тюнить? А фичи отбирать? А что, если вообще поработать с группами фичей по отдельности (например, рыночные, новостные, фундаментальные), какого результата каждая достигнет??

А если потом модельки от разных в групп в ансамбль объединить, лучше станет, и насколько?

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

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

А как всё это грамотно отобразить, чтобы не потеряться в тысячах комбинаций? А как при этом работать в команде?

Наверняка к подобным вопросам со временем, или при работе над особо сложным проектом, приходит любой дата сайентист/кэгглер, который хорошо делает свою работу. Настало и моё время )

Трейдинговый проект #erema меня просто ошеломлял количеством факторов, возможных таргетов и ML опций, которые хотелось проверить. Так что после 2 месяцев работы я получил процедуры, которые на базе mlflow как раз позволяют разбить всё многообразие опций на блоки и проверить их по отдельности.
#trading #erema

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

Также добавил простые ансамбли (4 вида средних).

Добавил отдельный отчёт МЛ-метрик в разбивке по дням (в отличие от всего test set).

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

Некоторые вещи успростил, т.к.
1) mlflow плохо работает с большой вложенностью (иногда вылезают глюки, плюс нет кнопки expand all, а почти все питоновские веб-сервера тормозят из-за отстутствия client-side скриптов
2) время для перебора опций конвейреа требуется на текущих объёмах (десятки и сотни миллионов строк) простно неподъёмное. зря я на это замахнулся, это применимо тоько для небольших датасетов, или для командной работы в компаниях где много железа

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

У меня сейчас выбран 1 горизонт, и на нём есть 6 таргетов (классификации). Также есть 3 рынка, на каждом 1-2 десятка инструментов.
Фичерсет один, состоит из 5 групп признаков.

Попытаюсь с минимальной креативностью и максимально быстро проскорить, а где же лучшая предсказуемость (таргет, рынок, инструмент). Никаких опций конвейера, только FS. ES=True, 2 бустинга с обучением на GPU. Миссинги и категорийку на откуп моделям. Никакого CV, на это не хватит времени. SHAP-важность признаков не оценивать, только нативную. На HPT, конечно же, времени опять нет.

Хочется получить что-то минимально работающее уже, а то в стремлении к совершенству я потратил 2 месяца непонятно на что (

Пока модельки будут обучаться, попробую независимо улучшить торговую политику на этих таргетах.
#trading #erema

Прогресс

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

Пока у меня такой сеттинг: есть train, val, test множества, состоящие из последовательных торговых дней. На train обучается несколько базовых моделей, с ранней остановкой по validation. Каждая базовая модель в конце делает прогнозы на все 3 множества. Для голосующих ансамблей прогнозы базовых моделей просто усредняются одним из математических средних. Для полноценного стэкинга же создаётся свой train и val наборы, в качестве признаков подаются выходы базовых моделей+их построчные аггрегаты. Разбиение на train/val для стэкинга тестировал в 5 вариантах: все комбинации train/val базовых моделей, а также train+val базовых, но со случайным отбором 15% на новый val. Я ожидал увидеть на test, что использование старого train в стэкинге токсично, и лучшие результаты покажет сплит старого val/val.

Результаты:

для стэкинга, не только старый train, но и val тоже оказался токсичным (из-за того что на нём работала ранняя остановка). то есть для стэкинга нужно выделять отдельный набор, которой вообще никак не используется при обучении базовых моделей, даже косвенно.

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

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

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

Добавил несколько новых метрик в трэкинг, исправил старые.

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

Планы

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

Пока решил оставить за бортом улучшения конвейера (FS, HPT), стэкинг,dask, новые признаки (хотя уже примерно понятно, куда копать). Эта возможность появилась, т.к. я сменил старый рынок на рынок с более низкой комиссией, и придумал как переделать торговую политику. По сути, я не сделал шаг вперёд к новой фазе проекта, а вернулся к старой фазе, но с лучшими инструментами трэкинга.

Ставлю сейчас обучение по нескольким таргетам (но одному горизонту и одному рынку), 3 разных бустинга. Для самого прогнозируемого таргета сделаю новый бэктест.
#trading #erema

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

В результате посл. месяца работы у меня теперь есть:
правильно нормализованные данные (а цены, объёмы, открытые интересы надо нормализовать по-разному)
статы по подгруппам и категориальным факторам
статы над взвешиванием
статы над вейвлетами
статы над отношениями, разностями
статы над скользящими окнами от пандас
робастные подмножества
новый блок рыночных профилей
новый детальный блок "просадочных" фичей
мультиокна (время, сделки, валютные объёмы, имбалансовые)
окна инструмент vs рынок
живые корреляции и фичи по "наиболее коррелированному с данным инструменту"
более экономное хранение признаков, перевод вычисления их части после открытия файлов данных
добавление нового признака "красивости/круглости" цен, по рекомендациям скальперских видосов
допфичи, связанные со спецификой фьючерсов (базовый тикер, время до экспирации)
новые фичи для детекции mean reversion
фичи по динамическим интервалам (от макс и мин цены по инструменту за тек. сессию)

В процессе реализации:
фичи по инструменту и рынку за прошлый день
посекторные фичи биржи за прошлый день
фичи netflow2 за прошлый день
почасовые фичи futoi
улучшение фичей по OI и TotalBids/TotalAsks (повышение их статуса до интервальных)
то же по "стаканным" фичам, + некоторые доппризнаки опять же по советам доменных экспертов
динамические таргеты, больше базовых статистик, скользящие статы от предыдущих таргетов как допфакторы
, triple barrier targets
ranked targets

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

О производительности и требуемых мощностях. По одному окну признаков-кандидатов рассчитывается уже более 10 тысяч, в 1 поток расчёт идет полминуты (это лишь 1 момент на бирже!). А таких окон планируется десятки. И в день таких моментов миллионы. Надо сказать, что с 128 Гб RAM я признаки даже из Фазы 0 проекта не смог промоделировать более 10 торговых дней. А ведь это я пока работаю только с упрощённым и неполным набором данных. Соответственно, дальше работать можно только в парадигме bigdata с кластерными вычислениями и горизонтальным масштабированием.

Для кластерных расчётов я выбрал Dask, и мне ещё предстоит обеспечить совместимость с ним моих существующих ML конвейеров, да и грядущего отборщика признаков Diogenes. Также в октябре-ноябре, видимо, предстоят облачные расходы в сотни и тысячи долларов, что уже начинает бить по бюджету, т.к. последние полгода я не отвлекался на сторонние подработки. Если к 1 ноября получится обучить первые модельки в Dask на всех этих новых признаках, это уже можно будет считать успехом )

Кстати, раскрою секрет, применение моего полусырого отборщика признаков в Фазе 0 значительно улучшило OOS ML-метрики, что очень вдохновляет.

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