Блог им. Quantrum

Индикатор силы тренды TSI на Python

The trend is your friend. Одна из стратегий на рынке — это покупка активов в направлении тренда. Узнать тренд можно множеством способов и каждый имеет свои плюсы и минусы. Самый известный и одновременно рабочий способ определения долгострочного тренда — это 200-дневная скользящая средняя.

Но хочется знать на сколько всё хорошо. Какова вероятность, что мы вскочим в рынок и он не рухнет вместе с нами? Для этой цели мы сегодня исследуем индикатор силы тренда (TSI), найденный мною на просторах интернета.

Для определения основного тренда будем использовать индикатор Rate-of-Change (ROC), показывающий скорость изменения цены. И его сглаженный вариант.

Тренд на рынке по ROC(200)

Индикатор ROC показывает процент изменения текущей цены относительно  прошлого значения. Параметр индикатора — кол-во дней, между которыми сравниваем цены. Формула:

ROC(200)=(\frac{close}{close[-200]}-1)*100

ROC(200) может быть использован, как альтернатива SMA(200) (обычная скользящая средняя), тест которой описан в этой статье. Если ROC(200) выше нуля — тренд бычий, если ниже — медвежий.

Сглаженный ROC(200)

Для удаления резких колебаний мы сгладим исходные значения ROC(200) по следующей формуле:

smooth ROC(200)=\frac{roc[-1]+roc[-2]*2+roc[-3]*2+roc[-4]}{6}

Ниже результат для сравнения:

Индикатор силы тренды TSI на Python
сравнение ROC индикаторов

Сила тренда TSI

Для измерения силы тренда создадим индикатор по шагам:

  1. Получим абсолютные значения изменения цены за короткий период (например, 10 дней).
  2. Получим ATR за короткий период.
  3. Получим историю соотношений изменений цены к ATR.
  4. Дважды сгладим полученные значения на короткий и длинный (например, 50 дней) периоды.

Наиболее сильный тренд, это когда изменение цены больше значения ATR за один и тот же период. Убедительное изменение цены при низкой волатильности, по логике, должны привести к успеху. Формула:

ratio=\frac{abs(close-close[-10])}{ATR(10)}

TSI=SMA(SMA(ratio, 10), 50) - 1

Значения TSI всегда положительные. Для наглядности графика мы умножим эти значения на знак положения ROC(200):

Индикатор силы тренды TSI на Python

Если приглядеться, то на графике видно, что периоды сильного роста сопровождаются значением TSI более 0.5 (пунктирная линия). Но так ли это на самом деле?

Немножко анализа

Попробуем быстренько посмотреть, какое значение TSI для QQQ является наиболее удачным исторически. Да и вообще, есть ли такое значение? Для этого проверим TSI выше определённого значения и соберём некоторые показатели. Таблица:

Индикатор силы тренды TSI на Python

  • TSI — значение силы тренда.
  • Growth Days — количество растущих дней в выборке.
  • Total Trend — количество дней с силой тренда выше выбранного значения.
  • Ratio — отношение растущих дней к продолжительности тренда.
  • Tradable — процент дней удержания позиций ко всей истории.
  • TSI Change — сумма абсолютных изменений цены за время сильного тренда.
  • ROC/s.ROC(200) Change - сумма абсолютных изменений цены за бычий тренд по обоим ROC(200).
  • Total Change - сумма абсолютных изменений цены за всё время.

Таблица наглядно показала, что со сглаженным значением s.ROC(200) мы промахнулись. Итог хуже простого удержания.

А вот сам по себе ROC(200) показывает лучшие результаты, хоть и хуже SMA(200). Значение Ratio находящееся чуть выше 50% говорит о слабом преимуществе.

Ниже графики зависимости некоторых показателей от TSI:

Индикатор силы тренды TSI на Python

На графиках видно, что обогнать ROC(200) сам по себе мы не сумели, но сохранили доходность сократив время удержания. Так для TSI>=0.4 мы можем находиться в рынке 58% времени и получить доходность всего на ~5% ниже ROC. Гипотетически.

Вывод

Это поверхностный анализ и результаты стоит проверить в торговых стратегиях, чем мы и займёмся на следующей неделе. Сделаем тест ROC(200) против «купи и держи».

В комментариях пишите, ваши вопросы по индикатору и наблюдениям. Запрашивайте код. Также можете написать ваши соображения, почему всё получилось именно так.

Александр Румянцев
Автор на Quantrum.me
Telegram-канал: @quantiki

Интересуетесь алготрейдингом на Python? Присоединяйтесь к команде.

★16
6 комментариев
Да не работает вся эта подобная математика на рынке
avatar
Имхо, ROC с большим периодом не пригоден для определения тренда, потому что сравнивает текущую ситуацию с ситуацией, которая была n свечей назад — но за эти n свечей ситуация могла уже несколько раз измениться кардинальным образом.
Попробую объяснить нагляднее. Допустим, мы применяем к акции 200-дневный ROC — и в данный момент он выше ноля — то есть показывает, что сейчас акция выше, чем она была 200 дней назад — но мы смотрим на график и видим, что за эти 200 дней цена акции сначала упала на 50 порцентов, а потом выросла на 120 процентов — то есть состоялись два тренда, оба из которых мы пропустили — более того, основываясь на показаниях индикатора мы зашли во второй супермощный тренд скорее всего уже в самом его завершении. 
Если использовать ROC для определения тренда, то лучше брать очень маленькие параметры, а потом усреднять их скользящими средними для нахождения более долгосрочных трендом. То есть брать, например, ROC с периодом 1 (приращения соседних значений цены), а потом на основе значений ROC(1) строить скользящую среднюю с периодом 200, чтобы получить 200-дневный тренд.
avatar
/Ну как бы/, я находил несколько статей, решил покрутить. Благодарю за развёрнутый ответ и интересную мысль. 
Александр Румянцев, эту идею Вы здесь реализовали?
smart-lab.ru/blog/485446.php
avatar
PALINDROM, да, верно
Ну как бы, Ваше мнение?
smart-lab.ru/blog/507877.php
avatar

теги блога Александр Румянцев

....все тэги



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