Блог им. IlyaT79

Градиентный бустинг с годовой перспективой

Я весьма далек от инвестирования, но в свободное от всего остального время, люблю поиграться с машинным обучением. Недавно попробовал научить модель предсказывать цены на год вперед (на фундаментальных фичах без анализа временных рядов). Получилось не так чтобы супер, но и не совсем позор (MAPE ~ 18%). Потом я решил промоделировать: что будет если в начале года покупать акции с самым большим потенциалом роста. На 3 годах, модель один раз немного слила, а в остальные разы неплохо заработала. Графики ниже. Для каждого года переучивал модель на более ранних данных. Мне 42 года и большую часть из них я в сказки не верю, поэтому думаю что это выглядит слишком хорошо чтобы быть правдой. Если бы в природе существовали такие фичи, которые давали бы прибыль больше чем рандом, то наверное человечество бы их заметило и учло раньше меня. С другой стороны, обидно будет через некоторое время понять, что на этом можно было заработать, а я не воспользовался шансом. Соответственно сижу и думаю — что мне теперь с этим делать дальше. Поиграться на реальные деньги? Как-то боязно…
Градиентный бустинг с годовой перспективой
Градиентный бустинг с годовой перспективой
Градиентный бустинг с годовой перспективой


★1
59 комментариев
еслив начале года покупать акции с самым большим потенциалом роста. С другой стороны, обидно будет через некоторое время понять, что на этом можно было заработать, а я не воспользовался шансом. Соответственно сижу и думаю — что мне теперь с этим делать дальше.
Не уверен — не обгоняй! ©
 А если покупать акции, любые «голубцы», не в начале года, а на обвале, которые регулярно происходят ( тот же 2020) — то что происходит дальше? Посмотрите графики.
Поиграться на реальные деньги? Как-то боязно…
Правильно, играться боязно, проигрывать накладно. Поэтому на бирже нужно работать и зарабатывать. В т.ч. и сводя риски и накладные расходы к минимуму. Работа, как работа, ничего особенного…
avatar
правильно боишься, твой результат полная чушь
avatar
wrmngr, а можно больше подробностей? в чем я не прав? как можно себя лучше проверить? как можно улучшить результат?
avatar
Илья Т., забей, это не работает в принципе начиная с 2006 года (примерно).
Заведи штуку баксов на крипту и покупай альты по моментуму, толку будет больше 
avatar
wrmngr, спасибо! Аргументированно и по делу.
avatar
Victor Gromov, я не понял этого 
avatar

1. А можно посмотреть 1 график спреда за эти 3 периода? Спреда между индексом и вот этим вот вторым графиком. Конечно, если ты байэндхолдишь вот так, то даже если активы хорошие берешь, то корреляция с индексом будет высокая у эквити и, соответственно, просадки тоже будут жирные. А вот если только альфу торговать, то может быть интересней. Хотя если обычный байэндхолд не вызывает особой тревоги даже в грустные времена, то торговля по модели должна быть ещё приятней.


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

3. По поводу того, насколько результаты хорошие — как в (1) написал, просадочки приличные, но эдж модель, кажется неплохо выхватывает.

4. По поводу того, насколько модели и результатам можно доверять. Слишком мало данных. Самый минимум, который нужен — чистый OOS результат — чтоб прям вообще никак не связанный с данными, на которых учился ну и без всяких фокусов а-ля, обучили 50 моделей, провели 50 OOS, отобрали одну модель с лучшим OOS. И прочих способов самообмана.

avatar
Replikant_mih, А можно посмотреть 1 график спреда за эти 3 периода? Спреда между индексом и вот этим вот вторым графиком.
Я не очень понял какой график нужен. Я нарисую, вы только объясните...
Вообще, «я не настоящий сварщик, я только каску нашёл» поэтому не понял многих слов из Вашего видимо неплохого комента:
-если только альфу торговать
-чистый OOS результат (я мысль примерно понял, насколько я разумею в ML — я делал четсно. Тут есть какие-то натяжки. например я исходил из того что отчетность за прошедший год доступна сразу в начале следующего, но мне какжется это мелочи)
avatar

Илья Т., Про спред: Ну вот график индекса — красненький) и синий — тестовый портфель, эквити как синий ты получишь если купишь портфель инструментов по модели, красный — если купишь индекс. Но видно (хотя надо все-таки глянуть на график спреда, потому что начинаю склоняться к версии MadQuant из комментария ниже)) ), что графики отдаляются с некоторой выраженной силой, это можно заэксплуатировать, отторговать. Например, взять фьючерс на индекс и зашортить его (продать), а корзину модели — купить. В этом случае ты будешь в плюсе если графики будут отдаляться, причем синий сверху. 

 

С точки зрения как нарисовать — ну это просто один вычесть из другого на 3-х графиках, ну и слепить в один — чтоб начинался в новом году график не с нуля, а с той точки где в прошлом году закончился график спреда.

avatar
Replikant_mih, вроде бы вот:



avatar
Илья Т., Не ну ничё так), за подольше период бы посмотреть и, возможно, совместить на одном графике с графиком индекса.

Мой опыт показывает, что если не перемудрить с архитектурой и взять наполненные смыслом признаки, то извлекающая смысл модель — вполне себе ожидаемый результат.
avatar
Илья Т., если бы отчетность за следующий год была доступна уже сегодня, то я бы на этих «мелочах» уже бы пару миллиардов сделал 
avatar
Kot_Begemot, вы всё не правильно поняли. речь идет о том что модель котрая на бэктесте принимает решение 1-го января оперирует данным из отчетности за прошедший год. Это безусловно моя ошибка т.к. 1-го января отчетности за прошедший год еще нет. Я исправил это. Подродности в следующем посте.
avatar
Соответственно сижу и думаю — что мне теперь с этим делать дальше. Поиграться на реальные деньги? Как-то боязно…

Выделите 5-10-15% портфеля на эксперименты.
avatar
Честно говоря, судя по картинкам — ваша система просто покупает самые волатильные акции (например, самые закредитованные по Долг/ЕБИТДА, если по фундаменталу отбираете). И дальше если рынок растет — они растут сильнее, если рынок падает (как в 2018-м) — они падают сильнее. Вместо машинного обучения могу порекомендовать просто купить СнП с плечом 2 (даже ЕТФ под это есть).
avatar
MadQuant, ну в 20-м аккуртано упала. 
Вместо машинного обучения могу порекомендовать просто купить СнП с плечом 2 (даже ЕТФ под это есть)
Не. Мне в ML интересно.
avatar
Илья Т., ну в 20-м аккуратно упала, но зато в 18-м очень неаккуратно упала, а в 19-м вроде индекс обогнала в 3 раза — но просадки более чем в 3 раза больше. То есть в среднем, кажется, это работает примерно как заплечеванный индекс.
Если вы хотите меня (и себя) убедит в обратном, и с индексом качество сравнивать — так делайте это минимум лет за 13 хотя бы (чтобы 2008-й обязательно захватить) + используйте стандартные метрики доходость/риск — Шарп, Кальмар, Сортино, Ulcer index.
Пока что это выглядит как отсутствие предсказательной способности, но вы зачем-то пытаетесь меня убедить, что это хорошо. Хотя профессиональные кванты делают ровно наоборот: даже если модель выглядит хорошо, они пытаются ее как-то «сломать», чтобы доказать себе, что она плохая. И только если это не удается — ставят ее в демо посмотреть полгодика, как она будет работать out-of-sample.
avatar
MadQuant, согласен с Вами. Убедить не пытаюсь. Правда. У меня нет достаточно данных чтобы сформировать обучающую выборку с глубокой историей. Я учу на данных с 2000-года. При валидации — каждый год назад, дает заметную просадку в качестве. Т.е. если для 20-года ошибка 18% то для 18-го уже 25 итд…
avatar
Илья Т., 
При валидации — каждый год назад, дает заметную просадку в качестве. Т.е. если для 20-года ошибка 18% то для 18-го уже 25 итд…
Это как раз очень подозрительно. Для нормальной модели вообще не должно быть существенной разницы, учить ее на 20-ти годах даных или на 18-ти, или на 10-ти. На самом деле, даже 10 лет — это уже очень много, информация на рынке устаревает гораздо быстрее. Если у вас при удалении 10% данных из обучающей выборки ошибка почти на 40% растет — это большой повод задуматься, все ли вы правильно делаете, и насколько неслучаен результат.
avatar
MadQuant, Если у вас при удалении 10% данных из обучающей выборки ошибка почти на 40% растет — это большой повод задуматься, все ли вы правильно делаете
Да в общем я примерно догадываюсь в чем проблема. Я беру 500 компаний. Годовую статистику за 20 лет. 300+ фич. Т.е. у меня обучающая выборка получается размерностью 10 000 на 300. Для градиентного бустинга это уже не очень «удобная» конфигурация. Наверное надо попробовать взять больше акций и тогда получится сильнее нырять в глубину
avatar
Илья Т., Где кстати, данные берете?
avatar
Replikant_mih, в основном на yahoo
avatar
Илья Т., Надо тоже попробовать), ни разу на не ценовых данных не обучал модели для торговли). Кстати ещё можно попробовать для IPO обучить модель — там, правда, ещё меньше данных будет, наверно).
avatar
Илья Т., а где на Яху данные за 20 лет взять? Я думал там только 4-5 последних лет от силы можно выгрузить?
Кроме того, с данными с Яху и вообще фундаменталом для обучения нужно быть осторожным — публикация данных задерживается на 90 дней минимум, а в отдельных случаях на 180-360. Поэтому если вы формируете портфель в начале 2020 года — нельзя в это время использовать отчётность за 2019 год, иначе это будет «заглядывание в будущее». Вы этот нюанс учитывали в своем исследовании?
avatar
MadQuant, по API много чего доступно за 20 лет. Чего недоступно — добираю в других местах.
Вы этот нюанс учитывали в своем исследовании?
Нет
avatar
Илья Т., тогда текущие результаты можно выбросить в мусор и переделать хотя бы со сдвигом на 90, а лучше 180 дней. Потом уже обсуждать что останется от результатов выше.
avatar
MadQuant, согласен 
avatar
Илья Т., 
по API много чего доступно за 20 лет

Было бы полезно для многих, если бы Вы хотя бы вкратце API описали.
Где взять? Стандартные примеры закачек.
avatar
_sg_, не думаю. это все много раз описано в этих ваших интернетах. есть даже готовые библиотеки для некоторых ЯП
avatar
Илья Т., Глупый вопрос, подскажите где у яху доступен фундаментал за 20 лет? и что конкретно? А то я что то не нашел, многих вещей там.
CloseToAlgoTrading, нет. этого у яху нет. это беру тут: financialmodellingprep.com
avatar
Илья Т., о… спасибо… Все бесплатно? и как много запросов можно посылать?
MadQuant, про
Шарп, Кальмар, Сортино, Ulcer index.
буду читать
avatar
Вообще, если хотите понять, выбирает ли ваша система бумаги лучше, чем случайно, рекомендую сделать следующее:
1) В начале каждого года упорядочить акции по предсказанной доходности — от самой маленькой до самой большой
2) Разбить на 5 портфелей: в первом 20% акций с самой маленькой предсказанной доходностью, ..., в пятом — 20% акций с самой большой
3) Портфель #1 зашортить на 65% от торгового капитала, портфель №2 — на 35%, портфель №4 — в лонг на 35% от торгового капитала, портфель №5 — в лонг на 65%. Суммарно у вас должен получиться денжно-нейтральный портфель (а если предсказания не зависят от левериджа и волатильности — то и примерно рыночно- и бэта-нейтральный)
4) Далее выполняем стандартный тест на значимое отличие результата от нуля. Можно посчитать t = (годовой шарп) * sqrt(количество лет), и если эта штука больше 3 — можно считать, что ваш предиктор работает.
avatar
MadQuant, я всех слов не понял, но сложилось впечатление что «денжно-нейтральный портфель» у меня бы получился если бы сумма всех ростов была бы нулевой, а ведь это не так. Тем более, с учетом того что я беру акции из индекса S&P500. Но можно наверное взять поправку на изменение индекса или как я писал выше взять больше акций.
В любом случае, идея смотреть не только вверх своей отсортированной таблички но и вниз — богатая. Спасибо. Буду её думать.
avatar
Илья Т., «сумма всех ростов» значения не имеет — мы же в итоге 5 портфелей делаем, и 2 торгуем в Лонг, а 2 в шорт, поэтому если предсказательная способность у модели есть — итоговый денежно-нецтральный портфель должен давать статистически значимо положительный перформанс.
avatar
MadQuant, не понимаю. если у нас условно говоря(!) вообще все акции растут то те, которые мы торгуем в шорт будут снижать перформанс тех которые мы торгуем в лонг.
avatar
Илья Т., да, так и есть, а нам какая разница? Мы же тестируем, что то, для чего вы предсказали более высокие ретурны, будет обгонять то, для чего вы предсказали более низкие. Если это так — то описанная мной портфелька будет значимо расти. А если это не так — то не будет.
На самом деле, описанная мной процедура — это самый классический академический подход к тестированию того, что нечто умеет значимо предсказывать аутперформанс.
avatar
Илья, пробовать надо. Если нет уверенности, то просто небольшой суммой, чтобы их потеря не вызывала депрессии. Ещё можно поработать с рисками, например если показывает что скоро будет просадка, а потом рост, то дождаться просадки, если она произойдёт в реале войти в позицию с коротким стопом, если дальше график хорошо коррелирует с моделью можно трейлить стоп основываясь на динамике модели, если пойдёт раскорреляция модели с графиком просто остопит а в этом момент это уже будет прибыль
Поставил высасываться историю 25000 акций. Займет это у меня наверное неделю. А потом я выясню, что такой датасет не помещается в память видео-карты.  А потом я буду думать как его сократить. )))
Пока есть время разобраться с коэффициентом Шарпа и др.
avatar
Илья Т., не загоняйте весь датасет в память, уже ведь все готово, что бы подавать данные блоками.
@Илья Т. , интересный рисеч! У вас есть «небольшое» заглядывание в будущее. Вы включаете акции в портфель в начале года, а отчеты начинают выходить в конце января только. Например, Алкоа опубликовала резалты только 20.01.2021, а вы уже использовали эти данные 01.01.2021.

Интересно посмотреть динамику портфеля из топ 5, 10, 20 % акций, выбранных по вашей метрике и сравнить Шарп полученных портфелей с Шарпом у индекса.



avatar
yurikon, да я знаю об этом чите. я в одном из коментов выше об этом писал. думаю что на текущем этапе можно принебречь.
о существовании коэффициента Шарпа я узнал только вчера, поэтому сейчас изучаю этот вопрос.
avatar
Илья Т., я бы все же обратил внимание на этот маленький фактор, ибо даже небольшое заглядывание в будущее дает заведомо ложные результы.
CloseToAlgoTrading, да. я не знал что отчетность выходит так поздно. переделываю.
avatar
Если тесты сделаны как кросс-валидация (OOS), то более-менее, но даже с учетом этого, нужно понимать, что на кросс-валидации можно что угодно получить, особенно при старте от 300 фич. Это слишком много. Random Subspace по паре фичей, может быть… PCA по фичам… нужно уменьшить рандом на входе, чтобы не подгонять его под рандом на выходе. 

Градиентный Бустинг я бы тут вообще не применял, хотя у меня есть пара топиков именно для решения подобных задач. Но я то знаю, что это простая декомпозиция, а декомпозировать можно всё что угодно, в т.ч. случайный шум. Поэтому приходится извращаться перед применением и очень сильно.
avatar
Kot_Begemot, 
Если тесты сделаны как кросс-валидация
Ну на временных данных не совсем честно делать кросс-валидацию потому что тогда в модель просачивается информация о будущем. Я тренируюсь на одном временном интервале, валидируюсь на случайной выборке из него же, а тестируюсь на следующем годе.
Random Subspace по паре фичей, может быть… PCA по фичам
PCA убивает интерпретируемость модели, а мне бы этого на данном этапе не хотелось т.к. анализируя feature importance я определяю шаги для дальнейших улучшений. Может позже.
Я пробовал sequential feature selection и это стоило мне нескольких дней жизни без компьютера, а результат меня не впечатлил.
Градиентный Бустинг я бы тут вообще не применял
Почему? А что применяли бы?
у меня есть пара топиков именно для решения подобных задач
Я попробовал найти, но не смог. Не могли бы дать ссылки?
avatar
Илья Т., 

Я тренируюсь на одном временном интервале, валидируюсь на случайной выборке из него же, а тестируюсь на следующем годе.

Какой в этом смысл? Валидация это и есть тест на новых данных, не входящих в обучающее множество.

Я пробовал sequential feature selection и это стоило мне нескольких дней жизни без компьютера, а результат меня не впечатлил.

Зато он приближает результат к реально воспроизводимому. У вас слишком мало решений и слишком много изначальных фич. Здесь обучить что-либо вообще нереально. 

Почему? А что применяли бы?

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

Я попробовал найти, но не смог. Не могли бы дать ссылки?

smart-lab.ru/blog/532764.php
smart-lab.ru/blog/536499.php
smart-lab.ru/blog/557358.php
smart-lab.ru/blog/558494.php
avatar
Kot_Begemot, 
Какой в этом смысл?
В моем случае — понять как ведет себя модель на периоде, который она не видела. Как раз для того чтобы убедиться что мой «случайно удачный» результат не до конца случаен.  В общем случае смысл разбивки на трэйн, валидэйшн, тест описан вот здесь, то на что вы ссылаетесь описано в разделе «Confusion in terminology»
Попробую чуть подробнее пояснить.
Мне надо натренировать градиентбуст: в процессе тренировки я выполню 100 000 итераций и каждая следующая  даст лучший результат на трэйн множестве, чем предыдущая. Как понять — на каком шаге модель выучивает общие законерности природы, а на каком переобучается под частные особенности конкретного датасета? Проверять на каждом шаге предсказния модели на данных, которые не входили в трэйн множество (validation dataset).Если предсказания модели на валидации улучшаются до 1000 шага, а потом ухудшаются то я могу предположить что с 1001 шага модель занимается оверфитингом и остановиться на 1000м шаге. 
Я получил какую-то модель. Как мне понять, что в будущем я смогу её эффективно использовать? Показать ей третий датасет, сформированный из данных, полученных в более позднее время (test dataset)
на выходе вы все равно получите случайно удачный результат. Почему? Потому что на большом наборе случайных чисел всегда можно получить удачный результат
Ну вообще так весь ML работает. ))) Какие предложения? Отказаться от него совсем?

upd: немного дополню. В ML есть две фундаментальные проблемы: дураки дороги high bias и high variance. Причем с первой мы можем бороться по-большому счету только одним способом: больше данных богу данных. С другой стороны для борьбы переобучением применяется целый арсенал способов: описаный выше ранний останов обучения, регуляризация десятками разных способов, фича селекшн, undersampling  итд…
smart-lab.ru/blog/532764.php...
Очень интересно. Спасибо. Читаю.
avatar
Илья Т., 

Если предсказания модели на валидации улучшаются до 1000 шага, а потом ухудшаются то я могу предположить что с 1001 шага модель занимается оверфитингом и остановиться на 1000м шаге.

Верно.

Ну вообще так весь ML работает. ))) Какие предложения? Отказаться от него совсем

Как ни странно — да.  Тут даже более простыми методами с регуляризацией типа AR работать не получается. Спросите у любого опытного алготрейдера и он вам скажет, что NN и ML место на помойке. 

Это не значит, что их нельзя использовать вообше. Вообще можно, но очень осторожно. Например, типичным алго-приемом является «облако» параметров, полученное как Bagging от аналогичных по-сути индикаторов. Bagging/Bootsrap — в данном случае универсальны, так как не образуют последовательных разложений (подгонку вида остаточный шум-шум).

Всё остальное по умолчанию не работает, но при очень сильных изменениях алгоритмов и жестких ограничениях по прогону на validation set теоретически может использоваться.

А теперь посчитайте свой спред по предложенному MadQuant алгоритму — он не проходит валидационный тест Z (Mad называет его тест T, то есть Студента), да ещё у вас под килем 300 фичей. А на 300 фичах тест должен быть в 20 раз лучше.
avatar
Kot_Begemot, 
он не проходит валидационный тест Z
ну на самом деле мои циферки против  S&P500 не просто проходят Z-тест, а я бы сказал пролетают со свистом (z = 0,1).  К сожалению это ни о чем не говорит т.к. z-тест применим только к нормально-распределенным значениям.
avatar
Илья Т., вообще пофигу на нормальность. А тест на глаз проваливают со свистом, как там у вас прошли не понятно.

Какой годовой шарп разницы портфеля и sp500?
avatar
Kot_Begemot, за 20й год 0,84. Остальные не считал пока. Посчитаю и  скажу чуть позже.



avatar
Kot_Begemot, 
средний Шарп за 7 лет против S&P500  = 0,18
Я не знаю какие выводы из этого можно сделать )



avatar
Илья Т., 

0.18*7^0.5 = 0.47

А вам нужно где-то 2-3, для того чтобы быть уверенным в том, что модель работает. А так торговать её примерно то же что и купить индекс.

Впрочем, надо сказать, обогнать SP500 его же составом акций весьма не просто и 1.3 вполне приличный Шарп. То есть тут только наращивать выборку.     
avatar
Kot_Begemot, 
0.18*7^0.5 = 0.47
что это за магия?
avatar
Илья Т., 

Далее выполняем стандартный тест на значимое отличие результата от нуля. Можно посчитать t = (годовой шарп) * sqrt(количество лет), и если эта штука больше 3 — можно считать, что ваш предиктор работает.

стандартный Z тест для критической вероятности >99%. 
avatar

теги блога Илья Т.

....все тэги



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