Если вы один из счастливых читателей моей предыдущей статьи, добро пожаловать обратно! Если нет, я настоятельно рекомендую вам прочитать первую главу и вернуться после нее:



Напомним, что мы создали оптимизатор портфеля с Python и Tensorflow, который, учитывая набор криптовалют, извлекал исторические цены, вычислял матрицу дисперсии-ковариации, матрицу корреляции, а затем исследовал комбинации активов, чтобы максимизировать глобальный коэффициент Шарпа. .

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

Больше данных

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

Итак, если количество криптоактивов не является для нас ограничением, первое, что мы можем сделать, - это добавить еще много активов в наш портфель.

Более широкий спектр активов, как правило, сводит к минимуму глобальный риск, но также может снизить нашу ожидаемую доходность. Однако наш оптимизатор здесь, чтобы помочь нам найти баланс, улучшающий наш последний коэффициент Шарпа.

Запуск 5000 итераций AdamOptimizer с 7 активами поверх нашего предыдущего кода занимает 4.1 секунд. После добавления 23 оптимизатор принимает только 4.58!

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

Альтернативные оптимизаторы

В первой части наш оптимизатор быстро сконцентрировался на сценарии глобального 6-кратного возврата и больше никогда не сдвигался с этого места. Другими словами, он «учился слишком быстро».

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

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

Давайте определим пару помощников, чтобы построить график эволюции нашего обучения:

Итак, начнем с AdagradOptimizer, скорость обучения 0,0005 и 10 000 итераций:

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

Как бы он себя повел в первом случае?

Смотри, как мило! Наш оптимизатор почти мгновенно достигает отдачи 9,3x и коэффициента Шарпа 36,5! Давайте полностью сохраним эту комбинацию:

На момент написания он в основном говорит нам инвестировать в EOS, Stellar Lumens, The Verge и Binance Coin, хотя он все еще так быстро учится.

Примечание. На момент сборки Python Notebook рыночные условия менялись с течением времени, что повлияло на некоторые результаты. Подробнее о проверке портфеля и надежности будет позже.

Итак, давайте продолжим с другими алгоритмами. Попробуем с AdamOptimizer:

optimize_op = tf.train.AdamOptimizer(learning_rate=0.0005, beta1=0.9, beta2=0.999, epsilon=1e-08, use_locking=False)...

Немного лучше вначале, но потом по сути то же самое. После начального максимума коэффициент Шарпа немного падает, вероятно, мы перетренируемся. В любом случае поэкспериментируем со скоростью обучения:

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

Давайте попробуем гораздо медленнее:

На самом деле ничего нового. Давайте посмотрим, что мы можем сделать с другим алгоритмом оптимизатора.

Время для GradientDescentOptimizer:

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

Что ж, мы добились того же, только более прогрессивно.

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

Ограничения

В первой статье мы определили группу из трех ограничений, так что отрицательные значения стали 0, значения больше 1 стали 1, а сумма их весов равнялась 1.

Однако в двух первых ограничениях мы в основном отсекаем балансы, которые исследовал наш оптимизатор. Если бы вес двух монет был 1.2 и 1.5 в данной точке, наши ограничения установили бы их оба на 1 и потенциально лишили бы хорошей области поиска. Чтобы избежать фальсификации весов, мы могли бы использовать абсолютные значения и разделить на абсолютное значение суммы весов:

weights_sum = tf.reduce_sum(coin_weights)
constraints_op = coin_weights.assign(tf.divide(tf.abs(coin_weights), tf.abs(weights_sum) ))

Но теперь возникает новый вопрос: почему мы не допускаем отрицательных значений, если мы можем продать криптоактивы без покрытия?

Оптимизация портфеля обычно подходит для среднесрочных инвестиций, когда вы открываете длинные позиции. Короткие продажи обычно подразумевают уплату брокерского вознаграждения, поскольку мы продаем то, чем еще не владеем.

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

Короткая продажа

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

weights_sum = tf.reduce_sum(tf.abs(coin_weights))
constraints_op = coin_weights.assign(tf.divide(coin_weights, tf.abs(weights_sum) ))

Как это сделать?

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

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

Альтернативная минимизация

Если вы помните из предыдущей статьи, оптимизаторы в нашем распоряжении не предоставляли функции для максимизации выходного значения. Вместо этого мы решили минимизировать отрицательное значение коэффициента Шарпа.

Это вместо попытки минимизировать значение примерно до +0, уловка заключалась в том, чтобы стремиться к ∞. Однако что произойдет, если мы попытаемся уменьшить абсолютное значение (имитируя функцию ошибки)?

Во-первых, нам нужно сравнить яблоки с яблоками. 10000 итераций с GradientDescentOptimizer со скоростью обучения 0,0001:

Хорошо, давайте посмотрим, что произойдет, когда мы попытаемся минимизировать 1 / sharpe_ratio вместо -sharpe_ratio:

На первый взгляд кажется, что коэффициент Шарпа не так хорош, но график говорит нам, что выход еще не стабилизирован. Что, если мы допустим более высокую скорость обучения? Около 0,002:

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

Может разница и не большая, но все же стоит упомянуть. Как видите, диаграмма - Коэффициент Шарпа содержит только три актива. Однако диаграмма 1 / коэффициент Шарпа показывает от 5 до 6 объектов, сохраняя при этом эквивалентный коэффициент Шарпа (39.18 против 38.99).

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

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

Моделирование ежедневных возвратов

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

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

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

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

Итак, теперь давайте возьмем пару сценариев с разной скоростью обучения и количеством итераций для сравнения.

Следует отметить несколько моментов:

  • Менее подготовленный сценарий (2) имеет более разнообразное портфолио, но в любом случае похож на сценарий 1.
  • Оба сценария имеют одинаковый паттерн.
  • Сценарий 1 выбирает восходящие шипы лучше, чем второй.
  • Первоначальные инвестиции в размере 1000 долларов США в октябре 2017 года будут иметь оценку ~ 30 000 долларов США в конце января.
  • Однако в обоих сценариях всего за два месяца такая оценка упадет до ~ 10 000 долларов.

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

Если мы посмотрим на динамику общей рыночной капитализации за тот же период, мы увидим, что она выглядит почти так же, как на графике выше.

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

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

Такие результаты очень непостоянны и очень краткосрочны. Наш инструмент скорее предназначен для среднесрочных сценариев, основанных на стабильности тренда и не рассчитан на постоянное нарушение.

Итак, куда мы можем двигаться в этот момент?

Анализируйте традиционные активы

Это наиболее очевидная вещь, если проанализировать котировки акций Amazon, Apple, Google и им подобных. У вас уже есть инструменты и процесс. Не стесняйтесь получать данные из другой конечной точки API и настраивать исторические цены, чтобы включить их в свой не криптовалютный портфель.

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

Оптимизируйте только за счет волатильности

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

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

Итак, вот массивы весов, сгенерированные нашим минимизатором дисперсии. Независимо от волатильности выпуска, мы видим, что коэффициент Шарпа первого сценария снижается с начала обучения. Пока не многообещающе.

Но все же, как они на самом деле работают?

Что ж ... судя по изображениям, мы должны сказать, что «зеленый сценарий (со скоростью обучения 0,005 для 2500 итераций) выглядит более последовательным, чем x, y, z…». Действительно ?

Подожди, что во всем этом не так?

Стоит ли доверять результатам зеленого сценария, даже если сюжет выглядит неплохо? Абсолютно нет.

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

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

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

Отказ от вышеперечисленных способов заставляет нас исследовать еще одну вещь на сегодняшний день: Эффективный рубеж.

Эффективный рубеж

Возвращаясь к современной теории портфелей, есть еще один визуальный инструмент, который мы можем использовать для анализа потенциальных портфелей для набора активов.

Портфель считается «эффективным», если никакой другой портфель не достигает более высокой ожидаемой доходности при таком же уровне риска. Это может выглядеть так же, как указание на наивысший коэффициент Шарпа, но есть разница: несколько портфелей могут достичь одинакового коэффициента Шарпа с более высокой или более низкой доходностью / риск.

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

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

Следует отметить несколько моментов:

  • Красные точки обозначают доходность / риск отдельных криптоактивов.
  • Синие точки представляют собой доходность / риск портфелей, которые мы только что создали, а также временные портфели, найденные во время их обучения. Обратите внимание на хвост, который они оставляют, поскольку оптимизатор улучшает производительность.
  • Наиболее волатильные активы расположены справа, а наиболее прибыльные - вверху.
  • Синие точки имеют тенденцию образовывать гиперболу, как зеленый и красный сегменты внизу.

Зеленый сегмент с положительным наклоном - это рубеж эффективности.

  • Его верхний правый конец будет сценарием с максимальной доходностью, но подходит только для инвесторов, желающих взять на себя высокий риск. Следует избегать инвестирования в монету только на вершине, поскольку это противоречит лучшим практикам диверсификации.
  • Нижняя левая часть зеленого сегмента будет самым безопасным сценарием. Ожидаемая доходность постепенно снижается до тех пор, пока не будет найден минимальный риск.
  • Ниже этой точки риск больше не будет уменьшаться, даже если ожидаемая доходность продолжит снижаться. Это соответствует красному сегменту, и инвестировать в такие портфели было бы совсем не интересно.

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

Ниже приведен пример двух отдельных активов. Обратите внимание, что в каждом случае мы могли бы достичь той же ожидаемой доходности с портфелем с гораздо меньшим риском, что указано в конце зеленых стрелок. Кроме того, мы могли бы достичь гораздо более высокой доходности, если бы портфель был вверху желтых стрелок.

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

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

Вот блокнот Python этой статьи:

В части № 3 мы углубимся в использование разных таймфреймов и изучим альтернативные способы отдать предпочтение наиболее стабильно положительным портфелям с помощью машинного обучения. Будьте на связи!

Я знаю, что статья была глубокой и технической, но если вы сочли ее полезной, пожалуйста, хлопните в ладоши 👏👏, прокомментируйте ниже ✏️ и поделитесь своим 💙💛, чтобы я мог радовать больше людей новыми статьями в будущем 🙂🤞.