Прогноз будущего при помощи Преобразований Фурье - страница 2

 
ANG3110:

Только что-то ничего не рисует приложенный индикатор.

Рисует. Прокрутите график влево, увидите.

 

В параллельной ветке 'Не Машкино это дело!' идет обсуждение прогноза с помощью «идеальной МА». Считаю, что идеальное сглаживание можно получить только с использованием Фурье и пороговой обработки, так как сделано тут. Наиболее точная оценка как раз находиться в середине окна выборки. Необходимо провести аналогичные исследования, но в основу положить не МА, а этот алгоритм.

Второе можно математически точно обосновать величину порога (porog), тем самым избавившись от перебора (поиска оптимального) значения этой величины.

Третье для увеличения времени прогноза, необходимо увеличить точность текущих измерений величины, это возможно двумя направлениями – одновременный анализ нескольких валют, или увеличением числа поставщиков котировок вот тут есть про это 'Сборщики тиков. Оптимизация. DDE в VB (VBA)'

 

Чтобы увидеть будущее,

надо в настройках окна графика отметить галочку "Смещение графика",

extern int InPast=0,

extern int Futur=100-на сколько баров прогноз

 

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

 

Забавный идюк, спасибо!

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

Очень интересная получается картина если на график наложить сразу 3 индикатора с разным параметром степени двойки, например 8, 9 и 10 при этом они часто смотрят в разные стороны. А что если попробовать использовать среднее значение между 3 данными индикаторами???

Не пробовали?

 
m_keeper:

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

Еще бы одну вещь сделать, уйти от БПФ (степень двойки не лучший выбор для поиска оптимального окна). Лучше дискретное преобразование.

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

 

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


Видно, что для низких частот это неплохое 1/f, но для высоких заметно отклонение от этого закона. Это какое-то время назад обсуждалось и основная версия предполагала, что мы имеем нечто вроде шума оцифровки. Мысль состоит в том, что возможно было бы полезным отфильтровать эту составляющую. То есть оставить чистый 1/f для всего диапазона частот. А вопрос в том, как это сделать. По идее нужно иметь какую-то процедуру, котрая получает на вход массив спектральной плотности, а на выход выдаёт коэффициенты цифрового фильтра. В принципе, приходит в голову и просто расcчитать весовую функцию для Фурье-амплитуд, но цифровой фильтр был бы экономичнее в употреблении.
 

В библиотеке сейчас лежит файл __lib_FFT.mq4, а в тексте индикатора стоит #_lib_FFT.mq4, поэтому и не рисуется.

 
Prival:
m_keeper:

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

Еще бы одну вещь сделать, уйти от БПФ (степень двойки не лучший выбор для поиска оптимального окна). Лучше дискретное преобразование.

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

В принципе от степени 2 очень легко избавиться:

w=2*pi/T;

for (int k=0; k<=N; k++)
   {                                                              
      sum_cos=0.0; 
      sum_sin=0.0;                                           
      for (int n=0; n<T; n++) 
      {
         sum_cos+=Close[n]*MathCos(k*n*w); 
         sum_sin+=Close[n]*MathSin(k*n*w);
      }
      ak[k]=sum_cos*2/T; 
      bk[k]=sum_sin*2/T;
   }
   ak[0]=ak[0]/2;
   //------------------------------------
   for (n=T-1; n>=0; n--)
   {                                                        
      sum=0.0;                                       
      for (k=0; k<=N; k++)
      {                                                             
         sum+=ak[k]*MathCos(k*n*w)+bk[k]*MathSin(k*n*w);
      }                                                             
      fx[n]=sum;
   }

N - число гармоник,

T - период.


Оптимальное окно, точнее оптимальный период T проще всего выбирать по 2-м критериям, по минимальному СКО, и по максимуму суммы амплитуд гармоник. Но ввиду многоволновости картины рынка, оптимальных окон будет несколько.

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


Определение фазы как MathArctan() - никуда не годится, из-за свойств arctan, по крайней мере нужно учитывать +/- pi/2.

Лучше фазу определять чуть по другому.

 

Уходить от БПФ ненужно, на самом деле в нём не обязательно делить ряд ровно попалам, он делится для увеличения скорости счёта, а не потому что надо делить строго на два. Я как-то работал с БПФ работающей с рядом любой длины, потом как нибудь перепишу под mql.


Сейчас пытаюсь определить по каким признакам можно определить ложные прогнозы

вот две картинки, с n=9 и n=10

в обоих случаях хвост окна попадал на резкий скачёк, который наверно и попадает в будущее.

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


Изменил условие сглаживания, теперь никаких рывков графика нет, всё плавно работает.


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

Цены закрытия это ещё не прошлое, а вот то что их породило - волны(в случае с Фурье) вот прошлое

и о них мы узнаём всё больше с каждым новым баром.

Файлы:
Причина обращения: