Как найти прибыльную торговую стратегию

Рейтинг материала: 0% от пользователей
Нравится?
Просмотров
90
Комментариев
0
Дата публикации
6 Июнь, 2018
Автор материала
elf
Всего статей:
Всего статей:

Как найти прибыльную торговую стратегию

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

  1. присоединить к окну графика цены финансового инструмента несколько технических индикаторов и выявить закономерности в виде корреляций рынка и сигналов индикаторов;
  2. сформулировать полученные на предыдущем этапе корреляции;
  3. переложить стратегию на соответствующий язык программирования, получив тем самым механическую торговую систему;
  4. прогнать торговую систему через симулятор на исторических данных и попытаться подобрать ее входные параметры, то есть оптимизировать;
  5. если предыдущий этап не дал прироста баланса, то перейти к п. 1;
  6. еогонять полученную на предыдущих этапах систему на демонстрационных счетах с целью ее проверки;
  7. если предыдущий этап не принес прибыли на виртуальных деньгах, то перейти к п. 1;
  8. использовать систему в реальной торговле, время от времени подстраивая ее входные параметры под изменяющиеся условия рынка

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

А что если попробовать весь этот процесс полностью переложить на плечи компьютера? В данной статье будет рассмотрено использование простейшей однослойной нейронной сети для идентификации будущего направления движения котировок по показаниям осциллятора Acceleration/Deceleration (AC).

Как найти прибыльную торговую стратегию

Нейронная сеть

Что такое нейронная сеть или Perceptron? Это алгоритм, использующий уравнение линейного неравенства (линейного фильтра), с помощью которого можно причислить исследуемый объект к тому или иному классу или, наоборот, исключить его из этого самого класса объектов. Само неравенство выглядит так:

w1 * a1 + w2 * a2 + … wn * an > d,

где:

wi — весовой коэффициент с индексом i,

ai — численное значение признака с индексом i исследуемого объекта,

d — пороговое значение, чаще всего равное 0.

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

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

Дело в том, что геометрически плоскость описывается линейным уравнением. Например, в трехмерном пространстве уравнение плоскости относительно координат X, Y и Z имеет вид:

A * X + B * Y + C * Z + D = 0

Координаты всех точек, расположенных по одну сторону от плоскости в этом пространстве, удовлетворяют неравенству:

A * X + B * Y + C * Z + D > 0

А координаты всех точек, лежащих по другую сторону от плоскости, удовлетворяют неравенству:

A * X + B * Y + C * Z + D = 0; i—)

//+------------------------------------------------------------------+
//|                                       ArtificialIntelligence.mq4 |
//|                               Copyright й 2006, Yury V. Reshetov |
//|                                         http://reshetov.xnet.uz/ |
//+------------------------------------------------------------------+
#property copyright "Copyright й 2006, Yury V. Reshetov ICQ:282715499  http://reshetov.xnet.uz/"
#property link      "http://reshetov.xnet.uz/"
//---- input parameters
extern int    x1 = 120;
extern int    x2 = 172;
extern int    x3 = 39;
extern int    x4 = 172;
// StopLoss level
extern double sl = 50;
extern double lots = 0.1;
extern int    MagicNumber = 888;
static int prevtime = 0;
static int spread = 3;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   if(Time[0] == prevtime) 
       return(0);
   prevtime = Time[0];
//----
   if(IsTradeAllowed()) 
     {
       spread = MarketInfo(Symbol(), MODE_SPREAD);
     } 
   else 
     {
       prevtime = Time[1];
       return(0);
     }
   int ticket = -1;
   // check for opened position
   int total = OrdersTotal();   
   for(int i = 0; i < total; i++) 
     {
       OrderSelect(i, SELECT_BY_POS, MODE_TRADES); 
       // check for symbol & magic number
       if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) 
         {
           int prevticket = OrderTicket();
           // long position is opened
           if(OrderType() == OP_BUY) 
             {
               // check profit 
               if(Bid > (OrderStopLoss() + (sl * 2  + spread) * Point)) 
                 {               
                   if(perceptron() < 0) 
                     { 
                       // reverse
                       ticket = OrderSend(Symbol(), OP_SELL, lots * 2, Bid, 3, 
                                          Ask + sl * Point, 0, "AI", MagicNumber, 
                                          0, Red); 
                       Sleep(30000);
                       if(ticket < 0) 
                         {
                           prevtime = Time[1];
                         } 
                       else 
                         {
                           OrderCloseBy(ticket, prevticket, Blue);   
                         }
                     } 
                   else 
                     { 
                       // trailing stop
                       if(!OrderModify(OrderTicket(), OrderOpenPrice(), 
                          Bid - sl * Point, 0, 0, Blue)) 
                         {
                           Sleep(30000);
                           prevtime = Time[1];
                         }
                     }
                 }  
               // short position is opened
             } 
           else 
             {
               // check profit 
               if(Ask < (OrderStopLoss() - (sl * 2 + spread) * Point)) 
                 {
                   if(perceptron() > 0) 
                     { 
                       // reverse
                       ticket = OrderSend(Symbol(), OP_BUY, lots * 2, Ask, 3, 
                                          Bid - sl * Point, 0, "AI", MagicNumber,
                                          0, Blue); 
                       Sleep(30000);
                       if(ticket < 0) 
                         {
                           prevtime = Time[1];
                         } 
                       else 
                         {
                           OrderCloseBy(ticket, prevticket, Blue);   
                         }
                     } 
                   else 
                     { 
                       // trailing stop
                       if(!OrderModify(OrderTicket(), OrderOpenPrice(), 
                          Ask + sl * Point, 0, 0, Blue)) 
                         {
                           Sleep(30000);
                           prevtime = Time[1];
                         }  
                     }
                 }  
             }
           // exit
           return(0);
         }
     }
   // check for long or short position possibility
   if(perceptron() > 0) 
     { 
       //long
       ticket = OrderSend(Symbol(), OP_BUY, lots, Ask, 3, Bid - sl * Point, 0, 
                      "AI", MagicNumber, 0, Blue); 
       if(ticket < 0) 
         {
           Sleep(30000);
           prevtime = Time[1];
         }
     } 
   else 
     { 
       // short
       ticket = OrderSend(Symbol(), OP_SELL, lots, Bid, 3, Ask + sl * Point, 0, 
                      "AI", MagicNumber, 0, Red); 
       if(ticket < 0) 
         {
           Sleep(30000);
           prevtime = Time[1];
         }
     }
//--- exit
   return(0);
  }
//+------------------------------------------------------------------+
//|  The PERCEPRRON - a perceiving and recognizing function          |
//+------------------------------------------------------------------+
double perceptron() 
  {
   double w1 = x1 - 100.0;
   double w2 = x2 - 100.0;
   double w3 = x3 - 100.0;
   double w4 = x4 - 100.0;
   double a1 = iAC(Symbol(), 0, 0);
   double a2 = iAC(Symbol(), 0, 7);
   double a3 = iAC(Symbol(), 0, 14);
   double a4 = iAC(Symbol(), 0, 21);
   return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4);
  }
//+------------------------------------------------------------------+

Осталось только подобрать весовые коэффициенты линейного уравнения разделительной плоскости для нейросети. Запустим тестер стратегий нажатием на клавиши Ctrl + R:

Как найти прибыльную торговую стратегию

Во вкладке Settings выберем модель эмуляции рынка быстрым методом только по ценам открытия (ведь у нас в советнике сигналы считываются только по сформировавшимся барам). Поставим галочки на Recalculate и Optimization. После чего нажмем кнопку Expert properties.

Вкладка Testing:

Как найти прибыльную торговую стратегию

Хорошо, а как же тогда относиться к выводам относительно нейросетей сделанным Д. Катцем и Д. Маккормиком в их книге «Энциклопедия торговых стратегий»?

Во первых существует принцип: доверяй, но проверяй. Так называемая деятельность Д. Катца и Д. Маккормика построена в том ключе, чтобы максимально исключить возможность такой проверки. Попросту антинаучный подход, исключающий репродукцию. Что вполне понятно, когда некие деятели занимаются издательским бизнесом, а не трейдингом. Их задача в том, чтобы удачно продать рукопись, вне всякой зависимости от содержимого. Чтобы разобраться в этом, достаточно понять, по какому пути они шли, дабы создать набор макулатуры, написанный в стиле «500 бесполезных советов» вперемежку с цифрами. Давайте разбираться.

  • Постановка задачи Д. Катца и Д. Маккормика заключалась в том, чтобы создать некий в природе несуществующий индикатор, а точнее обращенный во времени стохастик с медленным %K, который, по сути, представляет из себя машину времени, то есть берет информацию на 10 баров вперед и по ним выдает свои показания на 10 баров назад. Будь у меня такой индикатор, Билл Гейтс и Джордж Сорос вряд ли бы могли со мной конкурировать;
  • Следующий шаг заключался в том, чтобы взять некие данные и получить по ним предсказания этого самого стохастика с телепатическими способностями. Проще говоря, они ставили уже задачу аппроксимации, то есть зная аргументы функции, получать ее значение. Аппроксимация — это самая что ни на есть подгонка, про которую Катц и Маккормик столь многозначительно с умным видом рассуждают на страницах своего «фолианта»;
  • Не суть важно, как была получена аппроксимация, сколь важно то, что для этой цели нейронные сети в основе своей не пригодны. Гораздо проще было бы выполнить ту же самую задачу, например, через спектральный анализ;
  • Еще хуже нейронные сети ведут себя в задачах интерполяции и экстраполяции, а если брать данные вне репрезентативной выборки, то экстраполяция налицо, когда пытаются вычислить значение, а не принадлежность объекта к какому либо классу;
  • Получив некую аппроксимацию телепатического стохастика, в реализации которой имелись явные погрешности, Катц и Маккормик пошли дальше и по показаниям этого самого «кривого» прибора создали «торговую стратегию», которая должна была еще и интерпретировать показания заведомо неисправного прибора,, а именно, если %K зашкаливает за некие пределы, то вероятно котировки достигли максимума или минимума. После чего вся эта мишура была загнана в механическую торговую систему и, получив на ней статистику и скороспелые выводы, авторы предложили ознакомиться с ними читателей.

Результаты не заставили себя ждать. Если в репрезентативных выборках еще кое что получалось, то вне их вероятность извлечения прибыли сводилась к извлечению только убытков.

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

Впрочем, провал задуманных экспериментов с нейронными сетями был не только у Катца и Маккормика. Первый проект нейронной сети под названием «Перцептрон» не оправдал надежд, которые на него возлагались. У Франкенштейна результат, как и первый блин, вышел комом. Более поздний объективный анализ, того, что могут нейросети и того, что им явно не по зубам, был сделан М. Минским и С. Пейпертом [1]. Поэтому, прежде, чем приступать к решению тех или иных задач на базе нейросетей, постарайтесь не наступать на уже известные грабли:

  1. Постановка задачи не должна содержать телепатических прогнозов на будущее с целью получить точный ответ на вопрос о том, когда и сколько. Следует ограничить решение в виде идентификации ситуации по текущим признакам в виде разделения всего на несколько взаимоисключающих потенциальных ситуаций. Например, если задача о погоде, то не старайтесь узнать, когда с точностью до секунды пойдет дождь и каков будет уровень осадков в миллиметрах. Ограничьтесь прогнозом о потенциальной ситуации в виде перемены погоды в сторону солнечной либо дождливой;
  2. Вырезайте все лишнее «Бритвой Оккама» . Некоторые экспериментаторы полагают, что чем больше слоев у нейросети и чем загогулистей ее функции активации, тем лучше результат. На самом деле, конечно, же таким образом можно более точно провести границу, разделяющую идентифицируемые объекты по их признакам. С этим никто не спорит. Но зачем? Ведь такой подход равносилен построению замков из песка. Если бы граница имела жесткие очертания, неизменные во времени и не зависимые от других обстоятельств, тогда усложнение с целью максимального уточнения имело бы смысл. Но основная часть, задач решаемых с помощью нейросетей, к такому разряду не относится. Финансовые инструменты тоже не стоят на месте. А значит простейшая нейронная сеть с небольшим количеством входов и одним слоем может оказаться более приемлемой, нежели сложнейшая по конструкции «хламида» с одноразовой результативностью.

Вот собственно и все, что я хотел сказать в этой статье.

Новые посты в блогах трейдеров

6 лет назад trend
Падение рынка криптовалют в 2018 г. хуже краха пузыря доткомов
Минус 80% — падение рынка криптовалют в 2018 году оказалось хуже краха пузыря доткомовВ 2000 году падение с пико [...]
6 лет назад trend
Крах идеи крипто-краудфандинга?
Таблица соотношения ТОПа публичных ICO по кол-ву собранных средств к их текущей рыночной стоимости. Занима [...]
6 лет назад trend
График золота после введения ETF. Bitcoin + ETF = ?
...что было с золотом после введения ETF. Да, здесь есть нюансы с временным периодом, значениями и геополитикой. Однако [...]
6 лет назад trend
ICO: несправедливое отношения к простым инвесторам
Сегодня в одном всеми известном чате бурлила дискуссия на тему несправедливого отношения проектов к простым инвесторам. [...]
6 лет назад elf
Некоторые необходимые условия для торговли коррекций
Ситуация по фунту описанная здесь, и дискуссия вокруг нее натолкнула меня на мысль описания на мой взгляд самых необ [...]
6 лет назад elf
Единственный способ дейтрийдинга
Однако даже подходы, использующие тренд, которые хорошо работают на временных промежутках от средней до большой длител [...]
Смотреть все

Написать отзыв, комментарий

Оценить статью и написать комментарий

Авторизация
*
*
Генерация пароля
Сравнить