Блог им. grepan
Как вы знаете (сильно упрощая), искусство управляющих фондами и портфелями состоит в подборе состава портфеля для достижения заданного соотношения риска и доходности, согласно современной портфельной теории Марковица. В портфель набираются различные инструменты с разными весами для снижения рисков и увеличения возврата (в целом).
И в зависимости от стратегии, портфель ребалансируется с частотой раз в год/квартал/месяц…
Суть ребалансировки — подборка весов портфеля методом решения задачи оптимизации с помощью функций квадратичного программирования, или поиск весов между активами, которые в результате отвечали бы:
Полностью приводить теорию не имеет смысла, она доступна для желающих в интернете. Особенно рекомендую понять тему эффективной границы. Это суть портфельной теории.
В общем, математика в этой теории проще, чем с нейронными сетями :)
Попробуем поиграть на этом поле. Цель – побить индекс MIX.
! Здесь важное дополнение (спасибо Redline!): при наборе в портфель инструментов, необходимо, чтобы стоимость шага цены у них была одинакова. Либо корректировать цены перед подачей в процедуру ребалансировки.
И самое главное: будем использовать инструменты, которые вполне реально перенести на промышленную среду. То есть ответим себе на вопрос: могут ли услуги управляющих быть заменены алгоритмами :) «малой кровью».
Дисклеймер делать не буду, потому что этот алгоритм вполне заслуживает шанс на боевую среду, естественно, с кучей специфических доработок по оптимизации точек входа, минимизации проскальзывания, защитных выключателей и т.д.
Вводные:
Итак, начинаем:
Первый кусок кода с импортом библиотек и определением начальных переменных:Из интересного в этом куске только использование библиотеки pypfopt, в которой как раз и реализованы методы квадратичного программирования в рамках решения задач оптимизации. Поскольку я хочу показать пример, реализуемый для дальнейшего запуска в живую, я взял эту библиотеку, потому что существует ее версия под C++, что дает возможность переноса алгоритма на боевую платформу и запуска например под Quik. Ну или будем ждать, когда российские брокеры дадут бесплатные API (программные интерфейсы), позволившие писать боевой робот на python. Кстати, в этом направлении есть наработки среди российских энтузиастов, возможно, мы дождемся выхода продукта, с которым можно было бы запартнериться :) для синергии.
Но продолжим:Здесь, уж простите, я скрою набор торгуемых тикеров, работа по подбору набора все еще продолжается. Но суть подхода в том, чтобы инструменты диверсифицировали друг друга, или, по-другому, среди набора инструментов всегда существовали линейные комбинации с обратной корреляцией. Это дает возможность при ребалансировке снизить просадки и увеличить доходность.
Тянем котировки из открытых источников одной строчкой, чтоб не путаться в куче файлов csv.
Устанавливаем параметры нашего алгоритма. Это начальный торговый баланс, окно истории (используемое для решения задачи оптимизации) и частота ребалансировки (в минутах).
Далее устанавливаем простой вариант эмуляции рыночных ордеров (цена срабатывания ордера равна цене закрытия свечи, на которой принимается решение о торговой позиции)
Задаем начальные значения алгоритма.
Комиссию я на этот раз для простоты взял максимальную по всем торгуемым инструментам. То есть в реальности комиссия должна быть меньше по всем тикерам, кроме самого дорогого.
Просим алгоритм в конце вывести интересующую нас статистику (доходность, максимальную просадку, доходность бенчмарка (по стратегии buy&hold), коэффициент Шарпа). И вывести пару графиков с линией баланса, и график цены бенчмарка.
Теперь само сердце: алгоритм.
Все примитивно: рассчитываем необходимые данные по историческому окну: средние значения возвратов и матрицу ковариации, рассчитываем веса портфеля по принципу минимизации волатильности. Далее в цикле по всем инструментам выставляем ордера для достижения целевых весов.
Получили результат:
К сожалению, цифра доходности бенчмарка не вывелась (нюанс стандартной библиотеки Zipline, не рассчитанной на минутки), буду разбираться…
График алгоритма «по ровности» лучше графика бенчмарка, просадки 4,5%, коэффициент Шарпа 2.3. Однако доходность всего 19.55% за год. Вроде ничего особенного.
Но есть нюанс: поскольку мы торгуем фьючерсами, то не учтено кредитование за счет ГО.
Прикинем доходность, взяв за уровень ГО 20% о цены, что позволяет нам в соответствующее число раз уменьшить депозит для работы тем же числом акций.
Итак, годовая доходность портфеля 97%. Просадки относительно уменьшенного депозита тоже вырастут до примерно 20%, однако график баланса не поменяет наклона и коэффициент Шарпа все равно остается приличным.
В данном случае, для перехода к боевому роботу, остается сделать всего пару вещей:
Кажется, что алгоритмический трейдер вполне может заменить алгоритмом услуги некоторых управляющих. А частота ребалансировки портфеля фактически снимает необходимость анализировать фундаментальные данные (кроме начального момента подбора инструментов в портфель).
Что думаете?
65% в долларах с начала года. Все деньги остаются клиенту.
Мест правда почти нет.
Про автоследование у Вас написано, что уже платно:
«Плата на год 2021 за технический перенос сделок Автоследования составляет 1% от суммы депозита. Предоплата.»
Но все равно, на картинке очень впечатляющий результат кривой баланса.
Подскажите, это по системе Шаблон?
Не скрывается ли здесь где-то ошибка?
Фьюч РТС котируется в пунктах (https://www.moex.com/ru/contract.aspx?code=RTS-9.21), но поскольку ГО берется в рублях как ~19% от его цены в пунктах, то можно для простоты принять, что в данном случае пункты РТС равны рублям.
при всем уважении, но не вижу связи между размером го и ценой в пунктах. У вас суммарный зелёный график содержит суммы прибылей и убытков, выраженных в разных единицах. Это некорректный тест. Думаю что и доходность, и просадка, и форма эквити, и Шарп после корректировки изменится.
Если алгоритм и идея робастые, то просто заменив РТС на Микс, мы должны увидеть похожие показатели и форму эквити.
А если нет, то, получается, что вы торгуете не ребалансировку портфеля тикеров, а какую-то особенность ticker[0].
Можете показать картинку без РТС?
Можно сказать, что алгоритм и идея робастые?
Мне сложно сказать...
По сути, это простая регрессия на скользящем окне. Если бы это всегда и стабильно работало, то все бы этим занимались, потому что идея вроде как на поверхности лежит.
Коэффициенты можно найти разными способами. В вашем случае особенность именно в способе их быстрого поиска через матричные вычисления.
Я так понимаю, что это похожее на это:
www.mql5.com/ru/code/9908
Вы можете сами ответить на свой вопрос через форвард тестирование.
Рыбак рыбака видит издалека! )
Далеко пойдёшь.
Самое главное то у тебя есть...
Не знаю как назвать. :-\
Пусть будет «Синтезиз». «Синтетика».
По аналогии с «Аналитикой».
Аналитика — это разбирать на составные части.
«Ломать не строить»©! ))
Это как человека разобрать на органы. И долго удивляться что в сумме они не дают того же результата. Наверное результат в “душе”. В чём же ещё??? ;)))
И вообще собрать уже не получится!
А синтетика/синтезиз — это обратная операция.
Умение посторить. Творить.
Соединять разрозненные вещи в разных местах. И вообще находить “родственные вещи”, кстати. «Потерянных родственников». Как в индийских фильмах. ))
И вообще какая-то самостоятельность.
Независимость.
Автономность.
Целостность. :-O
Ну вобщем, всё это в тебе я совершенно определённо чувствую.
Но не могу сказать, что ты прям одинок на этом форуме.
Знаю ещё ряд людей.
Ну, человек 5 точно!
(А строго говоря даже больше. Это узкий круг, которые среди прочих, ещё “дополнительно” выделяются.)
На первый взгляд. Субъективно конечно!
Показалось что ты в первых рядах.
Первое-второе место.
Теперь пытаюсь понять почему я вообще так решил!
Пока пытаюсь понять что я понял!
По поводу price-only стратегий согласен. Это скорее вопрос выбранной стратегии. Но здесь есть закономерность: фундаментальные факторы при влиянии на цену инертны (мое наблюдение), резко влияют только новости, а это другой класс стратегий. Поэтому при ребалансе на мелких таймфреймах подход price-only более прост, доступен и вполне работоспособен.
Шарп, доходность, волатильность — возможные метрики для целей в задаче оптимизации. Из всех допустимых целей/методов я выбрал минимизацию волатильности, потому что это давало наиболее устраивающую меня кривую доходности (гладкая, с минимальными просадками).