Диалог автора. Александр Смирнов. - страница 41

 
lna01:
Коэффициенты линии a и b рассчитываются вот в этих строчках.
A = (SumXY - N3*SumY)*N4;
B = (N1*SumY - SumXY)*N2;
Для наглядности прилагаю версию MovingLR_2, которая просто рисует текущую линейную регрессию. Тем более, что в предыдущей была помарка при расчёте N4 :)

MovingLR_2 выдает чистую линейную регрессию и убедиться в этом достаточно легко. В at_LR0 неточен переход от периода в часах к периоду в барах. Если в at_LR0 заменить Close на (High+Low)/2 и взять период 1, в MovingLR_2 задать период не 60 а 61 и повесить их на минутный график, результаты полностью совпадут.


Ну тогда MovingLR_2 нормальный алгоритм, чуть причесать компоновку кода, и все Ок!

В at_LR0 cмещение на один бар сделано, чтобы соответствовало линейной регрессии из набора стандартных инструментов МТ4. Может этого и не нужно было делать...

 
Mathemat:

2 zigan:

для линейной регрессии формула такая: LRMA = 3*LWMA - 2*MA

для квадратичной:

Quadratic Regression MA = 3 * SMA + QWMA * ( 10 - 15/( N + 2 ) ) - LWMA * ( 12 - 15/( N + 2 ) )

Здесь N - период средних,

QWMA( i; N ) = 6/( N*(N+1)(2*N+1) ) * sum( Close[i] * (N-i)^2; i = 0..N-1 ) (машка с квадратичными весами).

для кубической: ой, все пока не возьмусь вытащить ее из Trading Solutions, больно уж формула у меня там дикая.

2 Candid: ну точно истинный параноик, я бы до такого не додумался...


У меня получились другие формулы.

где

 
Хм, для СКО получился ещё более вкусный результат, чем у Yurixx'а:

СКО^2 = (Sum(Y*Y) - A*Sum(X*Y) - B*Sum(Y))/(N-2)

Аналогично Yurixx'у, простота выражения обусловлена выбором начала и направления оси Х. Если никто не найдёт ошибок, на этом подход к алгоритму пожалуй закончу. Чтобы рассчитываемые A и СКО не пропадали, оставил в индикаторе отрисовку линии ЛР и добавил канал по СКО :)

ANG3110:

чуть причесать компоновку кода, и все Ок!

Именно этот индикатор я вряд ли буду использовать, в дело пойдёт алгоритм.

2 Yurixx :
Похоже разница в значениях СКО для малых N связана не с коррекцией СКО, а с выбором начала и направления Х. Потому что при их смене моя прежняя формула тоже начинает давать другие результаты, а она точная без всяких оговорок.
Файлы:
 
lna01:

2 Yurixx :
Похоже разница в значениях СКО для малых N связана не с коррекцией СКО, а с выбором начала и направления Х. Потому что при их смене моя прежняя формула тоже начинает давать другие результаты, а она точная без всяких оговорок.

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

В одном, однако, не могу с вами согласиться. Значения СКО, равно как и собственно значения регрессии, не могут зависеть от выбора начала отсчета оси Х. Возможно не сама формула начинает давать другие результаты, а проявляется эта самая проблема точности вычислений. В связи с тем, что у double сохраняются только 15 значащих цифр (не говоря уже об int), в процессе вычислений довольно быстро накапливается ошибка. Особенно сильно это проявляется в том случае, когда величины X и Y имеют разные порядки. Например, Х - номер бара, может быть порядка сотен тысяч, Y - цена, порядка 1, а изменения цены - порядка 0.0001.


PS

Хотел понять чем "вкуснЕЕ" эта формула. Очевидно тем, что получается гораздо проще - в одну строку. Хотя я не понимаю, почему вы делите на (N-2), а не на (N-1). Должен все же заметить, что, стремясь к максимальному ускорению, вы должны бы использовать другую формулу. Если зафиксировать выбор начала отсчета Х относительно текущего значения цены, то выгоднее использовать формулы без Sum(X*Y). Тогда не придется вычислять свертку на каждом баре. А вот обновлять Sum(Y*Y) или Sum(X*X) на каждом баре - это один оператор.

 

Подскажите если знать текущее значение коэфициентов A и B в линейной регресии, можно ли расчитать СКО

вот формулы

коэфиц A

коэфиц B

 
Prival:

Подскажите если знать текущее значение коэфициентов A и B в линейной регресии, можно ли расчитать СКО

С привлечением квадратичного члена, типа QWMA, скорее всего как-то можно. Но алгоритм через машки заведомо неоптимален. Шанс был в возможности попользоваться нативным кодом для встроенных машек, но он похоже не оправдался.
P.S. Вспомнил, что QWMA квадратична по Х, а понадобится член, квадратичный по Y. Так что QWMA не поможет.
 
Prival:

Подскажите если знать текущее значение коэфициентов A и B в линейной регресии, можно ли расчитать СКО


Думаю, что нельзя. Прямая регрессии определяется двумя константами - А и В. При одних и тех же А и В разброс значений вокруг этой прямой может быть любым. Для вычисления СКО еще необходимы дисперсии Х и Y. Наверное QWMA тоже будет недостаточно, поскольку она не содержит квадратов Y и, поэтому, не определяет дисперсию Y.
 
Yurixx:
Наверное QWMA тоже будет недостаточно, поскольку она не содержит квадратов Y и, поэтому, не определяет дисперсию Y.
Да, я просто подзабыл что QWMA вовсе не квадратична по Y. Когда вспомнил - добавил постскрипт.
 
Yurixx:

В одном, однако, не могу с вами согласиться. Значения СКО, равно как и собственно значения регрессии, не могут зависеть от выбора начала отсчета оси Х. Возможно не сама формула начинает давать другие результаты, а проявляется эта самая проблема точности вычислений.

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

Хотя я не понимаю, почему вы делите на (N-2), а не на (N-1).

Потому что у регрессии есть дополнительная степень свободы. Яндекс может помочь с подробностями, напр. http://cmacfm.mazoo.net/archives/000936.html
Должен все же заметить, что, стремясь к максимальному ускорению, вы должны бы использовать другую формулу. Если зафиксировать выбор начала отсчета Х относительно текущего значения цены, то выгоднее использовать формулы без Sum(X*Y). Тогда не придется вычислять свертку на каждом баре. А вот обновлять Sum(Y*Y) или Sum(X*X) на каждом баре - это один оператор.
Sum(X*Y) у нас уже есть, без неё нельзя рассчитать ни А ни В. Рассчитывается она рекуррентно, в три операции. Посмотрите внимательнее код at_LR0 или MovingLRv3.

P.S. Для Sum(Y*Y) - у меня тоже три операции, для Sum(X*X) - ни одной.
 
Prival:
Mathemat:

Quadratic Regression MA = 3 * SMA + QWMA * ( 10 - 15/( N + 2 ) ) - LWMA * ( 12 - 15/( N + 2 ) )

QWMA( i; N ) = 6/( N*(N+1)(2*N+1) ) * sum( Close[i] * (N-i)^2; i = 0..N-1 ) (машка с квадратичными весами).

У меня получились другие формулы.

где

Точно те же формулы, спасибо, Prival. Приведи подобные относительно машек.
Причина обращения: