Блог им. Quantrum

Простая стратегия с фундаменталом для 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

★3
16 комментариев
Моментум на коротком периоде (20-30 дней) имеет высокую вероятность разворота. Период надо брать от 3 мес и выше.
avatar
Anton Shabunin, благодарю. А не будет поздно в такие моменты как в 15 и 18 гг?
Александр Румянцев, моментум-акции обычно уходят первыми, на хорошем рынке их много, на боковом рынке мало. Можно как-то автоматизировать детекцию через широту, отслеживать отношение N/(N+M), где
N — количество акций с высокой положительной инерцией
M — количество акций с выскокой отрицательной инерцией

avatar
Anton Shabunin, любопытно, спасибо.
Добавить квартальную прибыль ГГ
Нэш Ван Дрейк (Кот Скрипаля), но если началась коррекция на рынке, то прибыль от просадок не спасёт?
Интересно, спасибо.
avatar
Прям как будто попал на хабр, а не на смартик… ) Портфельные просадки в реальной жизни хеджируются, а не выпиливаются оптимизационными оверкилами. Модель хеджирования может быть универсальной, применимой к любому «кипишу». Оптимизация нет. Не может. Копать туда.
avatar
facevalue, направьте с хэджированием. Чтобы вы предпочли, VIX, шорт SPY, инверсные на рынок, лонг по облигациям? Или в другую сторону копать? Как отслеживаете, что пора хэджироваться?
Александр Румянцев, Печатал кучу букв, но Тимофей так и не исправил багу с пропадающим текстом. Отвечу завтра.
avatar
facevalue, благодарю, буду ждать. 
facevalue, прошу вас найти минутку и изложить ваши рекомендации по хэджированию. Заранее благодарю.

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

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

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

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

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

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

avatar
facevalue, благодарю. 

теги блога Александр Румянцев

....все тэги



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