Илья Т.
Илья Т. личный блог
08 мая 2021, 20:58

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

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


59 Комментариев
  • О'Грин
    08 мая 2021, 22:07
    еслив начале года покупать акции с самым большим потенциалом роста. С другой стороны, обидно будет через некоторое время понять, что на этом можно было заработать, а я не воспользовался шансом. Соответственно сижу и думаю — что мне теперь с этим делать дальше.
    Не уверен — не обгоняй! ©
     А если покупать акции, любые «голубцы», не в начале года, а на обвале, которые регулярно происходят ( тот же 2020) — то что происходит дальше? Посмотрите графики.
    Поиграться на реальные деньги? Как-то боязно…
    Правильно, играться боязно, проигрывать накладно. Поэтому на бирже нужно работать и зарабатывать. В т.ч. и сводя риски и накладные расходы к минимуму. Работа, как работа, ничего особенного…
  • wrmngr
    08 мая 2021, 22:35
    правильно боишься, твой результат полная чушь
      • wrmngr
        08 мая 2021, 23:06
        Илья Т., забей, это не работает в принципе начиная с 2006 года (примерно).
        Заведи штуку баксов на крипту и покупай альты по моментуму, толку будет больше 
  • Replikant_mih
    08 мая 2021, 22:51

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


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

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

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

      • Replikant_mih
        08 мая 2021, 23:28

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

         

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

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

            Мой опыт показывает, что если не перемудрить с архитектурой и взять наполненные смыслом признаки, то извлекающая смысл модель — вполне себе ожидаемый результат.
      • Kot_Begemot
        15 мая 2021, 23:00
        Илья Т., если бы отчетность за следующий год была доступна уже сегодня, то я бы на этих «мелочах» уже бы пару миллиардов сделал 
  • iddqd3n
    08 мая 2021, 22:55
    Соответственно сижу и думаю — что мне теперь с этим делать дальше. Поиграться на реальные деньги? Как-то боязно…

    Выделите 5-10-15% портфеля на эксперименты.
  • MadQuant
    08 мая 2021, 22:56
    Честно говоря, судя по картинкам — ваша система просто покупает самые волатильные акции (например, самые закредитованные по Долг/ЕБИТДА, если по фундаменталу отбираете). И дальше если рынок растет — они растут сильнее, если рынок падает (как в 2018-м) — они падают сильнее. Вместо машинного обучения могу порекомендовать просто купить СнП с плечом 2 (даже ЕТФ под это есть).
      • MadQuant
        08 мая 2021, 23:44
        Илья Т., ну в 20-м аккуратно упала, но зато в 18-м очень неаккуратно упала, а в 19-м вроде индекс обогнала в 3 раза — но просадки более чем в 3 раза больше. То есть в среднем, кажется, это работает примерно как заплечеванный индекс.
        Если вы хотите меня (и себя) убедит в обратном, и с индексом качество сравнивать — так делайте это минимум лет за 13 хотя бы (чтобы 2008-й обязательно захватить) + используйте стандартные метрики доходость/риск — Шарп, Кальмар, Сортино, Ulcer index.
        Пока что это выглядит как отсутствие предсказательной способности, но вы зачем-то пытаетесь меня убедить, что это хорошо. Хотя профессиональные кванты делают ровно наоборот: даже если модель выглядит хорошо, они пытаются ее как-то «сломать», чтобы доказать себе, что она плохая. И только если это не удается — ставят ее в демо посмотреть полгодика, как она будет работать out-of-sample.
          • MadQuant
            09 мая 2021, 00:08
            Илья Т., 
            При валидации — каждый год назад, дает заметную просадку в качестве. Т.е. если для 20-года ошибка 18% то для 18-го уже 25 итд…
            Это как раз очень подозрительно. Для нормальной модели вообще не должно быть существенной разницы, учить ее на 20-ти годах даных или на 18-ти, или на 10-ти. На самом деле, даже 10 лет — это уже очень много, информация на рынке устаревает гораздо быстрее. Если у вас при удалении 10% данных из обучающей выборки ошибка почти на 40% растет — это большой повод задуматься, все ли вы правильно делаете, и насколько неслучаен результат.
              • Replikant_mih
                09 мая 2021, 10:39
                Илья Т., Где кстати, данные берете?
                  • Replikant_mih
                    09 мая 2021, 10:49
                    Илья Т., Надо тоже попробовать), ни разу на не ценовых данных не обучал модели для торговли). Кстати ещё можно попробовать для IPO обучить модель — там, правда, ещё меньше данных будет, наверно).
                  • MadQuant
                    09 мая 2021, 12:21
                    Илья Т., а где на Яху данные за 20 лет взять? Я думал там только 4-5 последних лет от силы можно выгрузить?
                    Кроме того, с данными с Яху и вообще фундаменталом для обучения нужно быть осторожным — публикация данных задерживается на 90 дней минимум, а в отдельных случаях на 180-360. Поэтому если вы формируете портфель в начале 2020 года — нельзя в это время использовать отчётность за 2019 год, иначе это будет «заглядывание в будущее». Вы этот нюанс учитывали в своем исследовании?
                      • MadQuant
                        09 мая 2021, 12:45
                        Илья Т., тогда текущие результаты можно выбросить в мусор и переделать хотя бы со сдвигом на 90, а лучше 180 дней. Потом уже обсуждать что останется от результатов выше.
                      • _sg_
                        10 мая 2021, 10:42
                        Илья Т., 
                        по API много чего доступно за 20 лет

                        Было бы полезно для многих, если бы Вы хотя бы вкратце API описали.
                        Где взять? Стандартные примеры закачек.
                      • CloseToAlgoTrading
                        10 мая 2021, 11:23
                        Илья Т., Глупый вопрос, подскажите где у яху доступен фундаментал за 20 лет? и что конкретно? А то я что то не нашел, многих вещей там.
                          • CloseToAlgoTrading
                            10 мая 2021, 16:32
                            Илья Т., о… спасибо… Все бесплатно? и как много запросов можно посылать?
  • MadQuant
    09 мая 2021, 00:02
    Вообще, если хотите понять, выбирает ли ваша система бумаги лучше, чем случайно, рекомендую сделать следующее:
    1) В начале каждого года упорядочить акции по предсказанной доходности — от самой маленькой до самой большой
    2) Разбить на 5 портфелей: в первом 20% акций с самой маленькой предсказанной доходностью, ..., в пятом — 20% акций с самой большой
    3) Портфель #1 зашортить на 65% от торгового капитала, портфель №2 — на 35%, портфель №4 — в лонг на 35% от торгового капитала, портфель №5 — в лонг на 65%. Суммарно у вас должен получиться денжно-нейтральный портфель (а если предсказания не зависят от левериджа и волатильности — то и примерно рыночно- и бэта-нейтральный)
    4) Далее выполняем стандартный тест на значимое отличие результата от нуля. Можно посчитать t = (годовой шарп) * sqrt(количество лет), и если эта штука больше 3 — можно считать, что ваш предиктор работает.
      • MadQuant
        09 мая 2021, 11:53
        Илья Т., «сумма всех ростов» значения не имеет — мы же в итоге 5 портфелей делаем, и 2 торгуем в Лонг, а 2 в шорт, поэтому если предсказательная способность у модели есть — итоговый денежно-нецтральный портфель должен давать статистически значимо положительный перформанс.
          • MadQuant
            09 мая 2021, 12:27
            Илья Т., да, так и есть, а нам какая разница? Мы же тестируем, что то, для чего вы предсказали более высокие ретурны, будет обгонять то, для чего вы предсказали более низкие. Если это так — то описанная мной портфелька будет значимо расти. А если это не так — то не будет.
            На самом деле, описанная мной процедура — это самый классический академический подход к тестированию того, что нечто умеет значимо предсказывать аутперформанс.
  • Андрей Алферов
    09 мая 2021, 07:35
    Илья, пробовать надо. Если нет уверенности, то просто небольшой суммой, чтобы их потеря не вызывала депрессии. Ещё можно поработать с рисками, например если показывает что скоро будет просадка, а потом рост, то дождаться просадки, если она произойдёт в реале войти в позицию с коротким стопом, если дальше график хорошо коррелирует с моделью можно трейлить стоп основываясь на динамике модели, если пойдёт раскорреляция модели с графиком просто остопит а в этом момент это уже будет прибыль
    • CloseToAlgoTrading
      10 мая 2021, 11:27
      Илья Т., не загоняйте весь датасет в память, уже ведь все готово, что бы подавать данные блоками.
  • yurikon
    09 мая 2021, 12:03
    @Илья Т. , интересный рисеч! У вас есть «небольшое» заглядывание в будущее. Вы включаете акции в портфель в начале года, а отчеты начинают выходить в конце января только. Например, Алкоа опубликовала резалты только 20.01.2021, а вы уже использовали эти данные 01.01.2021.

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



      • CloseToAlgoTrading
        10 мая 2021, 11:28
        Илья Т., я бы все же обратил внимание на этот маленький фактор, ибо даже небольшое заглядывание в будущее дает заведомо ложные результы.
  • Kot_Begemot
    15 мая 2021, 23:11
    Если тесты сделаны как кросс-валидация (OOS), то более-менее, но даже с учетом этого, нужно понимать, что на кросс-валидации можно что угодно получить, особенно при старте от 300 фич. Это слишком много. Random Subspace по паре фичей, может быть… PCA по фичам… нужно уменьшить рандом на входе, чтобы не подгонять его под рандом на выходе. 

    Градиентный Бустинг я бы тут вообще не применял, хотя у меня есть пара топиков именно для решения подобных задач. Но я то знаю, что это простая декомпозиция, а декомпозировать можно всё что угодно, в т.ч. случайный шум. Поэтому приходится извращаться перед применением и очень сильно.
      • Kot_Begemot
        16 мая 2021, 12:14
        Илья Т., 

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

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

        Я пробовал 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
          • Kot_Begemot
            16 мая 2021, 16:29
            Илья Т., 

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

            Верно.

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

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

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

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

            А теперь посчитайте свой спред по предложенному MadQuant алгоритму — он не проходит валидационный тест Z (Mad называет его тест T, то есть Студента), да ещё у вас под килем 300 фичей. А на 300 фичах тест должен быть в 20 раз лучше.
              • Kot_Begemot
                16 мая 2021, 17:21
                Илья Т., вообще пофигу на нормальность. А тест на глаз проваливают со свистом, как там у вас прошли не понятно.

                Какой годовой шарп разницы портфеля и sp500?
                  • Kot_Begemot
                    16 мая 2021, 19:16
                    Илья Т., 

                    0.18*7^0.5 = 0.47

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

                    Впрочем, надо сказать, обогнать SP500 его же составом акций весьма не просто и 1.3 вполне приличный Шарп. То есть тут только наращивать выборку.     
                      • Kot_Begemot
                        16 мая 2021, 19:48
                        Илья Т., 

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

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

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн