Как вы знаете (сильно упрощая), искусство управляющих фондами и портфелями состоит в подборе состава портфеля для достижения заданного соотношения риска и доходности, согласно современной портфельной теории Марковица. В портфель набираются различные инструменты с разными весами для снижения рисков и увеличения возврата (в целом).
И в зависимости от стратегии, портфель ребалансируется с частотой раз в год/квартал/месяц…
Суть ребалансировки — подборка весов портфеля методом решения задачи оптимизации с помощью функций квадратичного программирования, или поиск весов между активами, которые в результате отвечали бы:
Полностью приводить теорию не имеет смысла, она доступна для желающих в интернете. Особенно рекомендую понять тему эффективной границы. Это суть портфельной теории.
В общем, математика в этой теории проще, чем с нейронными сетями :)
Попробуем поиграть на этом поле. Цель – побить индекс MIX.
! Здесь важное дополнение (спасибо Redline!): при наборе в портфель инструментов, необходимо, чтобы стоимость шага цены у них была одинакова. Либо корректировать цены перед подачей в процедуру ребалансировки.
И самое главное: будем использовать инструменты, которые вполне реально перенести на промышленную среду. То есть ответим себе на вопрос: могут ли услуги управляющих быть заменены алгоритмами :) «малой кровью».
Дисклеймер делать не буду, потому что этот алгоритм вполне заслуживает шанс на боевую среду, естественно, с кучей специфических доработок по оптимизации точек входа, минимизации проскальзывания, защитных выключателей и т.д.
Вводные:
Итак, начинаем:
Первый кусок кода с импортом библиотек и определением начальных переменных:
Из интересного в этом куске только использование библиотеки pypfopt, в которой как раз и реализованы методы квадратичного программирования в рамках решения задач оптимизации. Поскольку я хочу показать пример, реализуемый для дальнейшего запуска в живую, я взял эту библиотеку, потому что существует ее версия под C++, что дает возможность переноса алгоритма на боевую платформу и запуска например под Quik. Ну или будем ждать, когда российские брокеры дадут бесплатные API (программные интерфейсы), позволившие писать боевой робот на python. Кстати, в этом направлении есть наработки среди российских энтузиастов, возможно, мы дождемся выхода продукта, с которым можно было бы запартнериться :) для синергии.
Но продолжим:
Здесь, уж простите, я скрою набор торгуемых тикеров, работа по подбору набора все еще продолжается. Но суть подхода в том, чтобы инструменты диверсифицировали друг друга, или, по-другому, среди набора инструментов всегда существовали линейные комбинации с обратной корреляцией. Это дает возможность при ребалансировке снизить просадки и увеличить доходность.
Тянем котировки из открытых источников одной строчкой, чтоб не путаться в куче файлов csv.

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

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

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

Просим алгоритм в конце вывести интересующую нас статистику (доходность, максимальную просадку, доходность бенчмарка (по стратегии buy&hold), коэффициент Шарпа). И вывести пару графиков с линией баланса, и график цены бенчмарка.

Теперь само сердце: алгоритм.

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

К сожалению, цифра доходности бенчмарка не вывелась (нюанс стандартной библиотеки Zipline, не рассчитанной на минутки), буду разбираться…
График алгоритма «по ровности» лучше графика бенчмарка, просадки 4,5%, коэффициент Шарпа 2.3. Однако доходность всего 19.55% за год. Вроде ничего особенного.
Но есть нюанс: поскольку мы торгуем фьючерсами, то не учтено кредитование за счет ГО.
Прикинем доходность, взяв за уровень ГО 20% о цены, что позволяет нам в соответствующее число раз уменьшить депозит для работы тем же числом акций.

Итак, годовая доходность портфеля 97%. Просадки относительно уменьшенного депозита тоже вырастут до примерно 20%, однако график баланса не поменяет наклона и коэффициент Шарпа все равно остается приличным.
В данном случае, для перехода к боевому роботу, остается сделать всего пару вещей:
Кажется, что алгоритмический трейдер вполне может заменить алгоритмом услуги некоторых управляющих. А частота ребалансировки портфеля фактически снимает необходимость анализировать фундаментальные данные (кроме начального момента подбора инструментов в портфель).
Что думаете?
65% в долларах с начала года. Все деньги остаются клиенту.
Мест правда почти нет.
Не скрывается ли здесь где-то ошибка?
Рыбак рыбака видит издалека! )
Далеко пойдёшь.
Самое главное то у тебя есть...
Не знаю как назвать. :-\
Пусть будет «Синтезиз». «Синтетика».
По аналогии с «Аналитикой».
Аналитика — это разбирать на составные части.
«Ломать не строить»©! ))
Это как человека разобрать на органы. И долго удивляться что в сумме они не дают того же результата. Наверное результат в “душе”.
И вообще собрать уже не получится!
А синтетика/синтезиз — это обратная операция.
Умение посторить. Творить.
Соединять разрозненные вещи в разных местах. И вообще находить “родственные вещи”, кстати. «Потерянных родственников». Как в индийских фильмах. ))
И вообще какая-то самостоятельность.
Независимость.
Автономность.
Целостность. :-O
Ну вобщем, всё это в тебе я совершенно определённо чувствую.
Но не могу сказать, что ты прям одинок на этом форуме.
Знаю ещё ряд людей.
Ну, человек 5 точно!
(А строго говоря даже больше. Это узкий круг, которые среди прочих, ещё “дополнительно” выделяются.)
На первый взгляд. Субъективно конечно!
Показалось что ты в первых рядах.
Первое-второе место.
Теперь пытаюсь понять почему я вообще так решил!
Пока пытаюсь понять что я понял!