Алгоритм выявления ценовых тенденций

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

Всем понятно, что значения рыночных цен то возрастают, то падают. То есть им присуща некоторая динамика. Да и вообще говоря, любым ВР присуща динамика. Потому они и названы рядами динамики. Если динамики нет, то значения ВР будут следовать друг за другом без изменений, например ВР={1,1,1,1,…,1}. В этом случае ряд статичен. Ну, а когда есть динамика, значит есть и тенденции.

Вот, например, ВР={1,2,3,2,1,2,3} содержит три тенденции. Сначала мы наблюдаем последовательный рост значений от 1 до 3 – это возрастающая тенденция. За тем наблюдаем падающую тенденцию от 3 до 1, и за тем вновь возрастающую от 1 до 3. В данном случае значения 3 и 1 можно назвать точками разворота или поворотными точками, то есть точками, где происходит смена одной тенденции на другую.

Определение поворотных точек не ново. В своей книге «Временные ряды» в 1981 году М. Кэндэл дал определение и формализацию поворотных точек, согласно которому, xi – называется поворотной точкой, если выполняется одно из условий:

xi-1<xi>xi+1 или xi-1>xi<xi+1.   (1)

Тогда любой ВР мы можем представить в виде последовательности поворотных точек, исключив все промежуточные. Если соединить прямыми линиями две соседних поворотных точки — такой ВР будет повторять «форму» исходного ВР! При этом первая поворотная точка будет являться началом тенденции, а другая концом.

Однако на мой взгляд определение (1) не совсем удачно. Скажем есть такой ВР={1,2,3,3,2,1}. Согласно выражению (1) в нем нет ни одной поворотной точки! То есть мы вообще «не увидим» смену тенденции! Но ведь мы наблюдаем смену тенденции в точке со значением 3 (за тем эта точка повторяется и происходит смена тенденции)! Чтобы учесть такие случаи, по началу я предложил обобщить выражение (1) так:

xi-1<=xi=>xi+1 или xi-1=>xi<=xi+1.   (2)

Тогда ВР={1,2,3,3,2,1} будет содержать поворотные точки, и мы сможем тем самым идентифицировать тенденции. Однако поворотных точки, согласно (2), будет уже две и при том одинаковых 3,3! Это одна проблема.

Другая проблема заключается в том, если у нас есть какая-либо одна тенденция, содержащая пару одинаковых значений. Например, ВР={1,2,3,2,4,5,6,7,8}. «Налицо» здесь единственная восходящая тенденция. Однако выражение (2) идентифицирует также две поворотных точки со значениями 3 и 3. Но это ложные поворотные точки!

Правило (1) не идентифицирует поворотные точки, когда это нужно.

Правило (2) идентифицирует всегда, но при этом идентифицирует ещё и ложные поворотные точки.

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

Ни (1), ни (2) выражения не выполняют этого правила. Однако выражение (2) боле перспективно!

Если мы выявим во ВР все поворотные точки по правилу (2), мы можем просмотреть такой ВР на наличие повторяющихся и ложных поворотных точек и удалить лишние.

Для этого нужно выполнить две процедуры последовательно:

  • Из последовательности повторяющихся значений поворотных точек нам следует оставить только одно значение – остальные удалить.
  • Если поворотная точка yi такова, что yi-1<yi<yi+1 или yi-1>yi>yi+1 – это ложная поворотная точка и её следует удалить.

Именно так я и делал в своих первых экспериментах. Однако за тем придумал более простой и эффективный алгоритм. Я назвал его алгоритм выявления ценовых тенденций.

Он состоит из следующих этапов:

  1. Проводим конвертацию исходного ВР методом разностей первого порядка.
  2. Производим последовательное суммирование значений сконвертированного ВР. Если текущая сумма имеет противоположный знак в сравнении с очередным значением, то мы считаем, что предыдущая тенденция окончилась и начинаем накапливать новую сумму значений для новой тенденции (противоположной). Если встречен 0, то он просто игнорируется (т.к. свидетельствует, что поворотная точка либо дублируется, либо она ложная).

Фактически по результатам выполнения этого алгоритма мы будем иметь последовательность положительных и отрицательных чисел, строго следующих друг за другом. Знак этих чисел характеризует направление тенденций (восходящая +, нисходящая -). А абсолютная величина характеризует «амплитуды» этих тенденций.

Такой ВР, полученный по изложенному алгоритму, я буду называть ВРТ (временной ряд тенденций). ВРТ отвечает правилу чередования!

Восстановить последовательность непосредственно значений поворотных точек по ВРТ достаточно просто (как будет изложено ниже).

Вот алгоритм выявления ценовых тенденций на языке R:

getCSGS<-function(x)
 {
 lenx<-length(x)
 if (lenx<2) {return(x)}
 #значения накопленных положительных и отрицательных сумм по х
 csgx<-NULL
 #текущая накопленная сумма по х
 csx<-x[1]
 #позиция окончания тенденции
 xi<-NULL
 for(i in 2:lenx)
 {
 if ((sign(csx)*sign(x[i]))<0)
 {
 csgx<-c(csgx,csx); csx<-0; xi<-c(xi,i-1)}
 csx<-csx+x[i]
 }
 csgx<-c(csgx,csx); xi<-c(xi,lenx)
 return(cbind(csgx,xi))
 }

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

Вот скрипт, как это делается для рыночных цен с восстановлением истинных значений поворотных точек:

#Получаем значения цен
 S<-getS(f)
 #Дифференцирование методом конечных разностей
 dS<-diff(S,1)
 #Получение последовательности накопленных
 #положительных и отрицательных сумм
 csgS<-getCSGS(dS)
 #Восстановление ВР тенденций
 CS<-c(S[1],csgS[,1])
 CS<-cumsum(CS)
 #Исходный график
 plot(S,type='l')
 #График тенденций
 lines(x=c(1,csgS[,2]+1),y=CS,col="red")

А вот совмещение исходного графика рыночных цен и графика поворотных точек, соединённых прямыми (получен на основе ВРТ):

g2

График поворотных точек – есть достаточно точное приближение исходного графика! При этом ВРТ и последовательность поворотных точек подчиняются правилу чередования. А такие данные проще анализировать и прогнозировать с точки зрения порогового прогнозирования тенденций!

Именно ВРТ с позиции прогнозирования я и буду изучать в дальнейшем.

Похожие статьи:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *