Помогите разобраться с Фурье - страница 9

 
ANG3110 писал (а):

Неплохой результат дает, если мы для разложения Фурье делаем опору. В частности можно легко экстраполировать регрессию вперед, а Фурье строить относительно нее. Можно в виде опоры подкладывать мувинг и строить сумму гармоник, в отдельном окне, как-будто мувинг продолжается линейно. Можно на основе плавно изменяющейся средней типа Т3 сдвинутой на пол периоданазад, чтобы она точно совместилась с данными, а конец экстраполировать параболой, которая настраивается по минимуму СКО, и относительно этой экстраполяции строить Фурье. Но в любом случае высокая вероятность повтора циклов будет, если мы строим несколько вариантов экстраполяции Фурье с различными периодами и каждый вариант оптимизируем по минимуму СКО. Если происходит совпадение показаний нескольких вариантов, то их можно считать вероятными. Если в дальнейшем происходит опережение по фазе или отставание, то это будет давать корректирующий разностный сигнал, который можно использовать для автоподстройки или перерасчета. Это напоминает детектор с ФАПЧ (фазовой автоподстройкой частоты) в радиоприемных устройствах, который является самым эффективным и помехоустойчивым.
Ну да собственно выводить ряд Фурье не забегая вперед по времени, так, чтобы конец был близок к ряду не такая уж большая проблема. Интересно именно выводить Фурье будущих котировок. Вы выкладывали скриншоты своего индиктора строящего Фурье для будущего времени, которые хорошо совпадают с действительностью. На каких принципах он работает?
 
shobvas писал (а):

Ну да собственно выводить ряд Фурье не забегая вперед по времени, так, чтобы конец был близок к ряду не такая уж большая проблема. Интересно именно выводить Фурье будущих котировок. Вы выкладывали скриншоты своего индиктора строящего Фурье для будущего времени, которые хорошо совпадают с действительностью. На каких принципах он работает?
Там разложение сделано относительно LinearRegressin. Хвост как в радиоприемнике, чтобы слышимость была наилучшая, желательно настроить на минимум шумов и максимум сигнала, то есть настройка производится по минимуму СКО. Чтобы легко изменять период - применяется скрипт прямой линии или канала регрессии. Данные концов снимаются и передаются в индикатор. Таким образом перемещая линии, мы мгновенно меняем период и перерасчитываем всю картину. В комментах отображается СКО и настройка производится по минимуму СКО плюс маленький сдвиг на глаз чтобы максимумы и минимумы как можно лучше совпали. Еще добавлена возможность менять число гармоник, через функцию GetAsyncKeyState(int nVirtKey), тогда нажимая на клавиатуре на соответствуюшие стрелочки мы можем оперативно прибавлять или убавлять число гармоник. Тоже самое сделано посредством скрипта, который рисует это все. Ну про настройку и варианты, я немного уже написал раньше. Для разных периодов и разной достоверности количество гамоник берется разное.
Но уже более-менее удовлетворительные результаты получаюся, чтобы минимальная гармоника была от 12 до 24 часов и минимальный перидод был 2-3 дня и больше. Это для дневного прогноза. Для глобального техника та же но периоды конечно большие. В зависимости от масштаба.  На больших промежутках времени - месяцы-годы результат прогноза вообще очень хорошо совпадает с реальными данными, особенно на некоторых частотах, которые периодически повторяются с очень высокой степенью вероятности. Для того чтобы получить статистику по этим частотам - сделан хитрый анализатор спектра, который тоже можно протаскивать по всему временному диапазону. 
 
ANG3110 писал (а):
Там разложение сделано относительно LinearRegressin. Хвост как в радиоприемнике, чтобы слышимость была наилучшая, желательно настроить на минимум шумов и максимум сигнала, то есть настройка производится по минимуму СКО. Чтобы легко изменять период - применяется скрипт прямой линии или канала регрессии. Данные концов снимаются и передаются в индикатор. Таким образом перемещая линии, мы мгновенно меняем период и перерасчитываем всю картину. В комментах отображается СКО и настройка производится по минимуму СКО плюс маленький сдвиг на глаз чтобы максимумы и минимумы как можно лучше совпали. Еще добавлена возможность менять число гармоник, через функцию GetAsyncKeyState(int nVirtKey), тогда нажимая на клавиатуре на соответствуюшие стрелочки мы можем оперативно прибавлять или убавлять число гармоник. Тоже самое сделано посредством скрипта, который рисует это все. Ну про настройку и варианты, я немного уже написал раньше. Для разных периодов и разной достоверности количество гамоник берется разное.
Но уже более-менее удовлетворительные результаты получаюся, чтобы минимальная гармоника была от 12 до 24 часов и минимальный перидод был 2-3 дня и больше. Это для дневного прогноза. Для глобального техника та же но периоды конечно большие. В зависимости от масштаба. На больших промежутках времени - месяцы-годы результат прогноза вообще очень хорошо совпадает с реальными данными, особенно на некоторых частотах, которые периодически повторяются с очень высокой степенью вероятности. Для того чтобы получить статистику по этим частотам - сделан хитрый анализатор спектра, который тоже можно протаскивать по всему временному диапазону.

Я что-то неочень понимаю...
Ряд Фурье строится от разности цены и значения линии регрессии, так?

А вот про хвост не очень понятно.... Настройка чего производится по минимуму СКО?
Заранее спасибо за ответы =)
 
shobvas писал (а):
Я что-то неочень понимаю...
Ряд Фурье строится от разности цены и значения линии регрессии, так?

А вот про хвост не очень понятно.... Настройка чего производится по минимуму СКО?
Заранее спасибо за ответы =)

Да. Сначала вычисляем координаты LR[i]. Потом массив dc[i]=Close[i]-LR[i]; От массива dc[i] строим Фурье fx[i]. И прибавляем координаты LR[i]. То есть fx[i]=fx[i]+LR[i] или fx[i]+=LR[i]; Если делаем экстраполяцию, то LR[i] и fx[i] вычисляем до и после i=0 (как это делается пошевелите мозгами сами).
"Хвост" - это то что известно от i=T до i=0; Поскольку мы посредством скрипта можем мышкой сдвигать, сжимать или растягивать расчетный период (T), то при каждом сдвиге автоматически пересчитываем СКО "хвоста".
То есть sq=0.0; for (int n=0; n<T; n++) sq+=(Close[i0+n]-fx[n])*(Close[i0+n]-fx[n]); sq=MathSqrt(sq/T); И настраиваем на минимум СКО (sq).
У меня на сриншотах "хвост" изображен желтым и зеленым цветом, а экстраполяция - красным и синим.
Вообще по началу все эти построения забирают много времени и умственных сил, и если чувствуете, что пока не готовы, то подождите пока не созреете. Иначе можете замучаться со всем этим, и полученным результатам уже не будете рады.
 
ANG3110 писал (а):
Да. Сначала вычисляем координаты LR[i]. Потом массив dc[i]=Close[i]-LR[i]; От массива dc[i] строим Фурье fx[i]. И прибавляем координаты LR[i]. То есть fx[i]=fx[i]+LR[i] или fx[i]+=LR[i]; Если делаем экстраполяцию, то LR[i] и fx[i] вычисляем до и после i=0 (как это делается пошевелите мозгами сами).
"Хвост" - это то что известно от i=T до i=0; Поскольку мы посредством скрипта можем мышкой сдвигать, сжимать или растягивать расчетный период (T), то при каждом сдвиге автоматически пересчитываем СКО "хвоста".
То есть sq=0.0; for (int n=0; n<T; n++) sq+=(Close[i0+n]-fx[n])*(Close[i0+n]-fx[n]); sq=MathSqrt(sq/T); И настраиваем на минимум СКО (sq).
У меня на сриншотах "хвост" изображен желтым и зеленым цветом, а экстраполяция - красным и синим.
Вообще по началу все эти построения забирают много времени и если чувствуете, что пока не готовы, то подождите пока не созреете. Иначе моежете замучаться со всем этим, и полученным результатам уже не будете рады.

То есть по минимуму СКО настраевается T, я правильно понял?
Или количество частот гармоник в разложении Фурье настраиваются по минимуму СКО??

Однако самое интересное, а именно как производится экстраполяция функции Фурье Вы так и не рассказали =)
 
shobvas писал (а):
То есть по минимуму СКО настраевается T, я правильно понял?
Или количество частот гармоник в разложении Фурье настраиваются по минимуму СКО??

Однако самое интересное, а именно как производится экстраполяция функции Фурье Вы так и не рассказали =)
В результате вычисления линейной регрессии мы будем иметь формулу линии LR[i]=b+a*i;
В результате вычисления Фурье мы будем иметь число гармоник N, коэффициенты ak[k],bk[k], где к-соотвествует номеру гармоники (к=0. ...N); и формулу расчета Фурье sum=0.0; for(k=0; k<=N; k++) sum+=ak[k]*MathCos(w*k*i)+bk[k]*MathSin(w*k*i); fx[i]=sum;
Теперь если нам нужна экстраполяция допустим на пол периода вперед, то мы расчитываем
данные от T до -T/2; for(int i=T; i>=-T/2; i--), но поскольку массивы должны содержать только положительные индексы, то то что от -1 до -T/2 мы загоняем во второй массив, или есть прием, что бы миновать разбиение на 2 массива путем сдвига всех элементов на +T/2 назад, а при рисовании этот сдвиг учитывается. Остальное описывать есть смысл, только если уже имеется опыт в таких построениях. В скриптах мы вооще не имеем проблемм чтобы прорисовать вперед. В индикаторах нужно использовать SetIndexShift( );
 

То есть Вы вычисляете fx[i] при i<0 по формуле:

sum=0.0; for(k=0; k<=N; k++) sum+=ak[k]*MathCos(w*k*i)+bk[k]*MathSin(w*k*i); fx[i]=sum;

Так?

А функцию Фурье Вы строите для какого периода? [T,0]?

 
shobvas писал (а):

То есть Вы вычисляете fx[i] при i<0 по формуле:

sum=0.0; for(k=0; k<=N; k++) sum+=ak[k]*MathCos(w*k*i)+bk[k]*MathSin(w*k*i); fx[i]=sum;

Так?

А функцию Фурье Вы строите для какого периода? [T,0]?

SetIndexShift(0,T/2);

for (i=T; i>=-T/2; i--)
{
sum=0.0;
for(int k=0; k<=N; k++) sum+=ak[k]*MathCos(w*k*i)+bk[k]*MathSin(w*k*i);
fx[i+T/2]=sum+b+a*i;
}
 

А каким именно образом вычисляются коэфициенты ak, bk?

Интеграл там на каком интервале берется? от T до 0 или как?

 
shobvas писал (а):

А каким именно образом вычисляются коэфициенты ak, bk?

Интеграл там на каком интервале берется? от T до 0 или как?


for (int k=0; k<=N; k++)
{
sum_cos=0.0;
sum_sin=0.0;
for (int i=0; i<T; i++)
{
sum_cos+=(Close[i]-b-a*i)*MathCos(w*k*i);
sum_sin+=(Close[i]-b-a*i)*MathSin(w*k*i);
}
ak[k]=sum_cos*2/T;
bk[k]=sum_sin*2/T;
}
ak[0]=ak[0]/2;
Причина обращения: