Вывел систему уравнений для нахождения коэ-тов параболы по методу наименьших квадратов. Кто помнит линейку? Или самому придется лезть в детерминанты...
Здесь алгоритм решения системы линейных уравнений и реализация в форме полиномиальной регрессии. При m=1 - линия, при m=2 - будет парабола, при m=3 - кубик, и т.д.
На базе этого можно строить и СКО, и вероятностные уровни и оптимизировать длину, и экстраполяцию. Хотя с достоверной экстраполяцией, мне пока не все понятно, может кто-то просветит? Если вообще на это кто-то обратил внимание? А то может я зря все это привожу?
Вывел систему уравнений для нахождения коэ-тов параболы по методу наименьших квадратов. Кто помнит линейку? Или самому придется лезть в детерминанты...
Rosh, зачем так всё сложно? Как Вы собираетесь искать коэффициенты, если Вы заранее не знаете, что именно в этой выборке есть то что Вам нужно? На самом деле можно всё сделать проще! Vladislav ведь ещё в самом начале говорил, что ошибки аппрксимации показывают порядок аппроксимации. И я уже писал про это. Могу ещё раз повторить. Если у нас есть уравнение вида y=ax^2+bx+c, то аппроксимируя выборку каналом линейной регрессии у1=b1X+c1 Вы на самом деле получаете коэффициент b1 равный коэфициенту b начального уравнения. Далее вычитая из первого уравнения уравнение линейной регресиии мы получаем уравнение вида y=ax^2+c2. То есть из этого уравнения мы уже можем сразу сказать, что вершина параболы будет смещена относительно оси x на величину c2. Также нужно принимать во внимание ещё и то обстоятельство что вершина параболы будет лежать строго по середине выборки. Если мы примем вершину параболы в точке (0,c2), то есть центр отсчёта по выборке разметим в вершине параболы, то мы будем иметь дело с уравнением (y-c2)=ax^2. Но мы естественно не знаем в этом уравнении 2х параметров a и c2. Но мы знаем как они зависят друг от друга с2=y-ax^2. Также мы знаем точки пересечения параболы с осью X. Итого имеем три точки по оси х - вершину и пересечения с осью x, по которым нужно найти искомую параболу. И тут я не вижу никакого другого способа решения проблемы как просто методом последовательного приближения найти такой параметр a и следовательно c2, при которых СКО ошибки от аппроксимации уже параболой будет минимальна. И далее по известному с2 мы можем получить и параметр c из самого первого уравнения, благодаря которому мы имеем полное уравнение квадратичной функции. Я думаю, что именно это и занимает у Vladislava большую часть вычислительного времени, поскольку всё остальное может занимать менее значительную часть по длительности расчётов.
Юрий, Вы абсолютно зря раздражаетесь. Я действительно не понял Ваш вопрос. Отвечаю как просили: для той постановки задачи, которая решается - правильно там нужна именно такая оценка.
Vladislav, на картинке, представленной Вами, видно, что в индикаторе MMLevls_VG параметр MMPeriod равен 240. Так ли это? Вы говорите, что всё приводите к дневкам. Может чего не понимаю?
Вывел систему уравнений для нахождения коэ-тов параболы по методу наименьших квадратов. Кто помнит линейку? Или самому придется лезть в детерминанты...
Rosh, зачем так всё сложно? Как Вы собираетесь искать коэффициенты, если Вы заранее не знаете, что именно в этой выборке есть то что Вам нужно? На самом деле можно всё сделать проще! Vladislav ведь ещё в самом начале говорил, что ошибки аппрксимации показывают порядок аппроксимации. И я уже писал про это. Могу ещё раз повторить. Если у нас есть уравнение вида y=ax^2+bx+c, то аппроксимируя выборку каналом линейной регрессии у1=b1X+c1 Вы на самом деле получаете коэффициент b1 равный коэфициенту b начального уравнения. Далее вычитая из первого уравнения уравнение линейной регресиии мы получаем уравнение вида y=ax^2+c2. То есть из этого уравнения мы уже можем сразу сказать, что вершина параболы будет смещена относительно оси x на величину c2. Также нужно принимать во внимание ещё и то обстоятельство что вершина параболы будет лежать строго по середине выборки. Если мы примем вершину параболы в точке (0,c2), то есть центр отсчёта по выборке разметим в вершине параболы, то мы будем иметь дело с уравнением (y-c2)=ax^2. Но мы естественно не знаем в этом уравнении 2х параметров a и c2. Но мы знаем как они зависят друг от друга с2=y-ax^2. Также мы знаем точки пересечения параболы с осью X. Итого имеем три точки по оси х - вершину и пересечения с осью x, по которым нужно найти искомую параболу. И тут я не вижу никакого другого способа решения проблемы как просто методом последовательного приближения найти такой параметр a и следовательно c2, при которых СКО ошибки от аппроксимации уже параболой будет минимальна. И далее по известному с2 мы можем получить и параметр c из самого первого уравнения, благодаря которому мы имеем полное уравнение квадратичной функции. Я думаю, что именно это и занимает у Vladislava большую часть вычислительного времени, поскольку всё остальное может занимать менее значительную часть по длительности расчётов.
Не понимаю - какие проблемы. Уравнение параболы ищется из тех же соображений, что и канал линейной регрессии - через МНК. Решение этой системы уравнений однозначное, и итераций не требующее, решается в лоб. Zi=Deti/Det , где Zi - коэфиициенты параболы, Det - детерминант матрицы, Deti - детерминант матрицы, получаемый подстановкой в i столбец столбца свободных членов (Ti). Точно также мы можем применить к полученному криволинейному каналу (описываемому в будущем однозначно) те же самые критерии - СКО всей выборки в канале параболы не больше СКО 2/3 выборки. Насчет Херста к этому каналу - я пока промолчу, так как не имею ответа, но руки вот-вот дойдут этим заняться :)
ЗЫ Нашел справочник по математике 1986 года, и потому я шибко поумнел :) (Колмогоров или Демидович был бы лучше)
ЗЫ Нашел справочник по математике 1986 года, и потому я шибко поумнел :)
Это ОЧЕНЬ хорошо, что существует простое решение не требующее итераций. Я просто тоже линал сильно уж подзабыл :o(. Прийдётся тоже посмотреть книжки. Rosh, если Вы уже окончательно с этим разобрались, то думаю, что всем заинтересованным будет также интересно ознакомиться с полным вариантом решения, которое Вы уже набросали выше. А может быть Вы даже сможете оформить это отдельной статьёй на альпари?
Вывел систему уравнений для нахождения коэ-тов параболы по методу наименьших квадратов. Кто помнит линейку? Или самому придется лезть в детерминанты...
Здесь алгоритм решения системы линейных уравнений и реализация в форме полиномиальной регрессии. При m=1 - линия, при m=2 - будет парабола, при m=3 - кубик, и т.д.
Да, это оно и есть, то что хотел solandr. Правда, возник вопрос - написать по моим формулам так быстро такой немного хитрый код - это нужно быть спецом. Правда, я рассмотрел код, и алгоритм там свой , по-крайней мере, индексация матричных членов идет зеркально моей системе уравнений. Теперь я вижу, что ANG3110 собаку съел на таких вещах (ветку на пауке помню) :)
Теперь я вижу, что ANG3110 собаку съел на таких вещах (ветку на пауке помню) :)
Действительно, полностью поддерживаю!!! Очень красивый и НУЖНЫЙ индикатор! ANG3110, Вы могли бы дать пояснения по коду? С наскоку его сложно разобрать. Может быть у Вас имеется своя ветка на форуме, где про этот индикатор всё подробно расписано? Заранее благодарю за информацию.
Здесь алгоритм решения системы линейных уравнений и реализация в форме полиномиальной регрессии.
При m=1 - линия,
при m=2 - будет парабола,
при m=3 - кубик, и т.д.
//-------------------------------- #property indicator_chart_window #property indicator_buffers 1 #property indicator_color1 LightSkyBlue //----------------------------------- extern double hours = 24; extern int m = 2; extern int i0 = 0; //----------------------- double fx[]; double a[10,10],b[10],x[10],sx[20]; double sum; int p; int nn; //******************************************* int init() { IndicatorShortName("at_PR (Din)"); SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,fx); p=hours*60/Period(); nn=m+1; return(0); } //********************************************************** int start() { int i,n,k; sx[1]=p+1; SetIndexDrawBegin(0,Bars-p+i0); //----------------------sx--------------------- for(i=1; i<=nn*2-2; i++) { sum=0.0; for(n=i0; n<=i0+p; n++) {sum+=MathPow(n,i);} sx[i+1]=sum; } //----------------------syx-------------------- for(i=1; i<=nn; i++) { sum=0.0; for(n=i0; n<=i0+p; n++) { if (i==1) sum+=Close[n]; else sum+=Close[n]*MathPow(n,i-1); } b[i]=sum; } //===============Matrix======================== for(int j=1; j<=nn; j++) { for(i=1; i<=nn; i++) { k=i+j-1; a[i,j]=sx[k]; } } //===============Gauss========================= af_Gauss(nn,a,b,x); //============================================= for (i=i0; i<=i0+p; i++) { sum=0; for(k=1; k<=m; k++) sum+=x[k+1]*MathPow(i,k); fx[i]=x[1]+sum; } //------------------------------------------------------------- return(0); } //*************************************************************** void af_Gauss(int n, double& a[][],double& b[], double& x[]) { int i,j,k,l; double q,m,t; for(k=1; k<=n-1; k++) { l=0; m=0; for(i=k; i<=n; i++) { if (MathAbs(a[i,k])>m) {m=MathAbs(a[i,k]); l=i;} } if (l==0) return(0); if (l!=k) { for(j=1; j<=n; j++) { t=a[k,j]; a[k,j]=a[l,j]; a[l,j]=t; } t=b[k]; b[k]=b[l]; b[l]=t; } for(i=k+1;i<=n;i++) { q=a[i,k]/a[k,k]; for(j=1;j<=n;j++) { if (j==k) a[i,j]=0; else a[i,j]=a[i,j]-q*a[k,j]; } b[i]=b[i]-q*b[k]; } } x[n]=b[n]/a[n,n]; for(i=n-1;i>=1;i--) { t=0; for(j=1;j<=n-i;j++) { t=t+a[i,i+j]*x[i+j]; x[i]=(1/a[i,i])*(b[i]-t); } } return; } //**********************************************************************На базе этого можно строить и СКО, и вероятностные уровни и оптимизировать длину, и экстраполяцию.
Хотя с достоверной экстраполяцией, мне пока не все понятно, может кто-то просветит?
Если вообще на это кто-то обратил внимание? А то может я зря все это привожу?
Rosh, зачем так всё сложно? Как Вы собираетесь искать коэффициенты, если Вы заранее не знаете, что именно в этой выборке есть то что Вам нужно? На самом деле можно всё сделать проще! Vladislav ведь ещё в самом начале говорил, что ошибки аппрксимации показывают порядок аппроксимации. И я уже писал про это. Могу ещё раз повторить. Если у нас есть уравнение вида y=ax^2+bx+c, то аппроксимируя выборку каналом линейной регрессии у1=b1X+c1 Вы на самом деле получаете коэффициент b1 равный коэфициенту b начального уравнения. Далее вычитая из первого уравнения уравнение линейной регресиии мы получаем уравнение вида y=ax^2+c2. То есть из этого уравнения мы уже можем сразу сказать, что вершина параболы будет смещена относительно оси x на величину c2. Также нужно принимать во внимание ещё и то обстоятельство что вершина параболы будет лежать строго по середине выборки. Если мы примем вершину параболы в точке (0,c2), то есть центр отсчёта по выборке разметим в вершине параболы, то мы будем иметь дело с уравнением (y-c2)=ax^2. Но мы естественно не знаем в этом уравнении 2х параметров a и c2. Но мы знаем как они зависят друг от друга с2=y-ax^2. Также мы знаем точки пересечения параболы с осью X. Итого имеем три точки по оси х - вершину и пересечения с осью x, по которым нужно найти искомую параболу. И тут я не вижу никакого другого способа решения проблемы как просто методом последовательного приближения найти такой параметр a и следовательно c2, при которых СКО ошибки от аппроксимации уже параболой будет минимальна. И далее по известному с2 мы можем получить и параметр c из самого первого уравнения, благодаря которому мы имеем полное уравнение квадратичной функции. Я думаю, что именно это и занимает у Vladislava большую часть вычислительного времени, поскольку всё остальное может занимать менее значительную часть по длительности расчётов.
Удачи и попутных трендов.
Rosh, зачем так всё сложно? Как Вы собираетесь искать коэффициенты, если Вы заранее не знаете, что именно в этой выборке есть то что Вам нужно? На самом деле можно всё сделать проще! Vladislav ведь ещё в самом начале говорил, что ошибки аппрксимации показывают порядок аппроксимации. И я уже писал про это. Могу ещё раз повторить. Если у нас есть уравнение вида y=ax^2+bx+c, то аппроксимируя выборку каналом линейной регрессии у1=b1X+c1 Вы на самом деле получаете коэффициент b1 равный коэфициенту b начального уравнения. Далее вычитая из первого уравнения уравнение линейной регресиии мы получаем уравнение вида y=ax^2+c2. То есть из этого уравнения мы уже можем сразу сказать, что вершина параболы будет смещена относительно оси x на величину c2. Также нужно принимать во внимание ещё и то обстоятельство что вершина параболы будет лежать строго по середине выборки. Если мы примем вершину параболы в точке (0,c2), то есть центр отсчёта по выборке разметим в вершине параболы, то мы будем иметь дело с уравнением (y-c2)=ax^2. Но мы естественно не знаем в этом уравнении 2х параметров a и c2. Но мы знаем как они зависят друг от друга с2=y-ax^2. Также мы знаем точки пересечения параболы с осью X. Итого имеем три точки по оси х - вершину и пересечения с осью x, по которым нужно найти искомую параболу. И тут я не вижу никакого другого способа решения проблемы как просто методом последовательного приближения найти такой параметр a и следовательно c2, при которых СКО ошибки от аппроксимации уже параболой будет минимальна. И далее по известному с2 мы можем получить и параметр c из самого первого уравнения, благодаря которому мы имеем полное уравнение квадратичной функции. Я думаю, что именно это и занимает у Vladislava большую часть вычислительного времени, поскольку всё остальное может занимать менее значительную часть по длительности расчётов.
Не понимаю - какие проблемы. Уравнение параболы ищется из тех же соображений, что и канал линейной регрессии - через МНК. Решение этой системы уравнений однозначное, и итераций не требующее, решается в лоб.
Zi=Deti/Det , где Zi - коэфиициенты параболы, Det - детерминант матрицы, Deti - детерминант матрицы, получаемый подстановкой в i столбец столбца свободных членов (Ti). Точно также мы можем применить к полученному криволинейному каналу (описываемому в будущем однозначно) те же самые критерии - СКО всей выборки в канале параболы не больше СКО 2/3 выборки. Насчет Херста к этому каналу - я пока промолчу, так как не имею ответа, но руки вот-вот дойдут этим заняться :)
ЗЫ Нашел справочник по математике 1986 года, и потому я шибко поумнел :)
(Колмогоров или Демидович был бы лучше)
Спасибо, понял. Хотя я с этим не согласен и остаюсь при своем мнении.
Это ОЧЕНЬ хорошо, что существует простое решение не требующее итераций. Я просто тоже линал сильно уж подзабыл :o(. Прийдётся тоже посмотреть книжки. Rosh, если Вы уже окончательно с этим разобрались, то думаю, что всем заинтересованным будет также интересно ознакомиться с полным вариантом решения, которое Вы уже набросали выше. А может быть Вы даже сможете оформить это отдельной статьёй на альпари?
А тут как бы курс- http://www.exponenta.ru/educat/class/courses/student/la/examples.asp
Здесь алгоритм решения системы линейных уравнений и реализация в форме полиномиальной регрессии.
При m=1 - линия,
при m=2 - будет парабола,
при m=3 - кубик, и т.д.
Да, это оно и есть, то что хотел solandr. Правда, возник вопрос - написать по моим формулам так быстро такой немного хитрый код - это нужно быть спецом. Правда, я рассмотрел код, и алгоритм там свой , по-крайней мере, индексация матричных членов идет зеркально моей системе уравнений. Теперь я вижу, что ANG3110 собаку съел на таких вещах (ветку на пауке помню) :)
Действительно, полностью поддерживаю!!!
Очень красивый и НУЖНЫЙ индикатор!
ANG3110, Вы могли бы дать пояснения по коду? С наскоку его сложно разобрать. Может быть у Вас имеется своя ветка на форуме, где про этот индикатор всё подробно расписано? Заранее благодарю за информацию.