Боремся со сплитом акций на графиках

Очевидно, что решение о сплите акций это изменение масштаба и ГЭП на графике. Десятилетие цена была 1000, а стала 100. Сплит 1 к 10. Для визуализации это печально... исправляем!

Выглядит некрасиво

Например, так:

Боремся со сплитом акций на графиках

А в некоторых инструментах визуализации актив уйдет в яркую красную зону, которой по факту нет.

Боремся со сплитом акций на графиках

Что это значит для прогнозиста?

Всё сломалось. Любая модель посчитает, что это резкий обвал и помашет ручкой или пошлёт подальше при построении прогноза.

Конечно, так нельзя и нужно исправлять ситуацию.

Очевидных вариантов два: приводим данные до сплита в формату - делим цену акции на коэффициент сплита, либо все новые данные восстанавливаем в формат "до".

Логичным кажется первый вариант - где-то это будет сложнее, где-то нет.

Исправляем

На примере одного из активов попробуем исправить ситуацию. Сначала посмотрим в исходные данные набора (считаем, что он уже загружен)

tail(m750,15) # A tibble: 15 × 3 id date value <chr> <date> <dbl> 1 TICKER 2026-04-08 3198. 2 TICKER 2026-04-09 3185 3 TICKER 2026-04-10 320. 4 TICKER 2026-04-11 321.

Видим, что 10 апреля был сплит 1:10

Всё что нужно - взять все нужные цены (ЗАКР, ОТКР, НИЗ, ВЕРХ) и поделить на 10.

При сплите акций 1:10 количество акций увеличивается в 10 раз, а их цена пропорционально падает в 10 раз. Чтобы на графике и при анализе не возникло огромного искусственного «гэпа» (ценового разрыва), все исторические цены до даты сплита нужно разделить на 10, а объемы — умножить на 10.

Объем сейчас мало интересует, поскольку для анализируемого актива коэффициент корреляции 0.1226

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

Было:

mutate( value = na.approx(Close, na.rm = FALSE), volume = na.approx(Volume, na.rm = FALSE))

Чтобы не изобретать велосипеды (например, через банальный IF) при использовании библиотеки dplyr (цепочки %>%) будем применять аналог lapply - across().

Стало:

mutate( # Применяем деление на 10 ко всем ценовым колонкам сразу value = across(Close, ~ if_else(Date <= as.Date("2026-04-09"), .x / 10, .x)), # Объемы обрабатываем отдельно, так как их нужно умножать Volume = if_else(Date <= as.Date("2026-04-09"), Volume * 10, Volume), id = "TICKER"

Смотрим результат:

> m750 # A tibble: 1,616 × 3 id date value$Close <chr> <date> <dbl> 1 TICKER 2020-02-03 154. 2 TICKER 2020-02-04 159. 3 TICKER 2020-02-05 164. 4 TICKER 2020-02-06 165. 5 TICKER 2020-02-07 166. 6 TICKER 2020-02-10 167.

Визуализируем

Строим график и сравниваем.

До преобразования:

Боремся со сплитом акций на графиках

После преобразования:

Боремся со сплитом акций на графиках

Результат очень радует. Теперь видны уже другие моменты и их можно анализировать, применять в торговых стратегиях. Я вижу что есть некий коридор, который сжимается. Как правило это сигналы на пробой ценового диапазона.

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

Прогноз

Глобально
Глобально
Локально
Локально

Судя по всему - возможна небольшая коррекция, но общее направление - слабый неспешный рост.

Хотите знать больше?

Подписывайтесь на мой канал в Teletype, Telegram и МАХ

ВАЖНО! Не является инвестиционной или финансовой рекомендацией. Все описанное - только отражение личного опыта автора и его размышления. Я никого не убеждаю и не побуждаю к действиям. Любые инвестиции это только Ваш выбор.

@drunkenpin
1 комментарий