Оптимизация размера блока графика Renko

Использование диаграмм Ренко позволяет фильтровать шум на графике цены, при этом он не учитывает время и объем. График сильно зависит от величины блока, который будет использован при построении.

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

Перевод статьи Renko brick size optimization.

Привет всем!

Я провожу исследования временных финансовых рядов в Quantroom. Где мы с коллегами работаем над задачами алгоритмических стратегий на фондовом и крипто рынках. Сегодня я расскажу о том, как уменьшить шум в финансовых рядах, используя диаграмму Ренко. Цель статьи — ответить на вопрос: «Есть ли подход, который лучше известных позволяет определить оптимальный размер блока?».

Что такое диаграмма Ренко?

Диаграмма Ренко — это такой тип диаграммы, который отображает только движения цены, исключая время и объем торгов. Ренко не показывает движение цены в единицу времени. Перед тем как ее строить, Вы должны ответить на следующие вопросы:

  • Каким должен быть размер блока на диаграмме, который представляет собой величину изменения цены? Если размер блока мал, диаграмма имеет больше движений, вместе с этим больше шума (примечание переводчика — brick — дословно переводится как «кирпич», однако здесь используется более релевантное слово — «блок») .
  • Какой параметр цены будет использован для построения диаграммы (например, Open, Close и т.д.)? Также необходимо выбрать таймфрейм, это могут быть дни, часы, минуты или тики. Тиковые данные более точны, потому что содержат все ценовые колебания.
Графики диаграммы Ренко, построенные на разных размерах блока

Основные принципы построения диаграммы Ренко:

  • Новый блок строится только в том случае, если движение цены превысило заданный пороговый уровень.
  • Размер блока всегда один и тот же. Например, если блок равен 10 пунктам, а цена увеличилась на 20, тогда будет нарисовано 2 блока. Если цена выросла, блок будет зелёным (светлым), если цена уменьшилась — красным (тёмным).
  • Следующее значение выбранного варианта цены сравнивается с максимумом или минимумом предыдущего блока. Новый блок всегда отображается справа от предыдущего.
  • Если цена превысила максимум предыдущего блока на установленный размер или больше, рисуется соответствующее количество зелёных (светлых) блоков так, чтобы нижняя граница нового блока соответствовала верхней границе предыдущего.
  • Если цена снизилась ниже минимума предыдущего блока на установленный размер или еще ниже, рисуется соответствующее количество красных (тёмных) блоков так, чтобы верхняя граница нового блока соответствовала нижней границе предыдущего.

В этой статье вы найдете введение в диаграммы Ренко.

Анализ будет проводиться с использованием моего собственного модуля pyrenko, доступного на GitHub.

Существующие подходы к определению размера блока

  1. Традиционный. Используется фиксированное значение для размера блока.
  2. ATR. Используются значения, генерируемые индикатором Average True Range (ATR). ATR используется для измерения волатильности финансового инструмента. Метод ATR «автоматически» определяет оптимальный размер блока. Он вычисляет значение ATR на обычном графике, а затем присваивает это значение размеру блока.

Первое значение ATR рассчитывается по среднеарифметической формуле:

Оценка качества и score function

Было бы неплохо измерить качество графика Ренко. Давайте представим простую стратегию, которая использует эти правила следования тренду: ваша позиция должна быть Long, когда текущий блок зеленый (светлый). Переход в Short позицию осуществляется, когда меняется цвет очередного блока. Используя эту логику, мы имеем следующие параметры:

  • balance — это сумма положительных и отрицательных сделок. Если текущий блок имеет то же направление, что и предыдущий, значение balance увеличивается на +1. Если направление было изменено, значение баланса уменьшается на -2. Положительное значение balance — хорошо. Чем больше значение, тем лучше.
  • sign_changes — здесь учитываем количество изменений направления тренда. Чем меньше это значение, тем лучше.
  • price_ratio — соотношение количества исходных ценовых баров к количеству блоков Ренко. Значение, превышающее 1, является хорошим. Чем больше значение, тем лучше.

Score function  пытается интегрировать эти параметры в одно значение. Положительное значение — хорошо. Чем больше значение, тем лучше.

Если sign_changes равно 0, перед вычислением, ему надо присвоить значение 1.
Попробуем имитировать и визуализировать эту функцию оценки в трехмерном пространстве. Размер сферы соответствует значению оценки. Красные сферы имеют показатель равный -1.

Импортируем модули и пакеты:

[code python]

[/code]

Генерируем, вычисляем и визуализируем результат score function:

[code python]

[/code]

Полученные значения умножаются на константы, чтобы получить более выраженный размер сфер.

score function, визуализированая в 3D

Основная идея этого исследования — проверить гипотезу о том, что мы, используя оптимизацию score function, можем получить размер блока лучший, чем дают существующий подход ATR. Данный результат будет проверен по значимости статистическими методами.

Эксперимент

Эксперимент состоит из трех частей:

Этапы эксперимента

Подготовка данных (Data preparation)

  • Получение списка акций (индекс S&P500) из Википедии.
  • Получение цен (High, Low, Close) каждого дня за последние 3 года.
  • Удаление активов, у которых есть пропуски в данных.

Код подготовки:

[code python]

[/code]

В результате собрано 470 акций.

Оптимизация размера блока и оценка диаграммы Ренко (Brick size optimization and Renko chart evaluation)

Эта часть отвечает за оценку диаграммы Ренко. Оптимальный размер блока определяется на проверках, которые содержат 70% дней. score function выполняется на остальных 30% дней.

Разделение истории проверок

Обе операции (оптимизация и оценка) выполняются для двух подходов (оптимизация ATR и оптимизации score function).

В случае ATR, его последнее значение считается оптимальным размером блока.

В случае оптимизации score function оптимальный размер блока дает максимальное значение этой функции.

График оценки brick_size

В этом подходе используется минимизация одномерной функции, основанной на методе Брента. Score function должна использоваться со знаком минус, потому что это обратная задача.
Этот код содержит функцию, которая должна быть оптимизирована, а также  процесс подсчета / оптимизации:
[code python]

[/code]

Метод Брента — это алгоритм корневого поиска, объединяющий метод деления пополам, секущий метод и обратную квадратичную интерполяцию. Он обладает надежностью деления пополам, при этом он может быть столь же быстрым, как некоторые из менее надежных методов. Алгоритм, по возможности, пробует использовать потенциально быстрый конвергентный секущий метод или обратную квадратичную интерполяцию, но при необходимости он возвращается к более надежному методу деления пополам. Граничными точками могут быть заданы максимумы и минимумы ATR для набора проверок. Это хорошо в качестве начального приближения. Подробнее о методе Брента можно прочесть здесь.

Визуализация метода Брента

 

Алгоритм метода Брента

Давайте получим список активов по значению score для двух подходов. Значения баллов рассчитываются на тестовом прогоне.

Теперь нарисуем диаграммы Ренко тех акций, которые имеют лучшие результаты ($AVY для ATR, $AFL для оптимизации score function).

Ренко для лучших активов

Блок кода для визуализации результата:

[code python]

[/code]

Анализ результатов (Analysis of result)

График рассеивания демонстрирует, как price_ratio соответствует balance:

[code python]

[/code]

Визуализация соответствия price_ratio к balance

Мы можем сделать вывод, что метод оптимизации score function сжимает данные лучше, потому что price_ratio имеет тенденцию к увеличению.
Нарисуем гистограмму, показывающую, количество положительных / нейтральных / отрицательных результатов акций на тестовом наборе:

  • положительный: оценка> 0;
  • нейтральный: оценка = 0;
  • отрицательный: оценка <0.

Код, который подсчитывает и визуализирует результат:

[code python]

[/code]

Гистограмма распределения результатов для двух подходов

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

[code python]

[/code]

Гистограмма подсчета двух подходов
Гистограмма разницы подсчетов

Будет полезно оценить доверительный интервал разницы в баллах. Это позволит понять, какой подход в среднем дает лучший результат.
Проверим нулевую гипотезу о том, что выборка получена из нормального распределения. Значение p = 1.085e-11, что очень мало. Это означает, что выборка исходит из ненормального распределения:

[code python]

[/code]

Недопустимо вычислять доверительный интервал при ненормальном распределении.

Мы можем использовать bootstrapping, чтобы получить доверительный интервал. Bootstrapping — компьютерный метод для изучения распределения статистики на основе нескольких поколений выборок методом Монте-Карло на основе имеющейся выборки. Позволяет быстро и легко оценивать различные статистические данные (доверительные интервалы, дисперсию, корреляцию и т. д.) для сложных моделей.

Алгоритм bootstrapping

Выборка bootstrapping показана ниже. Она распределяется в соответствии с нормальным распределением, p-значение = 0,9816.

Код реализации bootstrapping’a:

[code python]

[/code]

bootstrape-выборка разницы баллов

Доверительный интервал в 99% равен [0.3717, 0.3964], обе границы строго больше 0. p-значение в t-тесте равно 0,0 (нулевая гипотеза: score_diff = 0.0), мы отклоняем нулевую гипотезу. Эти расчеты подтверждают, что средняя оценка разницы между оптимизацией score function и подходом ATR является более высокой.

Конкретный пример разницы в подходах (акция UNH).

Диаграмма Ренко акции UNH для двух подходов

Заключение

  1. Формализовали score function, которая оценивает качество построенной диаграммы Ренко.
  2. Описали процесс оптимизации баллов.
  3. Предлагаемый подход получил лучшее качество, чем классический ATR. Это преимущество статистически значимо.
  4. pyrenko — это модуль, продемонстрированный в анализе, может быть использован любым исследователем.
  5. Продемонстрирован полный цикл процесса снижения шума с использованием Renko. Код приведен в статье.
  6. Теоретически параметр balance, умноженный на brick_size, можно интерпретировать как прибыль на тестовой выборке. Эта простая стратегия следования за трендом, является хорошей основой для дальнейших исследований. Транзакционные издержки должны быть включены для более точной оценки прибыли (комиссии брокера, спред, проскальзывание и т.д.).
  7. Разработанный подход может использоваться в стратегиях, таких как парный трейдинг, следование за трендом, поддержка и сопротивление и т.д. Очищенный от шума график становится понятным, а трендовые линии более четкими.