Скачать MetaTrader 5

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

4 ноября 2011, 17:11
ArtemGaleev
18
5 122

Введение

Одна из важнейших задач технического анализа – это определить, в каком направлении двинется рынок в ближайшее время. С точки зрения статистики задача сводится к тому, чтобы выбрать индикаторы и определить их значения, на основании которых можно было бы разделить будущее состояние рынка на категории: 1) двинется вверх, 2) двинется вниз.

Одним из способов принятия решения о том, какие индикаторы и какие их значения лучше позволяют различать эти категории, является дискриминантный анализ. Другими словами, дискриминантный анализ дает возможность построить "модель", которая будет предсказать на основе данных от индикаторов - куда двинется рынок.

Однако такой анализ является сравнительно сложным и требует большого количества данных на входе. Поэтому использование его в ручном режиме для анализа движения рынка весьма трудоемко. К счастью, с появлением языка MQL5 и статистических программ появилась возможность автоматизировать действия по сбору, подготовке данных и применению к ним дискриминантного анализа.

В статье предлагается пример создания советника для сбора данных с рынка. Статья является методическим руководством по использованию дискриминантного анализа в программе Statistica для построения прогностических моделей для рынка FOREX.

1. Что же такое - дискриминантный анализ

Дискриминантный анализ (далее ДА) относится к одному из методов распознавания образов. Можно сказать, что нейронные сети являются частным случаем ДА. Большинство успешных военных систем, использующих распознавание образов, используют именно ДА.

ДА позволяет решить задачу о том, какие переменные и как разделяют (дискриминируют) входящий поток данных на группы.

Рассмотрим упрощенный пример использования ДА для рынка FOREX. У нас есть данные по значениям индикаторов Relative Strength Index (RSI), MACD, Relative Vigor Index (RVI). Нужно спрогнозировать  направление, в котором двинется цена. Выполнив ДА, мы в итоге можем получить следующее.

a. Индикатор RVI не помогает делать прогноз. Исключаем его из анализа.

b. ДА выдал два дискриминантных уравнения:

  1. G1 = a1*RSI+b1*MACD+с1, уравнение для случаев, когда цена двинулась вверх;
  2. G2 = a2*RSI+b2*MACD+с2, уравнение для случаев, когда цена двинулась вниз.

Вычисляя значение G1 и G2 в начале каждого бара, мы прогнозируем, что если G1 > G2, то цена двинется вверх; если G1 < G2, то цена двинется вниз.

ДА может быть полезным для начального знакомства с нейронными сетями. При использовании ДА мы получаем уравнения, аналогичные тем, которые рассчитываются для работы нейронных сетей. Это помогает лучше понять внутреннее их устройство, а также предварительно определить, имеет ли смысл использовать нейронные сети в ваших стратегиях.

2. Этапы дискриминантного анализа

Выполнение анализа можно разделить на несколько этапов.

  1. Подготовка данных;
  2. Выбор лучших переменных из подготовленных данных;
  3. Анализ полученной модели и ее проверка на тестовых данных;
  4. Построение модели на основе дискриминантных уравнений.

Дискриминатный анализ включен практически во все современные программные пакеты, предназначенные для статистического анализа данных. Наиболее популярными пакетами являются Statistica (StatSoft Inc.) и SPSS (IBM Corporation).  Далее мы будем рассматривать применение дискриминантного анализа с помощью программы Statistica. Снимки экранов сделаны для версии Statistica 8.0. Примерно также это выглядит и в более ранних версиях программы. Следует заметить, что Statistica содержит также много других полезных инструментов для трейдера, включая нейронные сети.


2.1. Подготовка данных

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

Файл должен быть в формате CSV и иметь следующую структуру. Переменные должны быть расположены в столбик, т.е. каждому столбику соответствует какой-либо один индикатор. В строках должны располагаться последовательные измерения (случаи), т.е. значения индикаторов для конкретных баров. Другими словами, в заголовках таблицы по горизонтали расположены индикаторы, по вертикали последовательные бары.

В таблице должна быть переменная, по которой будет выполняться разделение на группы (группирующая переменная). В нашем случае такая переменная будет основана на изменении цены на следующем баре, идущем за баром для которого были получены значения индикатора. Группирующая переменная должна содержать номер группы, к которой относятся данные, содержащиеся в той же строке. Например, номер 1 для случаев, когда цена пошла вверх, и номер 2 для случаев, когда цена пошла вниз.

Индикаторы, значения которых нам понадобятся:

В функции OnInit() производится создание индикаторов (получение хендлов индикаторов), создание файла MasterData.csv и запись в него заголовка столбцов данных:

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- инициализация индикаторов
   h_AC=iAC(Symbol(),Period());
   h_BearsPower=iBearsPower(Symbol(),Period(),BearsPower_PeriodBears);
   h_BullsPower=iBullsPower(Symbol(),Period(),BullsPower_PeriodBulls);
   h_AO=iAO(Symbol(),Period());
   h_CCI=iCCI(Symbol(),Period(),CCI_PeriodCCI,CCI_Applied);
   h_DeMarker=iDeMarker(Symbol(),Period(),DeM_PeriodDeM);
   h_FrAMA=iFrAMA(Symbol(),Period(),FraMA_PeriodMA,FraMA_Shift,FraMA_Applied);
   h_MACD=iMACD(Symbol(),Period(),MACD_PeriodFast,MACD_PeriodSlow,MACD_PeriodSignal,MACD_Applied);
   h_RSI=iRSI(Symbol(),Period(),RSI_PeriodRSI,RSI_Applied);
   h_RVI=iRVI(Symbol(),Period(),RVI_PeriodRVI);
   h_Stoch=iStochastic(Symbol(),Period(),Stoch_PeriodK,Stoch_PeriodD,Stoch_PeriodSlow,MODE_SMA,Stoch_Applied);
   h_WPR=iWPR(Symbol(),Period(),WPR_PeriodWPR);

   if(h_AC==INVALID_HANDLE || h_BearsPower==INVALID_HANDLE || 
      h_BullsPower==INVALID_HANDLE || h_AO==INVALID_HANDLE || 
      h_CCI==INVALID_HANDLE || h_DeMarker==INVALID_HANDLE || 
      h_FrAMA==INVALID_HANDLE || h_MACD==INVALID_HANDLE || 
      h_RSI==INVALID_HANDLE || h_RVI==INVALID_HANDLE || 
      h_Stoch==INVALID_HANDLE || h_WPR==INVALID_HANDLE)
     {
      Print("Ошибка создания индикаторов");
      return(1);
     }

   ArraySetAsSeries(buf_AC,true);
   ArraySetAsSeries(buf_BearsPower,true);
   ArraySetAsSeries(buf_BullsPower,true);
   ArraySetAsSeries(buf_AO,true);
   ArraySetAsSeries(buf_CCI,true);
   ArraySetAsSeries(buf_DeMarker,true);
   ArraySetAsSeries(buf_FrAMA,true);
   ArraySetAsSeries(buf_MACD_m,true);
   ArraySetAsSeries(buf_MACD_s,true);
   ArraySetAsSeries(buf_RSI,true);
   ArraySetAsSeries(buf_RVI_m,true);
   ArraySetAsSeries(buf_RVI_s,true);
   ArraySetAsSeries(buf_Stoch_m,true);
   ArraySetAsSeries(buf_Stoch_s,true);
   ArraySetAsSeries(buf_WPR,true);


   FileHandle=FileOpen("MasterData2.csv",FILE_ANSI|FILE_WRITE|FILE_CSV|FILE_SHARE_READ,';');
   if(FileHandle!=INVALID_HANDLE)
     {
      Print("FileOpen OK");
      //--- записываем названия переменных в первую строку файла, чтобы удобнее было работать с ним
      FileWrite(FileHandle,"Time","Hour","Price","AC","dAC","Bears","dBears","Bulls","dBulls",
                "AO","dAO","CCI","dCCI","DeMarker","dDeMarker","FrAMA","dFrAMA","MACDm","dMACDm",
                "MACDs","dMACDs","MACDms","dMACDms","RSI","dRSI","RVIm","dRVIm","RVIs","dRVIs",
                "RVIms","dRVIms","Stoch_m","dStoch_m","Stoch_s","dStoch_s","Stoch_ms","dStoch_ms",
                "WPR","dWPR");
     }
   else
     {
      Print("Операция FileOpen неудачна, ошибка ",GetLastError());
      ExpertRemove();
     }
//---
   return(0);
  }

В обработчике события OnTick() производится определение поступления нового бара и сохранение данных в файл.

Движение цены будем определять по последнему сформированному бару, а значения индикаторов берем с предшествующего ему бара. Помимо абсолютного значения индикатора сохраняем его разницу с предыдущим значением, чтобы учитывать направление его изменения. Такие переменные в предложенном примере будут иметь в названии префикс "d".

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

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

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//| Отслеживаем направление рынка и сохраняем значения               |
//| индикаторов в файл в начале каждого нового бара                  |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- объявим статическую переменную типа datetime
   static datetime Prev_time;

//--- будет использована для хранения цен, объемов и спреда каждого бара
   MqlRates mrate[];
   MqlTick tickdata;

   ArraySetAsSeries(mrate,true);    
   
//--- получим последние котировки
   if(!SymbolInfoTick(_Symbol,tickdata))
     {
      Alert("Ошибка обновления котировок - ошибка: ",GetLastError(),"!!");
      return;
     }
///--- копируем данные по 4-м последним барам
   if(CopyRates(_Symbol,_Period,0,4,mrate)<0)
     {
      Alert("Ошибка копирования исторических котировок - ошибка: ",GetLastError(),"!!");
      return;
     }
//--- если оба времени равны, новый бар не появился
   if(Prev_time==mrate[0].time) return;
//--- сохраним время в статической переменной 
   Prev_time=mrate[0].time;
 
//--- заполняем массивы значениями индикаторов
   bool copy_result=true;
   copy_result=copy_result && FillArrayFromBuffer1(buf_AC,h_AC,4);
   copy_result=copy_result && FillArrayFromBuffer1(buf_BearsPower,h_BearsPower,4);
   copy_result=copy_result && FillArrayFromBuffer1(buf_BullsPower,h_BullsPower,4);
   copy_result=copy_result && FillArrayFromBuffer1(buf_AO,h_AO,4);
   copy_result=copy_result && FillArrayFromBuffer1(buf_CCI,h_CCI,4);
   copy_result=copy_result && FillArrayFromBuffer1(buf_DeMarker,h_DeMarker,4);
   copy_result=copy_result && FillArrayFromBuffer1(buf_FrAMA,h_FrAMA,4);
   copy_result=copy_result && FillArraysFromBuffers2(buf_MACD_m,buf_MACD_s,h_MACD,4);
   copy_result=copy_result && FillArrayFromBuffer1(buf_RSI,h_RSI,4);
   copy_result=copy_result && FillArraysFromBuffers2(buf_RVI_m,buf_RVI_s,h_RVI,4);
   copy_result=copy_result && FillArraysFromBuffers2(buf_Stoch_m,buf_Stoch_s,h_Stoch,4);
   copy_result=copy_result && FillArrayFromBuffer1(buf_WPR,h_WPR,4);

//--- проверка корректности копирования всех данных
   if(!copy_result==true)
     {
      Print("Ошибка копирования данных");
      return;
     }

//--- сохраняем в файл направление движения цены на последних двух барах 
//--- и предшедствующие этому значения индикаторов 
   if(FileHandle!=INVALID_HANDLE)
     {
      MqlDateTime tm;
      TimeCurrent(tm);
      uint Result=0;
      Result=FileWrite(FileHandle,TimeToString(TimeCurrent()),tm.hour,// время бара
                       (mrate[1].close-mrate[2].close)/_Point,// разница между ценами закрытия последних двух баров 
                       buf_AC[2],buf_AC[2]-buf_AC[3],// значение индикатора на предыдущем баре и его динамика
                       buf_BearsPower[2],buf_BearsPower[2]-buf_BearsPower[3],
                       buf_BullsPower[2],buf_BullsPower[2]-buf_BullsPower[3],
                       buf_AO[2],buf_AO[2]-buf_AO[3],
                       buf_CCI[2],buf_CCI[2]-buf_CCI[3],
                       buf_DeMarker[2],buf_DeMarker[2]-buf_DeMarker[3],
                       buf_FrAMA[2],buf_FrAMA[2]-buf_FrAMA[3],
                       buf_MACD_m[2],buf_MACD_m[2]-buf_MACD_m[3],
                       buf_MACD_s[2],buf_MACD_s[2]-buf_MACD_s[3],
                       buf_MACD_m[2]-buf_MACD_s[2],buf_MACD_m[2]-buf_MACD_s[2]-buf_MACD_m[3]+buf_MACD_s[3],
                       buf_RSI[2],buf_RSI[2]-buf_RSI[3],
                       buf_RVI_m[2],buf_RVI_m[2]-buf_RVI_m[3],
                       buf_RVI_s[2],buf_RVI_s[2]-buf_RVI_s[3],
                       buf_RVI_m[2]-buf_RVI_s[2],buf_RVI_m[2]-buf_RVI_s[2]-buf_RVI_m[3]+buf_RVI_s[3],
                       buf_Stoch_m[2],buf_Stoch_m[2]-buf_Stoch_m[3],
                       buf_Stoch_s[2],buf_Stoch_s[2]-buf_Stoch_s[3],
                       buf_Stoch_m[2]-buf_Stoch_s[2],buf_Stoch_m[2]-buf_Stoch_s[2]-buf_Stoch_m[3]+buf_Stoch_s[3],
                       buf_WPR[2],buf_WPR[2]-buf_WPR[3]);

      if(Result==0)
        {
         Print("При выполнении FileWrite возникла ошибка ",GetLastError());
         ExpertRemove();
        }
     }

  }

После запуска советника в папке: каталог_данных_терминала/MQL5/Files будет создан файл MasterData.CSV. При запуске советника в тестере он будет располагаться в каталоге каталог_данных_терминала/tester/Agent-127.0.0.1-3000/MQL5/Files. Полученный файл уже можно загрузить в Statistica.

Пример такого файла приложен в файле MasterData.CSV. Данные были собраны при помощи тестера стратегий на EURUSD на участке с 1 августа 2011 по 1 октября 2011 на периоде H1.

Для загрузки файла в Statistica делаем следующее.

  • В Statistica откройте File, потом Open, выберите тип файла: Data files и открывайте наш файл.
  • В окне Text File Import Type оставьте Delimited и нажмите OK. 
  • В открывшемся окне включите подчеркнутые пункты.
  • В поле Decimal separator character нужно обязательно поставить точку независимо от того, есть она там уже или нет.


Рис. 1. Импорт файла в Statistica

Рис. 1. Импорт файла в Statistica

Нажмите OK, получаем таблицу с нашими данными.

Рис. 2. База данных в Statistica

Рис. 2. База данных в Statistica

Теперь создадим группирующую переменную на основе переменной Price.

Определим четыре группы на основании того, куда пошла цена:

  1. Вниз более 200 пунктов;
  2. Вниз менее 200 пунктов;
  3. Вверх менее 200 пунктов;
  4. Вверх более 200 пунктов.

Чтобы добавить новую переменную, щелкните правой кнопкой мыши на заголовке столбика AC и выберите Add Variable.

Рис. 3. Добавление новой переменной

Рис. 3. Добавление новой переменной

В открывшемся окне укажите название для новой переменной Group и добавьте формулу перевода переменной Price в номера групп.

Формула имеет вид:

=iif(v3<=-200;1;0)+iif(v3<0 and v3>-200;2;0)+iif(v3>0 and v3<200;3;0)+iif(v3>=200;4;0)


Рис. 4. Описание для переменной 

Рис. 4. Описание для переменной

Файл готов для выполнения дискриминантного анализа. Пример этого файла приложен в MasterData.STA.


2.2. Выбор лучших переменных

Запустите Дискриминантный анализ (Statistics->Multivariate Exploratory Techniques->Discriminant Analysis).

Рис. 5. Запуск дискриминантного анализа

Рис. 5. Запуск дискриминантного анализа

В открывшемся окне нажмите кнопку Variables.

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

В нашем случае: в первом поле переменная Group, во втором поле выбраны все переменные, полученные от индикаторов и дополнительно переменная Hour (час получения данных).

Рис. 6. Выбор переменных

Рис. 6. Выбор переменных

Нажмите кнопку Select Cases (Рисунок 8). Откроется окно для выбора случаев (строк данных), которые мы будем использовать для дискриминатного анализа. Включите пункты, указанные на следующем снимке (Рисунок 7).

Укажем для анализа только первые 700 случаев. Оставшиеся будем использовать потом для тестирования полученной прогностической модели. Номера случаев задаются через переменную V0. Указав здесь случаи, мы задали выборку обучающих данных для ДА.

Далее нажмите OK.

Рис. 7. Определение обучающей выборки

Рис. 7. Определение обучающей выборки

Теперь выберем группы, для которых мы будем строить прогностическую модель.

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

В нашем примере для исключения выбросов выберем для анализа только группы 2 и 3. Поскольку в группах 1 и 4 произошло значительное изменение цены, то, возможно, там есть и выбросы в значениях индикаторов.

Итак, нажмите кнопку Codes for grouping variable (Рисунок 8). Здесь укажите номера групп, которые мы отправим на анализ.

Рис. 8. Выбор групп для анализа

Рис. 8. Выбор групп для анализа 


Включите пункт Advanced options. Это даст доступ к пошаговому анализу данных (stepwise analysis), который мы будем использовать в дальнейшем.

Далее нажмите OK, чтобы запустить ДА.

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

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


Рис. 9. Сообщение о низком значении толерантности

Рис. 9. Сообщение о низком значении толерантности


Далее откроется окно выбора метода ДА (Рисунок 10). Укажите здесь в выпадающем списке пункт Forward Stepwise (пошаговый анализ с включением). Поскольку значения индикаторов имеют низкую прогностическую значимость, то лучше использовать пошаговый анализ переменных (Stepwise analysis). Тогда модель разделения групп будет автоматически строиться по шагам.

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


Рис. 10. Выбор метода

Рис. 10. Выбор метода

Нажмите OK и откроется окно, информирующее о том, что ДА успешно выполнен.

Рис. 11. Окно результатов ДА

Рис. 11. Окно результатов ДА


Нажав кнопку Summary: Variables in the model, мы увидим список переменных, которые были включены в модель на основе пошагового анализа. Эти переменные наилучшим образом разделяют наши группы. Обратите внимание, что красным цветом выделены переменные, которые разделяют группы с достоверностью более 95% (p<0.05). Достоверность разделения по другим переменным хуже. Допустимо  использовать в модели переменные, разделяющие группу с достоверностью менее 95%.

Однако, «золотое правило» статистики говорит, что следует использовать переменные имеющие достоверность более 95%. Поэтому давайте исключим из анализа переменные, не выделенные красным. Исключим переменные: dBulls, Bulls, FrAMA, Hour. Для этого вернемся к окну, где мы выбрали Пошаговый анализ, и в окне по кнопке Variables исключим эти переменные.

Далее повторим анализ. Вновь открыв по кнопке Summary: Variables in the model, мы увидим, что еще три переменные стали отмечены, как малозначащие. Это: DeMarker, Stoch_s, AO. Также исключим эти переменные из анализа.

В итоге мы получим модель, основанную на переменных, достоверно разделяющих группы (p<0.01).


Рис. 12. Переменные, вошедшие в модель

Рис. 12. Переменные, вошедшие в модель


Таким образом, в нашем примере из 37 переменных было оставлено только семь наиболее значащих для прогноза.

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


2.3. Анализ полученной модели и ее проверка на тестовых данных

После выполнение ДА мы получили прогностическую модель и результат ее использования на обучающих данных.

Чтобы посмотреть модель и успешность разделения групп перейдите на закладку Classification.

Рис. 13. Закладка Classification

Рис. 13. Закладка Classification

Нажмите кнопку Classification matrix, чтобы увидеть таблицу с результатами применения модели к обучающим данным.

В строках указано настоящее количество случаев в каждой группе. В столбиках приведено количество случаев с предсказанной принадлежностью к группам согласно рассчитанной модели. Зеленым цветом я отметил ячейки с правильными предсказаниями и красным с неправильными.

В первом столбике приведена точность предсказания в %.

Рис. 14. Классификация обучающих данных

Рис. 14. Классификация обучающих данных

Точность предсказаний (Total) на обучающей выборке получилась на уровне 60%.

Проверим модель на тестовых данных. Для этого по кнопке Select (Рисунок 13) укажите v0>700, модель будет проверена на диапазоне данных, не использованных для построения модели.

Получилось следующее:


Рис. 15. Классификация тестовых данных

Рис. 15. Классификация тестовых данных

Суммарная точность предсказаний на тестовой выборке получилась тоже на уровне 55%. Это является достаточно хорошим уровнем для рынка FOREX.


2.4. Строим торговую систему

Прогностическая модель в ДА основана на системе линейных уравнений, по которым рассчитывается принадлежность значений показателей к той или иной группе.

Чтобы получить описание этих функций, перейдите на закладку Classification в окне результатов ДА (рисунок 13) и нажмите кнопку Classification functions. Откроется окно с таблицей, содержащей коэффициенты дискриминантных уравнений.

Рис. 16. Дискриминантные уравнения

Рис. 16. Дискриминантные уравнения

На основе таблицы построим систему из двух уравнений:

Group2 = 157.17*AC - 465.64*Bears + 82.24*dBears - 0.006*dCCI + 761.06*dFrAMA + 2418.79*dMACDm + 0.01*dStoch_ms - 1.035
Group3 = 527.11*AC - 641.97*Bears + 271.21*dBears - 0.002*dCCI + 1483.47*dFrAMA - 726.16*dMACDm - 0.034*dStoch_ms - 1.353

Для использования этой модели нужно подставить значения индикаторов в уравнения и вычислить значения Group.

Прогноз будет относиться к той группе, значение Group для которой будет наибольшее. Согласно нашего примеру, если Group2 больше Group3, то предсказывается, что в течение следующего часа ценовой график будет вероятнее двигаться вниз. Обратный прогноз для случая, если Group3 больше Group2.

Необходимо отметить, что для нашего примера показатели индикаторов и период анализа были выбраны сравнительно произвольно. Но даже этих данных было достаточно, чтобы показать возможности и мощность ДА.


Заключение

Дискриминантный анализ является полезным инструментом в приложении к рынку FOREX. Он может быть использован для поиска и проверки оптимального набора переменных, позволяющих относить наблюдаемые значение индикаторов к разным прогнозам. Также он может быть использован для построения прогностических моделей.

Модели, получаемые в результате дискриминантного анализа, могут быть легко встроены в советники, для этого не требуется существенный опыт в программировании. Сам дискриминантный анализ также сравнительно прост в использовании. Представленное пошаговое описание вполне достаточно, чтобы проводить анализ собственных данных.

Подробнее о дискриминантном анализе можно прочитать в электронном учебнике в соответствующем разделе.

Прикрепленные файлы |
masterdata.zip (662.43 KB)
da_demo.mq5 (12.4 KB)
Последние комментарии | Перейти к обсуждению на форуме трейдеров (18)
ArtemGaleev
ArtemGaleev | 13 ноя 2011 в 17:27
Virty:

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

1. Сколько баров, какой валютной пары и какого таймфрейма использовалось для анализа?

2. Как ведут себя коэффициенты если взять совсем другой кусок истории? Как ведут себя коэффициенты если увеличить количество анализируемых баров в 10 раз?

3. Сколько баров нужно минимально взять для ДА чтобы отвергнуть или подтвердить нулевую гипотезу? Есть ли такое количество баров в истории?

4. Насколько верно предположение о том что искомые коэффициенты вечные константы и не меняются со временем?

5. Сколько времени занял ДА на вашем компьютере?

1. EURUSD. В статье указано, что: данные были собраны при помощи тестера стратегий на участке с 1 августа 2011 по 1 октября 2011 на периоде H1. 

2. В примере к статье для обучения использовалось 70% от выборки и 30% для тестирования. На тестовом участке коэффициенты сохранили свою значимость. Насчет других участков - попробуйте сами.

3. Количество баров должно быть, по крайней мере, в 5 раз больше, чем количество индикаторов, тестируемых для построения модели.  Чем больше баров, тем надежнее модель.

4. Возможно, вам удастся найти такие индикаторы и коэффициенты для них :-)  В статье такой цели не ставилось.

5. Речь идет о миллисекундах. 

 

Размышления в комментариях о нулевой гипотезе не относятся к дискриминантному анализу. Faa1947 пишет о регрессионном анализе, что не одно и тоже.

Vasiliy Sokolov
Vasiliy Sokolov | 14 ноя 2011 в 11:19
Еще один способ изощренной подгонки.
Гребенев Вячеслав
Гребенев Вячеслав | 15 ноя 2011 в 12:48
C-4:
Еще один способ изощренной подгонки.

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

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

Нет смыла предлагать и обсуждать инструменты без модели рынка.

ArtemGaleev
ArtemGaleev | 16 ноя 2011 в 19:33
Virty:

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

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

Нет смыла предлагать и обсуждать инструменты без модели рынка.

Упомянутая в комментариях вероятность равенства нулю, не имеет отношения к данной модели :-) 

Вообще, это спор из разряда священных войн (holy war) - работает или нет технический анализ. Кто-то успешно торгует, пользуясь только техническим анализом, другие предпочитают фундаментальный анализ, третьи и то и другое.

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

Гребенев Вячеслав
Гребенев Вячеслав | 17 ноя 2011 в 14:02
ArtemGaleev:

Упомянутая в комментариях вероятность равенства нулю, не имеет отношения к данной модели :-) 

Вообще, это спор из разряда священных войн (holy war) - работает или нет технический анализ. Кто-то успешно торгует, пользуясь только техническим анализом, другие предпочитают фундаментальный анализ, третьи и то и другое.

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

моделей рынка форекс существует множество. Вот некоторые из них: 1. Цена случайно блуждает. 2. Цена есть гладкая функция с добавленным шумом. 3. Иногда в движении цены бывают тренды. 4. Ещё куча моделей из экономики и фундаментального анализа.

Чтобы предсказать поведение системы её устройство можно и не знать. Можно, например, перенести историю системы на будущее. Но вот правило переноса и будет моделью системы.

Интервью с Игорем Корепиным (ATC 2011) Интервью с Игорем Корепиным (ATC 2011)

Советник Игоря Корепина (Xupypr) стремительно взлетел на самую вершину Чемпионата Automated Trading Championship 2011 на четвертой неделе - на его счету было почти вдвое больше, чем у ближайшего преследователя. Однако несмотря на такой внушительный отрыв, советник не смог надолго задержаться на первой строчке. Игорь не скрывает, что при отправке советника на Чемпионат он делал ставку на его удачный старт. Что ж, посмотрим, поможет ли ему удача снова возглавить таблицу участников.

Как создать эксперта за несколько минут при помощи EA Tree: Часть 1 Как создать эксперта за несколько минут при помощи EA Tree: Часть 1

Программа EA Tree является первым инструментом, позволяющим построить код советника на базе блок-схем методом "drag and drop". Создание советников в EA Tree осуществляется путем построения блоков, которые могут содержать функции языка MQL5, технические и пользовательские индикаторы, или численные значения. Выходы блоков могут быть соединены с входами других блоков, образуя "дерево блоков". На базе дерева блоков программа EA Tree генерирует исходный код советника, который затем может быть скомпилирован в торговой платформе MetaTrader 5.

Интервью с Ильнуром Хасановым (aharata) (ATC 2011) Интервью с Ильнуром Хасановым (aharata) (ATC 2011)

Эксперт Ильнура Хасанова (aharata) с третьей недели Чемпионата находится в первой десятке участников Automated Trading Championship 2011, хотя знакомство с форексом состоялось только год назад. Сама идея советника простая, но он содержит элементы самооптимизации, может в этом и кроются секреты его выживаемости? А ведь на Чемпионат был выставлен совсем не тот вариант, который планировался изначально...

Стратегия "Всё или Ничего" на Форексе Стратегия "Всё или Ничего" на Форексе

Цель данной статьи - создание максимально простой торговой стратегии, реализующей игровой принцип "Всё или Ничего". Задача создания прибыльного советника не ставится, цель - увеличение начального депозита в несколько раз с максимально возможной вероятностью. Возможно ли, ничего не зная о техническом анализе и не используя никаких индикаторов, использовать Форекс для получения большого выигрыша против вероятности всё потерять?