Разностное исчисление, примеры. - страница 5

 
Aleksey Panfilov:

По поводу Фурье, тема богатая. При наличии интереса, будем её касаться периодически. 

Скорее всего,  основные вопросы возникнут с постановкой задачи (в силу другого метода). Сейчас, насколько я понимаю, индикатор выбирает наиболее амплитудные частоты из спектра Фурье.

У меня была мысль, прикрутить индикатор Fourier к уже усредненной полиномом линии. Есть подозрение, что его экстраполированные показания будут меняться медленнее.


Мыслите в общем-то в правильном направлении.

Экстраполяции методами полинома и Фурье имеют абсолютно разную природу. Экстраполяция по Фурье может быть применима только на флэтовом рынке ввиду своей периодической природы (эта линия - сумма синусоид различной частоты, фазы и амплитуды) и она все время наровит вернуться обратно.

Тогда как полиномиальная экстраполяция, наоборот, хороша при тренде, т.к. пытается все время "улететь" вниз или вверх ввиду своей степенной природы. 
Поэтому есть очень большая целесообразность объединить эти два метода. Простым суммированием здесь конечно не отделаешься. Но у меня есть четкое представление, как оптимальнее их комбинировать между собой и делать это надо с применением распознавания образов. И у меня уже есть серьезные наработки на эту тему. Первый свой алгоритм распознавания я даже опубликовал довольно давно в открытом коде. Этот алгоритм находит линейные (полином 1-й степени) каналы на всех ТФ.  Не смотря на то, что он самый примитивный и медленный из моих, лучше пока я еще не встречал даже на маркете (хвастаюсь ).

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

 
Evgeny Belyaev:

Такое все делали... писали...


Чтобы начать ряд сравнений, вернемся к хорошо известному.

 
      a1_Buffer[i] =iMA(NULL,0,145,0,MODE_EMA,PRICE_OPEN,i);// a1_Buffer[i]=  ((open[i] - Znach)    +5061600*a1_Buffer[i+1 ]-7489800   *a1_Buffer[i+2 ]+4926624*a1_Buffer[i+3 ]-1215450*a1_Buffer[i+4 ])/1282975;

      a5_Buffer[i+92]=a1_Buffer[i];   if(i<=1) { for(z=92-1;z>=0;z--){        a5_Buffer[i+0+z]=  2*a5_Buffer[i+1+z]  -  1*a5_Buffer[i+2+z]  ;  }}



      a2_Buffer[i]= ( (open[i] - Znach)  + 72   *a2_Buffer[i+1 ] )/73;
      
      a6_Buffer[i+92]=a2_Buffer[i];   if(i<=1) { for(z=92-1;z>=0;z--){         a6_Buffer[i+0+z]=  2*a6_Buffer[i+1+z] -  1*a6_Buffer[i+2+z]  ;  }}

Первая линия a1_Buffer построена как классический EMA  периодом 145 (72*2+1), с опорой на точки открытия и смещена на 72 шага влево. Широкая серая линия на рисунке.

Вторая линия a5_Buffer показывает экстраполяцию при помощи прямой по двум последним точкам первой линии.  Серая линия потоньше на рисунке.

Третья линия a2_Buffer построена непосредственно по разностному  уравнению первой степени. Синяя линия  на рисунке.

1*Y_(-1)-2*Y_0+1*Y_(+1)=0 Разностное уравнение первой степени для равноотстоящих точек.

2*Y_(-1)-3*Y_0+1*Y_(+2)=0 Разностное уравнение первой степени для плеча в 2 интервала.

72*Y_(-1)-73*Y_0+1*Y_(+72)=0 Разностное уравнение первой степени для плеча в 72 интервала.

По сути это уравнение Рычага Архимеда первой степени.

Четвертая линия a6_Buffer показывает экстраполяцию при помощи прямой по двум последним точкам третьей линии.  Красная линия  на рисунке которая опирается на точку открытия.

Мы видим полную идентичность двух построений. Привел пример, чтобы не показывать преобразование кода и вида классической формулы ЕМА к разностному виду.

Хочу заметить, что значит, в рамках сложившейся терминологии, мы можем называть построение при помощи  полиномов, ЕМА определенной степени. Поскольку вопрос о названии построенных линий остался открытым. )

Если не возражаете, конечно.:))

 
Nikolai Semko:

Первый свой алгоритм распознавания я даже опубликовал довольно давно в открытом коде. Этот алгоритм находит линейные (полином 1-й степени) каналы на всех ТФ.  Не смотря на то, что он самый примитивный и медленный из моих, лучше пока я еще не встречал даже на маркете (хвастаюсь  ).

На мой взгляд, вполне оправданно. :))
 

Хочу обратить внимание, что экстраполировать точку можно, как рассчитав предварительно коэффициенты (a2_Buffer синяя линия), так и снимая нужное значение с перерисовываемой линии (a6_Buffer желтая линия). Хотя. конечно, второй вариант затратный по ресурсам.

      a1_Buffer[i] =iMA(NULL,0,145,0,MODE_EMA,PRICE_OPEN,i);// a1_Buffer[i]=  ((open[i] - Znach)    +5061600*a1_Buffer[i+1 ]-7489800   *a1_Buffer[i+2 ]+4926624*a1_Buffer[i+3 ]-1215450*a1_Buffer[i+4 ])/1282975;

      a5_Buffer[i+92]=a1_Buffer[i];   if(i<=1100) { for(z=92-1;z>=0;z--){        a5_Buffer[i+0+z]=  2*a5_Buffer[i+1+z]  -  1*a5_Buffer[i+2+z]  ;  }}



      a2_Buffer[i]= 37* a1_Buffer[i] -36 *a1_Buffer[i+1];
      
      a6_Buffer[i+56]=a5_Buffer[i+56];  


 

Теперь усреднение полиномом второй степени (EMA второй степени) и экстраполяция на разное плечо при помощи прямой.

      a1_Buffer[i]=  ((open[i] - Znach)    +5328*a1_Buffer[i+1 ]-   2628 *a1_Buffer[i+2 ])/2701;

      a5_Buffer[i+92]=a1_Buffer[i];   if(i<=1100) { for(z=92-1;z>=0;z--){        a5_Buffer[i+0+z]=  2*a5_Buffer[i+1+z]  -  1*a5_Buffer[i+2+z]  ;  }}



      a2_Buffer[i+20]=a5_Buffer[i+20]; 
      
      a3_Buffer[i+38]=a5_Buffer[i+38]; 
      
      a4_Buffer[i+56]=a5_Buffer[i+56];
        
      a6_Buffer[i+74]=a5_Buffer[i+74];
    

Первый рисунок - схема построения, на втором рисунке все не перерисовывающиеся линии выведены к последнему значению.

Индикаторы в подвале отличаются только заданным смещением линий.



 

Усреднение полиномом второй степени (EMA второй степени) и экстраполяция на разное плечо при помощи квадратной параболы (полинома второй степени).

      a1_Buffer[i]=  ((open[i] - Znach)    +5328*a1_Buffer[i+1 ]-   2628 *a1_Buffer[i+2 ])/2701;

      a5_Buffer[i+92]=a1_Buffer[i];   if(i<=1100) { for(z=92-1;z>=0;z--){        a5_Buffer[i+0+z]=  3*a5_Buffer[i+1+z]  -  3*a5_Buffer[i+2+z]  +  1*a5_Buffer[i+3+z]  ;  }}


      a2_Buffer[i+20]=a5_Buffer[i+20]; 
      
      a3_Buffer[i+38]=a5_Buffer[i+38]; 
      
      a4_Buffer[i+56]=a5_Buffer[i+56];
        
      a6_Buffer[i+74]=a5_Buffer[i+74];
  

Первый рисунок - схема построения, на втором рисунке все не перерисовывающиеся линии выведены к последнему значению.

Индикаторы в подвале отличаются только заданным смещением линий.


 

Несколько раз просмотрел ветку и никак не пойму: о чем речь?

Котировка - это случайный процесс, который можно аппроксимировать самыми разными аналитическими кривыми, в частности теми, которые здесь на ветке.

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

Коэффициенты в этих аналитических- кривых являются константами, а это очень смелая мысль.

Так как мы аппроксимируем случайный процесс, то коэффициенты также являются СЛУЧАЙНЫМИ величинами и они должны ОЦЕНИВАТЬСЯ, а не вычисляться со всеми вытекающими. Например, запросто можно получить величину коэффициента, видеть его значение, а при рассмотрении его оценки увидеть, что ошибка определения величины коэффициента кратно превосходит саму эту величину.

И неприятности на этом не заканчиваются. Ошибка является ошибкой, если она распределена нормально, а если она НЕ стационарно, то коэффициента вообще нет, хотя мы его видим.

Именно поэтому все индикаторы оказываются неработоспособными. Хотя красоты бывают неописуемой. 


ПС.

Тут выше был пост, что из прошлого не вытекает будущее. Так выше раскрытие этого печального факта.

 
СанСаныч Фоменко:

Несколько раз просмотрел ветку и никак не пойму: о чем речь?

Котировка - это случайный процесс, который можно аппроксимировать самыми разными аналитическими кривыми, в частности теми, которые здесь на ветке.

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

Коэффициенты в этих аналитических- кривых являются константами, а это очень смелая мысль.

Так как мы аппроксимируем случайный процесс, то коэффициенты также являются СЛУЧАЙНЫМИ величинами и они должны ОЦЕНИВАТЬСЯ, а не вычисляться со всеми вытекающими. Например, запросто можно получить величину коэффициента, видеть его значение, а при рассмотрении его оценки увидеть, что ошибка определения величины коэффициента кратно превосходит саму эту величину.

И неприятности на этом не заканчиваются. Ошибка является ошибкой, если она распределена нормально, а если она НЕ стационарно, то коэффициента вообще нет, хотя мы его видим.

Именно поэтому все индикаторы оказываются неработоспособными. Хотя красоты бывают неописуемой. 


ПС.

Тут выше был пост, что из прошлого не вытекает будущее. Так выше раскрытие этого печального факта.

Спасибо за Ваше сообщение.

И еще запомнилось:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

А вы умеете готовить каналы?

СанСаныч Фоменко, 2017.12.31 11:00

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

А вы умеете готовить каналы?

Aleksey Ivanov, 2017.12.31 10:48

Да, забыл уточнить, что эти скользящие распределения вероятности я строил неотстающими (скользящие средние, строящиеся по 2n+1, точек отстают на n точек, то же, конечно, верно и для распределений), для чего как раз по модели

GARCH прогнозировал ряд точек, создавая, уже с учетом даваемой ими дополнительной  статистики, модель неотстающего распределения на конечном участке истории (что и важен).   Вопрос  к СанСанычу (СанСаныч Фоменко): "Такой подход будет более корректным при скачках или также будет косячить?"


Я не могу оценить Ваш метод и дать ответ.

Вы пытаетесь рассмотреть некую идею, каковых на рынке несметное количество, но и   как подавляющее число авторов идей не задаете себе вопрос: на каком основании все то, что вы видите на исторических данных повториться в будущем? А точнее: а обладает ли ваша идея хотя бы какой-либо предсказательной способностью?

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

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

Идеология GARCH:

  • исходная предпосылка - НЕ стационарность
  • точно формулируем смысл слова НЕ стационарность
  • начинаем по кусочку уходить от НЕ к стационарности к стационарности.
  • чем ближе стационарность, тем большей способностью предсказывать будущее обладает алгоритм


А Ваша идея идет этим путем?


Думаю, обязательно пригодится. 
 

Усреднение полиномом четвертой степени с плечом 72 (EMA четвертой степени) и экстраполяция на разное плечо при помощи прямой.

      a1_Buffer[i]=((open[i] - Znach)    +5061600*a1_Buffer[i+1 ]-7489800    *a1_Buffer[i+2 ]+4926624*a1_Buffer[i+3 ]-1215450*a1_Buffer[i+4 ])/1282975;

      a5_Buffer[i+92]=a1_Buffer[i];   if(i<=1100) { for(z=92-1;z>=0;z--){        a5_Buffer[i+0+z]=  2*a5_Buffer[i+1+z]  -  1*a5_Buffer[i+2+z]  +  0*a5_Buffer[i+3+z]  ;  }}


      a2_Buffer[i+20]=a5_Buffer[i+20]; 
      
      a3_Buffer[i+38]=a5_Buffer[i+38]; 
      
      a4_Buffer[i+56]=a5_Buffer[i+56];
        
      a6_Buffer[i+74]=a5_Buffer[i+74];
 

Первый рисунок - схема построения, на втором рисунке все не перерисовывающиеся линии выведены к последнему значению.

Индикаторы в подвале отличаются только заданным смещением линий.


 

Усреднение полиномом четвертой степени с плечом 72 (EMA четвертой степени) и экстраполяция на разное плечо при помощи квадратной параболы (полинома второй степени).

      a1_Buffer[i]=((open[i] - Znach)    +5061600*a1_Buffer[i+1 ]-7489800    *a1_Buffer[i+2 ]+4926624*a1_Buffer[i+3 ]-1215450*a1_Buffer[i+4 ])/1282975;

      a5_Buffer[i+92]=a1_Buffer[i];   if(i<=1100) { for(z=92-1;z>=0;z--){        a5_Buffer[i+0+z]=  3*a5_Buffer[i+1+z]  -  3*a5_Buffer[i+2+z]  +  1*a5_Buffer[i+3+z]  ;  }}


      a2_Buffer[i+20]=a5_Buffer[i+20]; 
      
      a3_Buffer[i+38]=a5_Buffer[i+38]; 
      
      a4_Buffer[i+56]=a5_Buffer[i+56];
        
      a6_Buffer[i+74]=a5_Buffer[i+74];

Первый рисунок - схема построения, на втором рисунке все не перерисовывающиеся линии выведены к последнему значению.

Индикаторы в подвале отличаются только заданным смещением линий.


Причина обращения: