Блог им. grepan

Сам себе управляющий?

    • 23 июня 2021, 20:43
    • |
    • grepan
  • Еще

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

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

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

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

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

В общем, математика в этой теории проще, чем с нейронными сетями :)

Попробуем поиграть на этом поле. Цель – побить индекс MIX.
! Здесь важное дополнение (спасибо Redline!): при наборе в портфель инструментов, необходимо, чтобы стоимость шага цены у них была одинакова. Либо корректировать цены перед подачей в процедуру ребалансировки.

И самое главное: будем использовать инструменты, которые вполне реально перенести на промышленную среду. То есть ответим себе на вопрос: могут ли услуги управляющих быть заменены алгоритмами :) «малой кровью».

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

Вводные:

  1. Делать все будем, как и прошлый раз в едином пайплайне,
  2. Работать будем на срочном рынке Московской биржи,
  3. Тестировать стратегию с помощью кастомизированной библиотеки Zipline,
  4. Работать будем с минутными данными,

Итак, начинаем:

Первый кусок кода с импортом библиотек и определением начальных переменных:
Сам себе управляющий?

Из интересного в этом куске только использование библиотеки pypfopt, в которой как раз и реализованы методы квадратичного программирования в рамках решения задач оптимизации. Поскольку я хочу показать пример, реализуемый для дальнейшего запуска в живую, я взял эту библиотеку, потому что существует ее версия под C++, что дает возможность переноса алгоритма на боевую платформу и запуска например под Quik. Ну или будем ждать, когда российские брокеры дадут бесплатные API (программные интерфейсы), позволившие писать боевой робот на python. Кстати, в этом направлении есть наработки среди российских энтузиастов, возможно, мы дождемся выхода продукта, с которым можно было бы запартнериться :) для синергии.

Но продолжим:
Сам себе управляющий?

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

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

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

Задаем начальные значения алгоритма.

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

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

Запускаем алгоритм:
Сам себе управляющий?

Получили результат:
Сам себе управляющий?

К сожалению, цифра доходности бенчмарка не вывелась (нюанс стандартной библиотеки Zipline, не рассчитанной на минутки), буду разбираться…

Посмотрим на графики:
Сам себе управляющий?

График алгоритма «по ровности» лучше графика бенчмарка, просадки 4,5%, коэффициент Шарпа 2.3. Однако доходность всего 19.55% за год. Вроде ничего особенного.

Но есть нюанс: поскольку мы торгуем фьючерсами, то не учтено кредитование за счет ГО.

Прикинем доходность, взяв за уровень ГО 20% о цены, что позволяет нам в соответствующее число раз уменьшить депозит для работы тем же числом акций.
Сам себе управляющий?
Итак, годовая доходность портфеля 97%. Просадки относительно уменьшенного депозита тоже вырастут до примерно 20%, однако график баланса не поменяет наклона и коэффициент Шарпа все равно остается приличным.

В данном случае, для перехода к боевому роботу, остается сделать всего пару вещей:

  • подобрать массив торгуемых инструментов (с помощью подобного бэктестинга)
  • реализовать сам рабочий алгоритм робота (желательно на C++, хотя можно и в Lua с вызовом готовой DLL-библиотеки pypfopt).

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

Что думаете?

★3
16 комментариев
Вот руками. Автоследование бесплатно.
65% в долларах с начала года. Все деньги остаются клиенту.
Мест правда почти нет.




avatar
Seven_17 (USD), очень интересно. Это через IB?
Про автоследование у Вас написано, что уже платно: 
«Плата на год 2021 за технический перенос сделок Автоследования составляет 1% от суммы депозита. Предоплата.»

Но все равно, на картинке очень впечатляющий результат кривой баланса. 
Подскажите, это по системе Шаблон?
avatar
Судя по тексту бенчем выступает фьюч на РТС. Он же у вас первым элементом в массиве тикеров, как я понимаю. Но он валютный, а остальные выбранные вами, возможно, не все валютные(список вы спрятали). Получается что торговый баланс у вас в рублях, часть сделок вероятно тоже, а как минимум один тикер, в пунктах.
Не скрывается ли здесь где-то ошибка?
avatar
Redline, вы наблюдательны), действительно, тикер РТС первый в массиве, и участвует в торгах. Вы правы в том, что все инструмента портфеля должны быть приведены к одной базе котировки.
Фьюч РТС котируется в пунктах (https://www.moex.com/ru/contract.aspx?code=RTS-9.21), но поскольку ГО берется в рублях как ~19% от его цены в пунктах, то можно для простоты принять, что в данном случае пункты РТС равны рублям.
avatar
grepan,
при всем уважении, но не вижу связи между размером го и ценой в пунктах. У вас суммарный зелёный график содержит суммы прибылей и убытков, выраженных в разных единицах. Это некорректный тест. Думаю что и доходность, и просадка, и форма эквити, и Шарп после корректировки изменится.

Если алгоритм и идея робастые, то просто заменив РТС на Микс, мы должны увидеть похожие показатели и форму эквити.
А если нет, то, получается, что вы торгуете не ребалансировку портфеля тикеров, а какую-то особенность ticker[0].

Можете показать картинку без РТС?
avatar
Redline, огромное спасибо! Вы нашли, что я не выравнивал стоимость шага цены для инструментов в портфеле, из-за чего действительно цифры были некорректными. Я взял в качестве бенчмарка MIX (стоимость пункта 1 руб), и проверил остальные инструменты. В целом неплохо, но просадка чуть увеличилась.
Можно сказать, что алгоритм и идея робастые?
avatar
grepan,
Мне сложно сказать...

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

Я так понимаю, что это похожее на это:
www.mql5.com/ru/code/9908


Вы можете сами ответить на свой вопрос через форвард тестирование.
avatar
Redline, вы правы. Все перечисленные способы отличаются только разными ограничениями и целями, подаваемыми на вход в задачу оптимизации, решаемую матричными вычислениями. 
avatar
 … согласно современной портфельной теории Марковица....
… портфель ребалансируется с частотой раз в год/квартал/месяц...

Работать будем с минутными данными
Дядя Ваня СпекулянтЪ, Да, я же в начале писал про то, как обычно работают портфельные управляющие. А сам применил подобный подход уже на минутках, чтобы понять, есть ли в этом смысл. 
avatar


Рыбак рыбака видит издалека! )

Далеко пойдёшь.


Самое главное то у тебя есть...
Не знаю как назвать. :-\
Пусть будет «Синтезиз». «Синтетика».

По аналогии с «Аналитикой».

Аналитика — это разбирать на составные части.
«Ломать не строить»©! ))
Это как человека разобрать на органы. И долго удивляться что в сумме они не дают того же результата. Наверное результат в “душе”.  В чём же ещё??? ;)))
И вообще собрать уже не получится! 


А синтетика/синтезиз — это обратная операция.

Умение посторить. Творить.
Соединять разрозненные вещи в разных местах. И вообще находить “родственные вещи”, кстати. «Потерянных родственников». Как в индийских фильмах. ))

И вообще какая-то самостоятельность.
Независимость.
Автономность.

Целостность. :-O


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

Знаю ещё ряд людей.
Ну, человек 5 точно!
(А строго говоря даже больше. Это узкий круг, которые среди прочих, ещё “дополнительно” выделяются.)


На первый взгляд. Субъективно конечно!
Показалось что ты в первых рядах.
Первое-второе место.

Теперь пытаюсь понять почему я вообще так решил! 


Пока пытаюсь понять что я понял! 
Eugene Logunov, согласен, это был просто перевод термина «Modern portfolio theory (MPT)». Можете подсказать, какие модели пришли на смену MPT? Посмотрю, попробую также промоделировать, выложить сюда результаты.

По поводу price-only стратегий согласен. Это скорее вопрос выбранной стратегии. Но здесь есть закономерность: фундаментальные факторы при влиянии на цену инертны (мое наблюдение), резко влияют только новости, а это другой класс стратегий. Поэтому при ребалансе на мелких таймфреймах подход price-only более прост, доступен и вполне работоспособен. 

Шарп, доходность, волатильность — возможные метрики для целей в задаче оптимизации. Из всех допустимых целей/методов я выбрал минимизацию волатильности, потому что это давало наиболее устраивающую меня кривую доходности (гладкая, с минимальными просадками).
avatar
 :)))) попытаюсь понять, что ты понял )))
avatar
Eugene Logunov, Спасибо. Поскольку главной моей задачей было исследовать те инструменты, которые доступны малой кровью для переноса на боевую среду, то я изучу, есть ли готовые реализации этих методов под C++
avatar

теги блога grepan

....все тэги



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