Торговля Портфелем валютных пар - страница 9

 
MetaDriver:

Они там на истории. (Действительно все белые, что полностью соответствует рекламе, подтверждаю.)

Они обязаны быть только белыми и пушистыми, т.к. согласно теореме фон Неймана - Моргенштерна значение МиниМакса - это цена игры, т.е. минимальное матожидание. Оптимально диверсифицированный портфель должен давать профит независимо от того, в каких направлениях двигаются цены инструментов, которые в нем подобраны. Соответственно, если портфель допускает убыток хоть на одном историческом участке, то его матожидание по вышеуказанной теореме - отрицательное и он не является оптимально диверсифицированным.
 
C-4:

А просто так использовать что-либо, только потому что это открыто, при этом не понимая, как это работает ни кто в здравом уме не будет.

Никто не насильно не заставляет использовать. Исходники открыты, базовая математическая теория и алгоритмы не являются секретными. Тот, кто в здравом уме и твердой памяти, тот самостоятельно способен разобраться, как это работает. Остальные пусть отдыхают.
 
kharko:

Для реализации требуется перебор всех вариантов. Общее количество вариантов равно 2 в степени N, где N - количество инструментов в портфеле. Может кто-то сможет помочь - готовым кодом. Буду очень признателен.

Оптимизировал по просадке. Линия получилась по прямее. Но в ходе моих размышлений вдруг возник вопрос. Как Вы учитываете спред? Ведь для этого необходимо знать сколько сделок будет совершено и какими объёмами! В своём индикаторе я не учитываю спред, но зато попытался сосчитать сколько пунктов мы потеряем/приобретём на свопах. При оптимизации свопы не учитываются.

Внимание! Настоятельно рекомендую не использовать большое количество валютных пар и количество анализируемых баров.

При оптимизации по просадке 10 валютных пар и параметре Lengh = 100 индикатор инициализируется около 5 секунд!!! Имейте терпение :)

Файлы:
 

Пример заполнения файла ET_para.csv, который должен находиться в папке files:

Symbol Type
EURUSD1
EURGBP0
EURCHF1
EURJPY1
GBPUSD1
USDCHF0
USDJPY1
AUDUSD1
USDCAD1
NZDUSD0

Первая строка используется под шапку и в расчётах не участвует!

Файлы:
et_para.zip  1 kb
 
EvgeTrofi:

Оптимизировал по просадке. Линия получилась по прямее. Но в ходе моих размышлений вдруг возник вопрос. Как Вы учитываете спред? Ведь для этого необходимо знать сколько сделок будет совершено и какими объёмами! В своём индикаторе я не учитываю спред, но зато попытался сосчитать сколько пунктов мы потеряем/приобретём на свопах. При оптимизации свопы не учитываются.

Внимание! Настоятельно рекомендую не использовать большое количество валютных пар и количество анализируемых баров.

При оптимизации по просадке 10 валютных пар и параметре Lengh = 100 индикатор инициализируется около 5 секунд!!! Имейте терпение :)

Хорошая работа...

Спред и своп не учитываю. Индикатор работает только с пунктами.

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

Меня интересует ваш алгоритм перебора всех вариантов. Буду вам очень признателен за помощь.

 

Матрица вариантов формируется следующим образом:

void Sbor(int& Ar[][]){
   //Создание массива вариантов сочитаний действий над валютными парами
   int Begin = 0;
   int Size = MathPow(V, CountSy);
   int min = 0;
   int max = 1;
   if(V==3) min = -1;
   ArrayResize(Ar, Size);
   for(int i = 0; i < Size; i++){ // Варианты (строки)
      for(int j = 0; j < CountSy; j++){ // Инструменты (столбцы)
         if(i==0){
            Ar[i][j]=0;
         }else{
            if(j==0){
               if(Ar[i-1][j]<max){
                  Ar[i][j]++;
               }else{
                  Ar[i][j]=min;
               }
            }else{
               if(Ar[i][j-1]<Ar[i-1][j-1]){
                  if(Ar[i-1][j]<max){
                     Ar[i][j]++;
                  }else{
                     Ar[i][j]=min;
                  }
               }else{
                  Ar[i][j]=Ar[i-1][j];
               }
            }
         }
      }//Next j
   }//Next i
}//Sbor()

Для облегчения понимания этого кода я подгрузил таблицу Excel, в которой забиты формулы для формирования подобной частной матрицы.

Ну а дальше остаётся только перебором пройтись по всем вариантам :)

Файлы:
arvar.zip  5 kb
 
EvgeTrofi:

Матрица вариантов формируется следующим образом:

Для облегчения понимания этого кода я подгрузил таблицу Excel, в которой забиты формулы для формирования подобной частной матрицы.

Ну а дальше остаётся только перебором пройтись по всем вариантам :)

спб

Написал более простой код:

void Matrica()
{
   double size = MathPow(2,Num.Para);
   int trend[];
//---
   ArrayResize(trend,Num.Para);
   for(int i=0;i<size;i++)
   {
      int x = i;
      int pos = 0;
      ArrayInitialize(trend,0);
      while(x>0)
      {
         trend[pos] = x % 2;
         pos++;
         x = MathFloor(x / 2);
      }
// Вывод варианта      
   }
}
Номер варианта представляется в виде двоичной системы счисления.


 

Добавил отображение просадки и профит-фактора (отношение текущего баланса к максимальной просадке). Чем больше это число - тем стабильнее выглядит график. Именно по этому значению ведётся оптимизация.

В комментариях выводится количество секунд, затраченное на оптимизацию. :)

Файлы:
 

EvgeTrofi:

Внимание! Настоятельно рекомендую не использовать большое количество валютных пар и количество анализируемых баров.

При оптимизации по просадке 10 валютных пар и параметре Lengh = 100 индикатор инициализируется около 5 секунд!!! Имейте терпение :)

Подумал, как обойти ограничение по количеству баров. Нужно временной промежуток для оптимизации разделить на число, например, 100. Если в промежутке 1000 бар, то получим 1000 / 100 = 10 временных точек, в которых производим расчеты. Т.о. чем меньше число, тем выше точность расчета.
 
kharko:
Подумал, как обойти ограничение по количеству баров. Нужно временной промежуток для оптимизации разделить на число, например, 100. Если в промежутке 1000 бар, то получим 1000 / 100 = 10 временных точек, в которых производим расчеты. Т.о. чем меньше число, тем выше точность расчета.

Тоже чесал репу на эту тему. Получается, чем меньше участков, тем выше вероятность подгонки.

С другой стороны, R-Портфель использует платежные матрицы, средь которых наиболее информативными являются квадратные, т.е. сколько фин. инструментов анализируется, столько примерно и должно быть участков.

Но суть в том, что в отдельных моментах инструменты даже хорошо коррелированные могут менять знаки корреляций. Т.е. если разбивать участки как попало, то есть вероятность, что в анализ могут попасть как раз такие нехорошие моменты с измененными знаками.

Короче говоря, пришел к выводу, что разбивать участки нужно не через равные интервалы (с одинаковым количеством баров), а на экстремумах какого нибудь одного инструмента (например, того, доля которого в портфеле максимальна). Т.е. брать ZigZag или другой алгоритм, обнаруживать точки перелома тенденций и по этим точкам (только на этих барах) скидывать котировки для дальнейшего скармливания R-Портфелю (или другой проге портфельного анализа). Так вроде бы должно получиться наиболее кошерно и максимально информативно. А иначе, получается анализ некоего шума между точками изменений коррекций, например, в боковиках.

Причина обращения: