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

 

По портфельной математике есть книга "Foundations for Financial Economics" Chi-Fu Huang, Robert H. Litzenberger. Там третья глава этому посвящена. И я оказался слишком серый, чтобы разобраться. Если правильно понял, то также, в частности, ставится задача минимизации СКО при условии, что сумма весов (или их абсолютных значений) равна единице. Интересные там графики приведены, но серость читателя...

 

Случайно наткнулся на данные прогона в MT5-тестере усреднителя (сетка) на синтетике из двух пар. Конечно, надо бэктестить, а не индикаторы писать для ручной торговли.

Foundations for Financial Economics
Foundations for Financial Economics
  • bookzz.org
Foundations for Financial Economics | Chi-Fu Huang, Robert H. Litzenberger | digital library bookzz | bookzz. Download books for free. Find books
 
garik39:
у вас все время 4-ый корень выходил равный нулю.... запрос к либе некорректный 
garik39
:

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

Надо было в школе на уроках математики не только сидеть.

ЛР не дает ОДИН синтетик, а сразу много и отличных друг от друга. Т.е. различных портфелей из N символов ЛР выдает в количестве N штук. И они все отличаются (вектора весов не сонаправленны) при N > 2. Что же это за решение такое, зависимое от чьей-то хотелки?

Загрузите в свой индикатор сначала {EURUSD, GBPUSD, USDJPY}, затем  {USDJPY, EURUSD, GBPUSD} (последовательность строго соблюдать, никак не сортировать внутри!) и прочувствуйте разницу там, где ее, с точки зрения построения портфеля, быть не должно.

ЛР не накладывает никаких доп. ограничений на веса. А такое ограничение есть. Эх, школьные годы... 

 
zaskok:

Надо было в школе на уроках математики не только сидеть.

ЛР не дает ОДИН синтетик, а сразу много и отличных друг от друга. Т.е. различных портфелей из N символов ЛР выдает в количестве N штук. И они все отличаются (вектора весов не сонаправленны) при N > 2. Что же это за решение такое, зависимое от чьей-то хотелки?

Загрузите в свой индикатор сначала {EURUSD, GBPUSD, USDJPY}, затем  {USDJPY, EURUSD, GBPUSD} (последовательность строго соблюдать, никак не сортировать внутри!) и прочувствуйте разницу там, где ее, с точки зрения построения портфеля, быть не должно.

ЛР не накладывает никаких доп. ограничений на веса. А такое ограничение есть. Эх, школьные годы... 

 

видимо математика сопровождалась веселыми возлияниями?

напишите свой индикатор, более "правильный", я же не против

 

пояснение касательно последовательности перечисления инструментов портфеля

я полагал это как само самой разумеющееся но видимо нужно явно описать:

модели типа "тренд" и "осциллятор"  нечувствительны к порядку перечисления

модель типа "спред"  дает разные синтетики в зависимости от порядка следования символов

почему так? 

модель "тренд" берет сумму инструментов и приравнивает к прямой a*x+b*y+c*z=[1,...] поэтому как члены не переставляй сумма не изменится

модель "осциллятор" делает то же самое но приравнивает к колебателю a*x+b*y+c*z=[1,-1] поэтому опять же от перестановки слагаемых сумма не меняется

модель "спред" другая и например a*x+b*y+c*z=d и очевидно что перестановка например d*x+a*y+b*z=c даст совсем другой синтетик - так и должно быть

и таких синтетиков столько сколько вариантов перестановок относительно знака равенства (то есть равно количеству символов)

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

то есть формула "AUDJPY EURGBP NZDUSD CADJPY USDCHF" означает указание создать корзину "AUDJPY EURGBP NZDUSD CADJPY" и приравнять ее к "USDCHF"

 
transcendreamer:
разве? покажите пример, у меня все нормально считается

Нижнее - это без изменения вашего кода, верхнее с корректным запросом(приведенным в качестве примера в либе). Как видно в массиве ROOT, после записи корней из либы идет различие (З.Ы. это для спреда - другое не смотрел). И как писал тут заскок при измененом способе - порядок записи инструментов уже не имее значения. Мне именно не понравился ваш последний корень =0, который вы заменяете на -1. не должен он быть 0... =)

 

Вот исправленный блок

//////////////////////////////////////////////////////////////////////////////////////////////////////////

void CalculateRegression()                                                                               
{
if(formula) return;                                                                                                  
int info,i,j,roots=4;
double scale=0;
ArrayResize(SYNTH,points);                                                                              
ArrayResize(MODEL,points); 

for(j=0;j<points;j++) SYNTH[j]=0;

                                                                              
CLinearModelShell LM;                                                                                     
CLRReportShell AR;                                                                                      
for(i=0; i<total; i++) scale+=PointValue(SYMBOLS[i],Time[0],timeframe);                                  

                                                                                                         
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]);
     }
} 
 


CAlglib::LRBuildZ(MATRIX,points,roots,info,LM,AR);                                                       
if(info!=1) {Alert("Error in regression model!");error=true;return;}
CAlglib::LRUnpack(LM,ROOT,roots);           
for(i=0;i<total;i++)
Print(ROOT[i]);                                                                                 
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];                            
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////
 
garik39:

Нижнее - это без изменения вашего кода, верхнее с корректным запросом(приведенным в качестве примера в либе). Как видно в массиве ROOT, после записи корней из либы идет различие (З.Ы. это для спреда - другое не смотрел). И как писал тут заскок при измененом способе - порядок записи инструментов уже не имее значения. Мне именно не понравился ваш последний корень =0, который вы заменяете на -1. не должен он быть 0... =)

 

обратите внимание на 

if(model_type==spread) roots=total-1; else roots=total;

 в режиме spread корней меньше на 1

поэтому в массиве стоит 0 - этот корень просто не используется

(на самом деле это даже не корень, а пустое место в массиве)

 
transcendreamer:

 

обратите внимание на 

if(model_type==spread) roots=total-1; else roots=total;

 в режиме spread корней меньше на 1

поэтому в массиве стоит 0 - этот корень просто не используется

(на самом деле это даже не корень, а пустое место в массиве)


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]);
     }
} 

 но отправлять данные для расчета вы все таки пытаетесь отправить от 4-х синтетиков

 

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]);  

 Меня вообще смутило только различие в записи( матрица отличается размером )я конечно хз что там делается =)))), но вот эта строчка была в примере :

MATRIX[i].Set(0,i);

 И почему вы вместо нее пытаетесь сделать это я не понимаю:

 for(i=0; i<total; i++) MATRIX[j].Set(i,EQUITY[j,i])

 

Если вы не хотите  использовать 4-ый корень - зачем его пытаться туда послать?

 

Я пробовал изменять по вашему коду roots  на +1 , 0 все равно выходил вроде... если конечно мне не изменяет память, но могу ошибаться