Александр Румянцев
Александр Румянцев личный блог
01 декабря 2018, 21:48

Простая стратегия с фундаменталом для Quantopian

Простая стратегия с фундаменталом для Quantopian
Данный алгоритм появился из стороннего примера, найденного на Quantopian. Я его оптимизировал и сопроводил обильными комментариями на русском. Это не лучшее использование воронок (Pipeline). Но зато использует произвольные факторы (CustomFactor).

Всё это появилось по просьбе автора MindSpace.ru, Оксаны Гафаити. Поехали!

Идея

Торгуем 2000-ми акций с наибольшей капитализацией. В основе три фундаментальных показателя:

  • P/B — цена к балансовой стоимости. Чем меньше, тем лучше. Ценностные акции.
  • P/E — цена к прибыли. Чем меньше, тем лучше. Недооценённые акции.
  • ROA — рентабельность активов. Чем больше, тем лучше.

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

  \[Rank=\frac{RankPB +RankPE +RankROA}{3}\]

В портфель попадут ТОП 20 акций с положительным моментумом за последние 30 дней.

Произвольный фактор (CustomFactor)

Создать свой фактор легко. В списке inputs перечисляем источники данных. А в методе compute() сохраняем рассчитанное значение в аргумент out. Ниже пример расчёта моментума:

class Momentum(CustomFactor):
    """
    Получаем моментум за 30 дней.    
    """    
    # Получаем цены закрытия акций, торгующихся в США за последние 30 дней
    inputs = [USEquityPricing.close] 
    window_length = 30  # количество дней
    
    # Получаем изменение цены за 30 дней
    def compute(self, today, assets, out, close):
        # [:] чтобы записывать во входящий аргумент out и не создавать новую переменную
        out[:] = close[-1] / close[0] - 1
 

Алгоритм

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

Код алгоритма доступен на Quantrum.me.

Заключение

 

Алгоритм показывает хорошие результаты по доходности и опережает рынок в период с 2002 до 2018 гг. Но присутствует очень высокая просадка в -63%. Она не позволяет использовать его для торговли.

Идеи улучшения:

  • Добавить анализ роста волатильности.
  • Добавить фильтр SMA 50 и SMA 200.
  • Добавить фильтр по росту просадок за последний месяц.

В комментариях задавайте вопросы и напишите, как можно уменьшить просадку. А можете разнести эту статью в пух и прах!

Александр Румянцев
Автор Quantrum.me
Telegram-канал: @quantiki

16 Комментариев
  • Anton Shabunin
    02 декабря 2018, 00:52
    Моментум на коротком периоде (20-30 дней) имеет высокую вероятность разворота. Период надо брать от 3 мес и выше.
      • Anton Shabunin
        02 декабря 2018, 14:58
        Александр Румянцев, моментум-акции обычно уходят первыми, на хорошем рынке их много, на боковом рынке мало. Можно как-то автоматизировать детекцию через широту, отслеживать отношение N/(N+M), где
        N — количество акций с высокой положительной инерцией
        M — количество акций с выскокой отрицательной инерцией

  • Добавить квартальную прибыль ГГ
  • Lagamail
    02 декабря 2018, 09:38
    Интересно, спасибо.
  • facevalue
    02 декабря 2018, 10:57
    Прям как будто попал на хабр, а не на смартик… ) Портфельные просадки в реальной жизни хеджируются, а не выпиливаются оптимизационными оверкилами. Модель хеджирования может быть универсальной, применимой к любому «кипишу». Оптимизация нет. Не может. Копать туда.
      • facevalue
        06 декабря 2018, 03:16
        Александр Румянцев, Печатал кучу букв, но Тимофей так и не исправил багу с пропадающим текстом. Отвечу завтра.
          • facevalue
            15 декабря 2018, 19:41
            Александр Румянцев, Да, прошу прощения за опоздание с ответом. Смотрите, я особым профи в этом деле не являюсь, и последний раз хеджированием портфелей занимался в 2013-м году. Вряд ли что-то сильно изменилось, так что опишу идею.

            1. При падении портфеля ниже ватерлинии продавался(ись) DIA, QQQ или SPY. При приближении к возврату закрывался(ись)
            2. VIX точно нет. Если нельзя шортить, как было с пенсионным портфелем, то для этого есть инверсные ETF, покупали их. Отличие от викса в том, что инверсные ИТФ-ки все таки зеркально отображают рынок. ВИКС это торговля волалильностью, что не совсем подходит под идею покрытия рисков. ВИКС надо брать если есть оправданные ожидания высокой волатильности. Тогда это защищает портфель от большой амплитуды изменения стоимости. Даже если он плюсовой, портфель.
            3. Прыжок в облигации это тот же выход в кеш, который запрещен ряду фондов, включая пенсионные. Поэтому чаще инвесторы выходят в кеш типа йены, а не в облиги. В облиги также выходят тяжелые деньги, когда надо разместить прямо сейчас по рынку 100 млн или 200 млн долларов. В фьючи и даже спот такое не всунуть. В облиги запросто. Но я так понимаю задача с таким размещением пока не стоит.

            Поведу итог: мы использовали SPY/DIA/QQQ, и в пенсионке — SPXS, SDOW, QID. Выход в валюту рассчитывался, но никогда (почему-то) не применялся, облигации не трогали потому что тяжелыми деньгами не управляли. ETF-ы смотреть здесь.
              • facevalue
                17 декабря 2018, 01:37

                Александр Румянцев, Плять, ну опять… Тимофей жалуется на низкие доходы, а исправить столетнюю багу не может. (((

                Короче, псевдокод: (initial_SPYCost — current_SPYCost).ToPercent — (initial_PortfolioCost — current_PortfolioCost). Если спай падает ниже уровня, который был в момент точки входа И портфель положительный — продаем спай. Выход — спай выше точки входа на 0,01%.

                Если спай ниже, а портфель в плюсе — ничего не делаем, пересиживаем спай ИЛИ кроем портфель ЕСЛИ {куча условий}

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

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