grepan
grepan личный блог
23 июня 2021, 20:43

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

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

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

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

  • системе уравнений (например, сумма всех весов инструментов в портфеле равна 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).

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

Что думаете?

16 Комментариев
  • $even_17 (PhD)
    23 июня 2021, 21:39
    Вот руками. Автоследование бесплатно.
    65% в долларах с начала года. Все деньги остаются клиенту.
    Мест правда почти нет.




  • Redline
    23 июня 2021, 22:24
    Судя по тексту бенчем выступает фьюч на РТС. Он же у вас первым элементом в массиве тикеров, как я понимаю. Но он валютный, а остальные выбранные вами, возможно, не все валютные(список вы спрятали). Получается что торговый баланс у вас в рублях, часть сделок вероятно тоже, а как минимум один тикер, в пунктах.
    Не скрывается ли здесь где-то ошибка?
      • Redline
        24 июня 2021, 11:15
        grepan,
        при всем уважении, но не вижу связи между размером го и ценой в пунктах. У вас суммарный зелёный график содержит суммы прибылей и убытков, выраженных в разных единицах. Это некорректный тест. Думаю что и доходность, и просадка, и форма эквити, и Шарп после корректировки изменится.

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

        Можете показать картинку без РТС?
          • Redline
            24 июня 2021, 15:41
            grepan,
            Мне сложно сказать...

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

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


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

    Работать будем с минутными данными
  • Борян Буффетoff
    24 июня 2021, 02:48


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

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


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

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

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


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

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

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

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


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

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


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

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


    Пока пытаюсь понять что я понял! 

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

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