Индикаторы: Portfolio Optimizer - страница 4

 
transcendreamer:

очень странно, может быть проблемы с загруженной историей?

вроде бы такого не наблюдается нигде 

Я просто не уточнил. именно на модели Spread


if(model_type==spread) ROOT[total-1]=-1;

чем вызвано решение приравнивать к -1???

void CalculateRegression()
{
if(formula) return;
int info,i,j,roots;
double scale=0;
ArrayResize(SYNTH,points);
ArrayResize(MODEL,points);
CLinearModelShell LM;
CLRReportShell AR;
for(i=0; i<total; i++) scale+=PointValue(SYMBOLS[i],Time[0],timeframe);
if(model_type==trend) for(j=0; j<points; j++) MODEL[j]=j*scale;
if(model_type==oscillator) for(j=0; j<points; j++) MODEL[j]=scale*(2*(j%2)-1);
if(model_type==spread) roots=total-1; else roots=total;
CMatrixDouble MATRIX(points,roots+1);
for(i=0; i<total; i++) for(j=0; j<points; j++) MATRIX[j].Set(i,EQUITY[j,i]);
if(model_type!=spread) for(j=0; j<points; j++) MATRIX[j].Set(total,MODEL[j]);
CAlglib::LRBuildZ(MATRIX,points,roots,info,LM,AR);
if(info!=1) {Alert("Error in regression model!");error=true;return;}
CAlglib::LRUnpack(LM,ROOT,roots);
ArrayResize(ROOT,total);
if(model_type==spread) ROOT[total-1]=-1;
for(j=0; j<points; j++) for(i=0; i<total; i++) SYNTH[j]+=ROOT[i]*EQUITY[j,i];
}
 
В alglib если смотреть пример для запроса вычисления линейной регресии такого не было, и почему либа выдает четвертый корень = 0 вопрос конечно интересный...  =)
 
garik39:

Я просто не уточнил. именно на модели Spread

чем вызвано решение приравнивать к -1???

Код не смотрел, но предполагаю что решая систему k1*A+k2*B+k3*C --> min, самое "лучшее" решение получается при k1=0,k2=0,k3=0. Чтобы этого не происходило, накладывают дополнительное условие - один из коэффициентов приравнивают к 1.
 
Talex:
Код не смотрел, но предполагаю что решая систему k1*A+k2*B+k3*C --> min, самое "лучшее" решение получается при k1=0,k2=0,k3=0. Чтобы этого не происходило, накладывают дополнительное условие - один из коэффициентов приравнивают к 1.
Просто в таком случае идет некорректное построение синтетика (зависимость от порядка следования ФИ в задании) по идее, что тоже нужно будет проверить
 
Talex:
Код не смотрел, но предполагаю что решая систему k1*A+k2*B+k3*C --> min, самое "лучшее" решение получается при k1=0,k2=0,k3=0. Чтобы этого не происходило, накладывают дополнительное условие - один из коэффициентов приравнивают к 1.

я ж правильно понимаю, что МНК линейной регресии означает это равенство???

Почему в коде индикатора коэф a3 всегда выходит =0 при подсчете в alglib, без учета последовательности следования ФИ в здаании


yt=a1*x1t+a2*x2t+...an*xnt?

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Типы объектов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Типы объектов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Типы объектов - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
garik39:
Просто в таком случае идет некорректное построение синтетика (зависимость от порядка следования ФИ в задании) по идее, что тоже нужно будет проверить
Да, через ЛР однобоко получается. Дайте правильную на ваш взгляд формулировку самой мат. задаче.
 

пояснение почему в модели SPREAD последний корень приравнивается к -1

смотрите, все просто - логика такая: 

модель типа спред представляет собой равенство некоторой корзины и некоторого инструмента A*x+B*y+C*z....=D

то есть - нам нужно собрать корзину таким образом чтобы она максимально имитировала последний инструмент

для этого мы решаем регрессию и этот последний инструмент становится целевой переменной

ну и поскольку итоговый синтетик должен быть представлен как линейный многочлен то нужно вынести D в левую часть уравнения

получается  A*x+B*y+C*z....-D=0

таким образом коэффициент при D равен -1

 
garik39:
Просто в таком случае идет некорректное построение синтетика (зависимость от порядка следования ФИ в задании) по идее, что тоже нужно будет проверить
Я на это пристального внимания не обращал, но кажется да, от того какой ряд используем с коэффициентом 1, будет зависить расчет остальных коэффициентов. Завтра смогу проверить (если интересно).
 

transcendreamer:

пояснение почему в модели SPREAD последний корень приравнивается к -1

смотрите, все просто - логика такая: 

модель типа спред представляет собой равенство некоторой корзины и некоторого инструмента A*x+B*y+C*z....=D

то есть - нам нужно собрать корзину таким образом чтобы она максимально имитировала последний инструмент

для этого мы решаем регрессию и этот последний инструмент становится целевой переменной

ну и поскольку итоговый синтетик должен быть представлен как линейный многочлен то нужно вынести D в левую часть уравнения

получается  A*x+B*y+C*z....-D=0

таким образом коэффициент при D равен -1

посмотрел код, понял чем отличается ваш запрос к либе от стандартного 

 

if(model_type==spread) roots=total-1; else roots=total;                                                
CMatrixDouble MATRIX(points,roots+1);                                                                  
for(i=0; i<total; i++) for(j=0; j<points; j++) MATRIX[j].Set(i,EQUITY[j,i]); 

 что должно быть согласно UseAlglibs

 

roots=total;
CMatrixDouble MATRIX(points,roots+1);                                                                   

for(i=0; i<points; i++)
{ MATRIX[i].Set(0,i);
  for(j=1;j<=total;j++)
     {MATRIX[i].Set(j,EQUITY[i,j-1]);
     }
} 

правда синтетик при таком условии не болтается около нуля постоянно, но видны периоды, когда он заходит в канал определенной ширины

                                     

 
И кстати, код индикатора у меня не скомпилировался, показывает ошибки в библиотеке Alglib, разбираться не стал. У себя для вычисленний использую библиотеку integer'a https://www.mql5.com/ru/code/10807
IncMatrix.mqh
IncMatrix.mqh
  • голосов: 4
  • 2012.08.11
  • Dmitry Fedoseev
  • www.mql5.com
Библиотека функций для работы с матрицами