Данный алгоритм появился из стороннего примера, найденного на Quantopian. Я его оптимизировал и сопроводил обильными комментариями на русском. Это не лучшее использование воронок (Pipeline). Но зато использует произвольные факторы (CustomFactor).
Всё это появилось по просьбе автора MindSpace.ru, Оксаны Гафаити. Поехали!
Торгуем 2000-ми акций с наибольшей капитализацией. В основе три фундаментальных показателя:
Все акции упорядочиваем по значениям показателей в зависимости от наших потребностей и получаем три рейтинга. Для каждой акции рассчитываем конечный рейтинг по формуле:
В портфель попадут ТОП 20 акций с положительным моментумом за последние 30 дней.
Создать свой фактор легко. В списке 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%. Она не позволяет использовать его для торговли.
Идеи улучшения:
В комментариях задавайте вопросы и напишите, как можно уменьшить просадку. А можете разнести эту статью в пух и прах!
Александр Румянцев
Автор Quantrum.me
Telegram-канал: @quantiki
N — количество акций с высокой положительной инерцией
M — количество акций с выскокой отрицательной инерцией
1. При падении портфеля ниже ватерлинии продавался(ись) DIA, QQQ или SPY. При приближении к возврату закрывался(ись)
2. VIX точно нет. Если нельзя шортить, как было с пенсионным портфелем, то для этого есть инверсные ETF, покупали их. Отличие от викса в том, что инверсные ИТФ-ки все таки зеркально отображают рынок. ВИКС это торговля волалильностью, что не совсем подходит под идею покрытия рисков. ВИКС надо брать если есть оправданные ожидания высокой волатильности. Тогда это защищает портфель от большой амплитуды изменения стоимости. Даже если он плюсовой, портфель.
3. Прыжок в облигации это тот же выход в кеш, который запрещен ряду фондов, включая пенсионные. Поэтому чаще инвесторы выходят в кеш типа йены, а не в облиги. В облиги также выходят тяжелые деньги, когда надо разместить прямо сейчас по рынку 100 млн или 200 млн долларов. В фьючи и даже спот такое не всунуть. В облиги запросто. Но я так понимаю задача с таким размещением пока не стоит.
Поведу итог: мы использовали SPY/DIA/QQQ, и в пенсионке — SPXS, SDOW, QID. Выход в валюту рассчитывался, но никогда (почему-то) не применялся, облигации не трогали потому что тяжелыми деньгами не управляли. ETF-ы смотреть здесь.
Александр Румянцев, Плять, ну опять… Тимофей жалуется на низкие доходы, а исправить столетнюю багу не может. (((
Короче, псевдокод: (initial_SPYCost — current_SPYCost).ToPercent — (initial_PortfolioCost — current_PortfolioCost). Если спай падает ниже уровня, который был в момент точки входа И портфель положительный — продаем спай. Выход — спай выше точки входа на 0,01%.
Если спай ниже, а портфель в плюсе — ничего не делаем, пересиживаем спай ИЛИ кроем портфель ЕСЛИ {куча условий}