Блог им. YuriyVorobev

Сколько акций держать в портфеле и как часто ребалансировать? Тестирую на 5 годах данных MOEX

Привет, SmartLab. Я строю онлайн-сервис для анализа акций Мосбиржи, как инструмент принятия решений и системного инвестирования.
Вот здесь я рассказывал, как начинал с гугл-таблицы, а тут – какие поймал ограничения и как переписал все на Python+Flask.

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

Что тестировал

Модель выдаёт итоговый score для каждой акции. Берём ТОП-N акций по скору, держим Hz дней (Horizont), ребалансируем, повторяем.

Полный перебор: N = {5, 10, 15, 20, 25, 30} × Hz = {20, 30, 40, 60, 90} = 30 сочетаний.

Период: 2021–2026 (62 тридцатидневных периода).

Что учтено:

  • Комиссия 0.03% (тариф популярного брокера) на каждую сделку

  • Slippage 0.1% (проскальзывание при исполнении)

  • Фильтр ликвидности ≥ 2 млн руб/день (об этом ниже – отдельная история)


Матрица альфы (% сверх рынка за весь период)

N \ Hz

20d

30d

40d

60d

90d

5

−36.6

+6.8

−59.8

+29.4

+12.0

10

−0.4

+43.8

−24.0

+23.2

+11.9

15

+16.4

+82.5

−9.9

+48.0

+15.7

20

+25.0

+39.0

+5.4

+30.1

+35.0

25

+22.6

+31.8

+3.0

+31.0

+31.6

30

+21.8

+37.1

+0.7

+26.2

+34.1


Для проверки прогнал тот же N=15 на еженедельных данных (323 точки, в 5 раз больше наблюдений):

Hz

Альфа

Hit Rate

20d

+14.1%

48%

30d

+44.0%

58%

40d

−31.6%

40%

60d

+52.9%

52%

90d

+6.7%

48%


Еженедельная матрица подтвердила ежемесячную: 30d — лидер, 40d — провал. Абсолютные цифры альфы ниже (+44% vs +82.5%) — потому что еженедельные точки сглаживают удачные ежемесячные совпадения. Но ранжирование горизонтов — идентичное.

Что бросается в глаза

Горизонт 30 дней – безусловный лидер. При любом N тридцатидневная ребалансировка обыгрывает остальные варианты. Не 20 дней (слишком частая торговля, комиссия съедает), не 60 (модель «протухает»). Ровно 30 календарных дней.

N=15 при 30d – абсолютный максимум. +82.5% альфы, +104.2% абсолютной доходности, hit rate 61% (в 61% периодов портфель обыгрывает рынок). Это не подгонка одного параметра – N=10 и N=20 при том же горизонте тоже в хорошем плюсе.

N=5 – рулетка. Разброс от −59.8% до +29.4%. Концентрированный портфель из 5 бумаг слишком зависит от одного неудачного выбора.

40 дней – аномально плохой горизонт (или мертвая зона рынка?) Первоначально я думал, что провал на 40d это артефакт ежемесячных бэктест-дат. Но еженедельный бэктест на 323 точках подтвердил: 40d это худший горизонт с альфой −31.6% и hit rate 40%. В 2022 году hit rate на 40d = 0% – ни одного периода, когда портфель обыграл рынок.

Почему? 40 дней это промежуток между двумя рабочими режимами. На 20–30 днях ещё работает ценовой momentum (тренд продолжается). На 60+ днях уже проявляется фундаментал (рынок «переваривает» отчётности). А на 40 днях – ни то, ни другое: momentum уже затух, фундаментал ещё не сработал. В этом окне спекулятивные акции обгоняют фундаментально сильные, и модель системно проигрывает.

Это не баг модели – это структурная особенность рынка.

Но есть нюанс

N=15 – лидер на полном периоде 2021–2026. Когда я прогнал тот же тест на подпериоде 2023–2026, лидером стал N=10 (+39.6% альфы vs +21.5% у N=15). Оптимальный N нестабилен – он зависит от рыночного режима.

Пока «идеального N на все времена» найти не удалось. Есть диапазон (10–20 акций), и есть способы адаптации — но это тема для отдельного поста, где я постараюсь разобрать адаптивный режим.


Фильтр ликвидности: +25% альфы одним условием

Это отдельное наблюдение, которое оказалось важнее, чем подбор N.

Изначально модель не фильтровала по ликвидности – в Top-15 попадали в том числе тикеры с минимальными оборотами. Формально они «лучшие по скору», но в реальности:

  • Спред 1–3% (на входе уже потерял)

  • Объём не позволяет набрать позицию

  • Гэпы на новостях съедают стоп-лосс

Я добавил одно условие: средний дневной оборот за 20 дней ≥ 2 млн рублей (рассчитывается как close × volume, исторический, без заглядывания в будущее).

Результат:

 

Без фильтра

С фильтром ≥ 2М

Альфа

+57.1%

+82.5%

Hit rate

47%

61%

Отфильтровано

0

~80 из 212

Плюс 25 процентных пунктов альфы при добавлении единственного условия. Без оптимизации весов, без новых метрик, без машинного обучения.

Почему так сильно? Неликвидные тикеры создавали шум – они попадали в TОП из-за высоких фундаментальных показателей (маленькая компания с хорошей маржой), но их цена двигалась не по фундаменталу, а по случайным сделкам крупных лотов. Модель была «права» по фундаменталу, но рынок не отражал эту правоту.

Чем обоснован порог 2 млн. руб.: на 1 млн результат похуже (+71%), на 5 млн – ещё чуть хуже (+68%, т.к. отсекаются нормальные mid-caps типа BSPB и UPRO). В итоге 2 млн – точка перегиба.

Выводы

  1. 15 акций, ребалансировка раз в месяц – оптимум на данных 2021–2026
  2. Фильтр ликвидности важнее подбора N – одно условие дало больше, чем оптимизация количества позиций
  3. Концентрированные портфели (5 бумаг) опасны – разброс результатов слишком большой
  4. Оптимальный N нестабилен – нужна адаптация, а не хардкод (об этом подробнее в другой статье).


Ссылки:
Модель работает на moexanalyst.ru – 200+ акций, 7 секторов, обновление ежедневно. Бесплатный доступ, без регистрации можно посмотреть 4 тикера в день, чтобы понять нужно ли вам это.

В канале @moexanalyst периодически публикую актуальные обновления, секретные ссылки на модель и протоколы.

В следующий раз расскажу, что модель говорит о работе с шортами.

| ★1
13 комментариев
на дневках тестить нельзя
avatar
ves2010, 
на дневках тестить нельзя
согласный я...
недельки энто нижний предел...
smart-lab.ru/blog/327219.php

avatar
wistopus, вола сипи растет на днях т.к увеличиловь продолжительность торговой сессии 
avatar
ves2010, в контексте моего теста это не принципиально:

— я не анализирую волатильность как таковую;
— и тем более не пытаюсь переносить выводы с американского рынка на MOEX.

У меня задача проще и приземлённее – проверить, как ведёт себя конкретная стратегия отбора и ребалансировки на разных горизонтах. Поэтому мои выводы про поведение стратегии, а не про особенности дневной волатильности

Юрий Воробьев, там не в воле дело… для российского рынка если тестишь на дневках то цена открытия не учитывает утренний гэп а цена закрытия у бумаг разная, т.к троговая сессия имеет разное время окончания…
только 30ти минутки более менее коректны, но т.к приходится выкидывать первый бар то приходится тестить на ти 5минутках вместо дневок
avatar
ves2010, согласен, на MOEX есть нюансы с микроструктурой.

Но у меня в тесте это частично учтено нормализацией первого часа (вход/выход не на сыром open)&
Плюс учитывается проскальзывание (динамическое, с зависимостью от ликвидности бумаги), которое по сути съедает часть этих нюансов.

Я ж не пытаюсь ловить движение внутри дня. У меня в тесте ребаланс от недели до 90 дней. На таком масштабе влияние конкретного открытия или первого бара сильно размазывается.

wistopus, что касается аргумента про «недельки – нижний предел», то он справедлив, если мы:
— анализируем распределения доходностей;
— или строим модели на чистых ретёрнах.

Но у меня модель не на ретёрнах – она ранжирует акции, и я тестирую уже результат ранжирования в портфеле. А это другой слой задачи.

ves2010, спасибо за комментарии, хороший пойнт, но у меня немного другая задача, чем классический анализ волатильности/распределений.
Да, на дневках шумно, согласен.
Но если результат сохраняется на недельках, значит это уже не артефакт шума. А дальше вопрос не в таймфрейме данных, а в том, как ведёт себя сама стратегия
я думал, так все мужчины торгуют — динамическое распределение активов, а «портфельные стратегии»  они на продажу хорошо  работают. в смысле комиссии собирать
avatar
MPlus, если под «динамическим распределением» имеется в виду постоянное перекладывание, то у меня по сути оно и есть, просто с фиксированным шагом (ребаланс).

Цель – не принимать решение руками, а сделать системное ранжирование и обновлть портфель по правилам.
Если стратегия держит альфу после комиссий, значит вопрос не в формате, а в реализации.

Смысл в том, что я строю модель, которую можно использовать как угодно –
хочешь, собирай портфель, хочешь бери отдельные идеи и торгуй «динамически». Тут уже вопрос стиля, а не религии 🙂

Юрий Воробьев, у меня три недели контрольный срок и 12 бумаг = все как вы посчитали. есть еще наблюдение, то что выпало, так и будет лежать, до следующего разгона.
avatar
MPlus, ну классно же, что есть доп подтверждение 

Читайте на SMART-LAB:
Как быстро выставлять заявки во время резкого роста или падения
Чтобы зарабатывать на движении цен, надо уметь быстро реагировать на изменение баланса предложений о покупке и продаже на разных ценовых уровнях. В...
Фото
Нарастили объем запасов ресурсов на "Рябиновом"
Продолжаем пополнять собственную минерально-ресурсную базу.  По производственному комплексу «Рябиновый» в результате разведки флангов...
Фото
Как замена оборудования влияет на безопасность и эффективность
Модернизация техники — постоянный процесс для «Норникеля». Это снижает риски, делает работу стабильнее и помогает точнее управлять производством....
Фото
Что делать с валютой: капитулировать перед высокими ценами на нефть или наращивать позицию?
Здравствуйте! С учетом высокой волатильности на валютном рынке, считаю необходимым актуализировать взгляд на валютную позицию. В сентябре...

теги блога Юрий Воробьев

....все тэги



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