Нейросети,как их освоить с чего начать? - страница 5

 
meta-trader2007 >>:

Я имею ввиду простой линейный персептрон, подобный тому что применил Решетов. Розенблатт создавал свой персептрон как модель работы мозга), весьма примитивная модель...

Простой линейный персептрон, использованный г-ном Решетовым, устарел больше чем на 40 лет.

Настоящая история нейронных сетей началась именно с персептрона Розенблатта с его функцией активации.

 
TheXpert >>:

Простой линейный персептрон, использованный г-ном Решетовым, устарел больше чем на 40 лет.

Настоящая история нейронных сетей началась именно с персептрона Розенблатта с его функцией активации.

Но его персептрон тож не совершенен. И для прогнозирования направления движения курса не годен.

Т.е. в двух слойных персептронах Розенблатта (сначала он создал их) первый скрытый слой играл роль функции активации?

 
meta-trader2007 >>:

Но его персептрон тож не совершенен. И для прогнозирования направления движения курса не годен.

Т.е. в двух слойных персептронах Розенблатта (сначала он создал их) первый скрытый слой играл роль функции активации?

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


Вот алгоритм простого советника:

Возьмём к примеру простой алгоритм дающий точки входа стоп лоссы и тейк профиты на основе последнего фрактала:

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


Вот код этого советника:

extern double    Lot=0.1;
extern int       Slippage=3; // Проскальзывание
extern int       Magic=1;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
 int i;
 
// Фрактал вверх 
 int iUpFr;   // Номер бара на котором образовался последний фрактал вверх
 double UpFr; // Значение последнего фрактала вверх 

for (i=3;i<Bars;i++){
UpFr=iFractals(NULL,0,MODE_UPPER,i);
  if (UpFr>0){
  iUpFr=i;
  //Print ("UpFr = ", UpFr, ", ", " iUpFr = ", iUpFr);
  break;
  }
}   
// Проверяем прорван-ли найденый фрактал, если он прорван, то по нему не имеет смысла выставлять ордер
bool OkUpFr; // Если false, то прорван, если true, то не прорван
if(UpFr>=High[iHighest(NULL,0,MODE_HIGH,iUpFr,0)]){OkUpFr=true;}

double SellSl=High[iHighest(NULL,0,MODE_HIGH,iUpFr+1,0)]; // Минимальное значение цены от нулевого бара до номера на котором сформировался последний фрактал вверх


// Фрактал вниз
 int iDnFr;   // Номер бара на котором образовался последний фрактал вниз
 double DnFr; // Значение последнего фрактала вниз
 
for (i=3;i<Bars;i++){
DnFr=iFractals(NULL,0,MODE_LOWER,i);
  if (DnFr>0){
  iDnFr=i;
  //Print ("DnFr = ", DnFr, ", ", " iDnFr = ", iDnFr);
  break;
  }
} 
// Проверяем прорван-ли найденый фрактал, если он прорван, то по нему не имеет смысла выставлять ордер
bool OkDnFr; // Если false, то прорван, если true, то не прорван
if(DnFr<=Low[iLowest(NULL,0,MODE_LOW,iDnFr,0)]){OkDnFr=true;}

double BuySl=Low[iLowest(NULL,0,MODE_LOW,iDnFr+1,0)]; // Максимальное значение цены от нулевого бара до номера на котором сформировался последний фрактал вниз
 
 // Параметры ордеров
  double Tick=MarketInfo(Symbol(),MODE_TICKSIZE);
  double spread=MarketInfo(Symbol(),MODE_SPREAD)*Tick;

  double B;
  double Bsl;
  double S;
  double Ssl;    
  double Btp; 
  double Stp; 
  B=NormalizeDouble(UpFr+1*Tick+spread,Digits);      // Цена для покупки
  Bsl=NormalizeDouble(BuySl-1*Tick,Digits);          // Стоп лосс для ордера на покупку
  Btp=NormalizeDouble(B+(B-Bsl),Digits);             // Тейк профит для ордера на покупку
  S=NormalizeDouble(DnFr-1*Tick,Digits);             // Цена для продажи
  Ssl=NormalizeDouble(SellSl+spread+1*Tick,Digits);  // Стоп лосс для ордера на продажу
  Stp=NormalizeDouble(S-(Ssl-S),Digits);             // Тейк профит для ордера на продажу
  
bool Buy; // если Buy==true, значит появились условия для Buy stop
bool Sell;// если Sell==true, значит появились условия для Sell stop

if(OkUpFr==true){Buy=true;}
if(OkDnFr==true){Sell=true;}
 
// Проверка открытых ордеров и выставленых ордеров
int total = OrdersTotal(); // Общее кол-во открытых и отложеных ордеров.
int Ticket = OrderTicket( ); // Возвращает номер тикета для текущего выбранного ордера. 
bool PendingOrderBuy=false;  
bool PendingOrderSell=false;   
bool MarketOrderBuy=false;
bool MarketOrderSell=false;
if(total>0){  
  for(i=0;i<=total;i++){
     if (OrderSelect(i, SELECT_BY_POS)==true){
        if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic){
         double OpenPrice=NormalizeDouble(OrderOpenPrice(),Digits);
         double StopLoss=NormalizeDouble(OrderStopLoss(),Digits);
         double TakeProfit=NormalizeDouble(OrderTakeProfit(),Digits);
         Ticket = OrderTicket( );
           if (OrderType( )==OP_BUY){
           MarketOrderBuy = true;
           }
           if (OrderType( )==OP_SELL){
           MarketOrderSell = true;
           }
           if (OrderType( )==OP_BUYSTOP){
           PendingOrderBuy = true;
           if(OpenPrice!=B) {OrderDelete(Ticket,CLR_NONE);} 
           if(StopLoss!=Bsl){OrderDelete(Ticket,CLR_NONE);}       
           }
           if (OrderType( )==OP_SELLSTOP){
           PendingOrderSell = true;
           if(OpenPrice!=S) {OrderDelete(Ticket,CLR_NONE);} 
           if(StopLoss!=Ssl){OrderDelete(Ticket,CLR_NONE);}    
           }  
        }
     }
  }
} 
// Выставление отложеных ордеров
if(Buy==true && PendingOrderBuy==false && MarketOrderBuy==false){
         Ticket=OrderSend (Symbol(),OP_BUYSTOP,Lot,B,Slippage,Bsl,Btp,NULL,Magic,0,CLR_NONE);
         if(Ticket<0)
         {
         Print("OrderSend failed with error #",GetLastError());
         return(0);
         }
}
if(Sell==true && PendingOrderSell==false && MarketOrderSell==false){
         Ticket=OrderSend (Symbol(),OP_SELLSTOP,Lot,S,Slippage,Ssl,Stp,NULL,Magic,0,CLR_NONE);
         if(Ticket<0)
         {
         Print("OrderSend failed with error #",GetLastError());
         return(0);
         }
}     
//----
   return(0);
  }

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


Параметры, которые могут быть использованы в качестве весов:

Для покупки:
iUpFr
iUpFr-iSellSl
UpFr-SellSl
(UpFr-SellSl)/(iUpFr-iSellSl)
(UpFr-SellSl)/(iUpFr)

Для продажи:
iDnFr
iDnFr-iBuySl
BuySl-DnFr
(BuySl-DnFr)/(iDnFr-iBuySl)
(BuySl-DnFr)/(iDnFr)


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

А сравнение будет происходить в процессе оптимизации?

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



 

Математика нейронных сетей не такая уж сложная. Выбор входных параметров намного важнее для успеха сетевого предсказания. Вопрос здесь таков: какие индикаторы и их параметры полностью описывают состояние рынка на сию минуту и его историю? Зная только несколько последних цен валюты далеко не достаточно чтобы предсказать будующую цену независимо от количества слоев в сети. Поэтому нужно выбирать либо очень много прошлых цен, либо индикаторы разных периодов. В подавляющем большинстве используют индикаторы т.к. они позволяют более эффективно описать положение последней цены к прошлым ценам. Может переключим обсуждение на выбор входных параметров. Мне кажется взаимное отношение последних значений мувов разных периодов может быть хорошим входом сети. У кого другие мнения? Можно ли смешивать разные типы индикаторов, например MACD, RSI, AC, Stoch и т.п, на входе одной и той же сети?

 
gpwr >>:

Можно ли смешивать разные типы индикаторов, например MACD, RSI, AC, Stoch и т.п, на входе одной и той же сети?

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

Хотелось бы найти ответы на эти вопросы.

Быть может практики подскажут, на чем тренируют свои сети? :))

 

Уважаемые участники форума, тема данной ветки - Нейросети,как их освоить с чего начать?

Давайте ближе к теме....

 

Ребзя, дело не в нейросетях - а в способах их применения......

 
Andrey4-min писал(а) >>

Уважаемые участники форума, тема данной ветки - Нейросети,как их освоить с чего начать?

Давайте ближе к теме....

Вот короткое описание forward сетей, которое я иногда цитирую когда возникает подобная тема. Итак, создаём простейшую forward сеть.

Шаг 1: Выбираем входные данные. Например,

x1 = WPR Per1

x2 = WPR Per2

x3 = WPR Per3

Шаг 2: Выбираем количество нейронов в hidden layer - например два нейрона, y1 и y2. Выбираем количество нейронов в выходном уровне - например два нейрона, z1 и z2. Таким образом, у нас создана 3-2-2 сеть. z1 и z2 это наши выходы.

Шаг 3: Задаём логику принятия решений. Например z1>=u покупаем, z1<=-u продаём, z2<=-v закрываем покупку, z2>=v закрываем продажу, где |u|<=1 и |v|<=1.

Шаг 4: Oписываем скрытые нейроны y1=F(x1,x2,x3) и y2=F(x1,x2,x3):

y1 = F(a0+a1*x1+a2*x2+a3*x3)

y2 = F(b0+b1*x1+b2*x2+b3*x3)

где F() - нелинейная функция (activation function). Например, F(x)=tanh(x)=(exp(x)-exp(-x))/(exp(x)+exp(-x)). Я предпочитаю более простую функцию для избежания ошибок при вычислении exp():

F(x) = -1 if x<=-1, x if -1<x<1, 1 if x>=1.

Шаг 5: Oписываем выходные нейроны z1=F(y1,y2) и z2=F(y1,y2):

z1 = F(c0+c1*y1+c2*y2)

z2 = F(d0+d1*y1+d2*y2)

где F() - та же функция активации нейрона.

Итак, сеть создана и описана. Здавайте периоды Per1, Per2 и Per3 для Williamps-Percent-Range (WPR) и оптимизируйте через метадрейдовский бактестер а0, а1, а2, а3, b0, b1, b2, b3, c0, c1, c2, d0, d1, d2, -1<=u<=+1, -1<=v<=+1. Можете также оптимизировать Per1, Per2 и Per3. Можете поиграть с разными входными данными. Например, вместо WPR попробуйте MACD или другой индикатор. Можете ограничиться одним выходным нейроном для открытия позиций: z(y1,y2)>=u покупаем, z(y1,y2)<=-u продаём. А закрываем по стоплоссу, трейлинг стопу или takeprofit.

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

z1(y1,y2)>u1 - открываем лонг

z2(y1,y2)>u2 - открываем шорт

z3(y1,y2)>u3 - закрываем лонг

z4(y1,y2)>u4 - закрываем шорт

В таком случае, количество оптимизируемых коеффициентов увеличивается значительно. Обычно, u1=u2=u3=u4=0.9.

Можно увеличить количество скрытых слоев и нейронов в них если у вас есть мощный компьютер.

 
Andrey4-min писал(а) >>

Уважаемые участники форума, тема данной ветки - Нейросети,как их освоить с чего начать?

Давайте ближе к теме....

Не заморачивайтесь самостоятельным программирование нейросетей, есть готовые програмы. Единственная, программа по которой есть книга на русском языке - Statistica Neural Networks, и притом эта книга производит впечатление, что написана действительно специалистами по нейронным сетям, и имеет вполне приличное введение и обзор методов работы с нейронными сетями и существующих типов нейросетей. Программа позволяет экспортировать обученные сети в виде dll, которыми можнопользоваться в советниках в МТ (правда сам пока не пробовал, если что не так извиняйте). Специализированные тредерские программы с неросетями не так просто к МТ прикрутить, а если можно, то криво или косо или очень дорого. Есть ДЦ с терминалами обеспечивающи экспорт данных в файлы метастока, здесь дегко прикрутить специализированную трейдерску программу для работы с неросетями. Ех! Ну почему бы разработчикам МТ не обеспечить возможность экспорта данных, чтобы можно было пользоваться любыми другим программами теханализа без лишних подпорок.

 

Для начала, имхо, лучшая программа это NeuroShell -2 есть русский хелп и примеры на русском языке. Также, нейросети из NS 2 можно легко прикручивать к советникам и индикаторам в МТ4.

Тут можно почитать: http://www.fxreal.ru/forums/forums.php?forum=3

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