
Продолжаем цикл «Ребалансинг в алго».
Сегодня первая практическая статья — разбираем робота RebalancerClassicDividend. Это еженедельный ребалансировщик портфеля из дивидендных акций и золота, и сразу с двумя режимами внутри: классическим и дивидендным. Логичный мостик от прошлого цикла: дивиденды здесь работают сигналом, но торгует робот уже не одну бумагу на событие, а весь портфель.
1) Торговая идея
Робот живёт в двух режимах, которые можно включать независимо:
• Дивидендный режим. Если у акций из скринера в ближайшие дни наступает отсечка реестра с доходностью выше порога — весь торговый депозит равномерно входит в эти акции. Дивидендный режим имеет приоритет: пока есть кандидаты, классический молчит.
• Классический режим. Если дивидендных кандидатов нет — робот держит портфель по целевым весам: например 60% в акциях с хорошей дивидендной историей, 40% в золоте. Акции дополнительно фильтруются по SMA.
• Запасной выход — золото. Если в классическом режиме ни одна акция не прошла фильтры, весь торговый депозит уходит в золото. Ребалансировка происходит по расписанию: еженедельно или ежемесячно, в выбранный день недели и время. По умолчанию — вторник, 11:00.
2) Источники робота
• BotTabScreener — скринер по множеству бумаг: робот одновременно следит за всем сетом акций и отбирает из них кандидатов в портфель.
• BotTabSimple — отдельная вкладка под защитный актив. В этом роботе — золото.
• WikiMaster — источник данных о дивидендах: даты отсечек, размеры и доходность выплат. Робот смотрит и в будущее (ближайший дивиденд), и в прошлое (дивидендная история). Работает и в тестере, и в бою.
3) Индикаторы
• SMA — простая скользящая средняя по ценам закрытия. Период по умолчанию 180. Применяется только в классическом режиме и только к акциям.
У фильтра три состояния: Off (выключен), OnBuyUpperSma (брать бумаги выше средней — фильтр силы) и OnBuyBelowSma (брать ниже средней — фильтр отскока). Одна и та же скользящая, два противоположных смысла — выбирайте под свой подход.
4) Логика робота
Сначала в виде картинки:
Наступил день и час ребалансировки. Робот действует по шагам:
Шаг 1. Сначала проверяется дивидендный режим. По каждой бумаге скринера робот запрашивает ближайший дивиденд и берёт бумагу, если:
1) Дата отсечки реестра попадает в окно до следующей ребалансировки: 7 дней при еженедельном режиме; при ежемесячном — до первого целевого дня недели следующего месяца;
2) Дивидендная доходность выплаты не ниже Min dividend yield (по умолчанию 1%).
3) Кандидаты нашлись — весь торговый депозит делится между ними поровну. Золото в этом случае не покупается.
Шаг 2. Дивидендных кандидатов нет — включается классический режим. Бумага попадает в портфель, если:
1) У неё была отсечка реестра за последние 380 дней с доходностью не ниже порога — то есть это бумага с живой дивидендной историей;
2) Цена проходит SMA-фильтр в выбранном режиме.
3) Депозит делится по весам: Stocks weight percent (по умолчанию 60%) — акциям поровну, остаток — золоту. Кандидатов нет совсем — всё в золото.
Шаг 3. Исполнение. И вот здесь главная особенность робота — два способа ребаланса, выбираемые параметром Regime:
• OnTestRebalance — простой: закрыть все позиции в акциях и золоте, затем открыть новые по целевому портфелю. Честно и быстро для тестера и оптимизатора.
• OnRealRebalance — умный: робот строит целевой портфель, закрывает только те позиции, которых в нём нет, открывает недостающие, а по уже существующим — докупает или продаёт разницу через BuyAtMarketToPosition / CloseAtMarket. Минимум сделок, комиссий и лишних налоговых событий.
Обратите внимание на деталь кода. В тестере, если по дивидендной базе кандидатов не нашлось (например, база не закачана или мы слишком глубоко в истории (до 2013 года)), робот не стоит без дела: включается запасной набор SBER, SBERP, GAZP, LKOH, VTBR. Это сделано специально, чтобы классический режим можно было тестировать и без базы дивидендов. В реале этот запасной набор не работает — только честные данные.
Вторая деталь — автообновление базы дивидендов. В боевом режиме утром в день ребалансировки (по умолчанию 8:00) робот проверяет возраст базы Wiki/Dividends и, если она старше 5 дней, запускает обновление в фоне. Пока обновление идёт, ребалансировка откладывается — торговать по устаревшим датам нельзя.
5) Исходный код в проекте
Робот лежит в открытом доступе на ГитХабе:
https://github.com/AlexWan/OsEngine/blob/master/project/OsEngine/Robots/Rebalancers/RebalancerClassicDividend.cs
6) Настройки робота
Параметры разбиты на четыре вкладки. Разбираем по порядку.
Вкладка Base:
• Regime — режим работы: Off / OnTestRebalance / OnRealRebalance. Для тестера и оптимизатора — OnTestRebalance, для боя — OnRealRebalance.
• Trade deposit percent — какая доля портфеля участвует в торговле. По умолчанию 50%.
• Rebalance period — период: Weekly или Monthly.
• Rebalance day of week — день недели ребалансировки: Monday / Tuesday / Wednesday. По умолчанию вторник.
• Rebalance time — время ребалансировки. По умолчанию 11:00.
• Detailed logging enabled — подробный лог по кандидатам и суммам. Включайте при отладке.
• Rebalance NOW — кнопка немедленной ребалансировки вне расписания.
Вкладка Classic:
• Classic mode enabled — включить классический режим.
• Stocks weight percent — целевой вес акций. По умолчанию 60%, остальное — золото.
• SMA filter mode — режим фильтра: Off / OnBuyUpperSma / OnBuyBelowSma.
• SMA period — период средней. По умолчанию 180.
Вкладка Dividend:
• Dividend mode enabled — включить дивидендный режим.
• Min dividend yield percent — минимальная дивидендная доходность. По умолчанию 1%.
Вкладка Update:
• Auto update dividends — автообновление базы дивидендов в боевом режиме. По умолчанию On.
• Dividends update check time — время проверки базы в день ребалансировки. По умолчанию 8:00.
• Start update dividends — кнопка ручного запуска обновления.
7) Запуск робота в тестере
Создайте сет из ликвидных дивидендных акций MOEX — Сбербанк, Газпром, Лукойл и другие бумаги с регулярными выплатами.
Добавьте вторую вкладку с золотом — именно через неё робот получает и данные портфеля.
Таймфрейм — 30 минут. Меньше не надо: робот смотрит расписание по закрытию свечи, а SMA(180) на получасовках — это почти две недели торгов, вполне рыночный горизонт.
Включите выплату дивидендов в тестере через эмулятор биржи.
Запустите тест на нескольких годах истории, чтобы захватить и дивидендные сезоны (весна-лето), и «пустые» месяцы, когда робот уходит в классический режим и золото.
8) Один из вариантов тестирования
Штатные настройки робота, ТОП-30 дивидендных акций MOEX + золото, тест за 10 лет, режим OnTestRebalance:
Следующая статья — RebalancerByDividendQuality: самый простой ребалансер цикла. Либо неделя дивидендов, либо неделя в LQDT. Подписывайтесь чтобы не пропустить.
Удачных алгоритмов!
https://smart-lab.ru/company/os_engine/blog/1024149.php
Скачать OsEngine: https://github.com/AlexWan/OsEngine
Официальная поддержка OsEngine в MAX: https://max
Канал Научный трейдинг в MAX: https://max.ru/
Поддержка OsEngine в Телеграм: https://t.me/osengine_official_support
Канал Научный трейдинг (Bad Quant) в Телеграм: https://t.me/bad_quant