Reti neurali, come padroneggiarle, da dove cominciare? - pagina 5

 
meta-trader2007 >> :

Intendo un semplice perseptron lineare, come quello usato da Reshetov. Rosenblatt ha creato il suo perseptron come modello di funzionamento del cervello), un modello molto primitivo...

Il semplice perseptron lineare utilizzato dal signor Reshetov è più di 40 anni fa.

La vera storia delle reti neurali è iniziata con il perseptron di Rosenblatt con la sua funzione di attivazione.

 
TheXpert >> :

Il semplice perseptron lineare utilizzato dal signor Reshetov è più di 40 anni fa.

La vera storia delle reti neurali è iniziata con il perseptron di Rosenblatt con la sua funzione di attivazione.

Ma anche il suo perseptron non è perfetto. E non è bravo a prevedere la direzione della rotta.

Quindi nei perseptron a due strati di Rosenblatt (li ha creati lui per primo), il primo strato nascosto svolgeva il ruolo di una funzione di attivazione?

 
meta-trader2007 >> :

Ma anche il suo perseptron non è perfetto. E non è adatto a prevedere la direzione della rotta.

Cioè nei perseptrons a due strati di Rosenblatt (li ha creati lui per primo) il primo strato nascosto giocava il ruolo di una funzione di attivazione?

Sto seguendo l'argomento, ma tu stai parlando di questioni più alte, dovremmo almeno capire come fare qualcosa di semplice...


Ecco un algoritmo di un semplice Expert Advisor:

Prendiamo per esempio un semplice algoritmo che dà punti di entrata con stop loss e take profit basati sull'ultimo frattale:

Se abbiamo un frattale verso l'alto, mettiamo un ordine Buy Stop per una rottura del frattale, con uno stop loss sotto il prezzo minimo tra le barre da zero alla barra in cui si è formato il frattale. Il take profit è uguale allo stop loss.


Ecco il codice di questo Expert Advisor:

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

In questo algoritmo, è possibile selezionare diversi punti di ancoraggio, sulla base dei quali il modello frattale sarà misurato:


Parametri che possono essere usati come pesi:

Per comprare:
iUpFr
iUpFr-iSellSl
UpFr-SellSl
(UpFr-SellSl)/(iUpFr-iSellSl)
(UpFr-SellSl)/(iUpFr)

Per vendere:
iDnFr
iDnFr-iBuySl
BuySl-DnFr
(BuySl-DnFr)/(iDnFr-iBuySl)
(BuySl-DnFr)/(iDnFr)


Ho capito bene che il prossimo passo della creazione della rete neurale sarà l'introduzione di variabili che saranno confrontate con queste proprietà?

E il confronto avverrà durante l'ottimizzazione?

Se mi sbaglio, quali ulteriori passi pratici devo fare per imbullonare questo EA, una semplice rete neurale?



 

La matematica delle reti neurali non è così complicata. La scelta dei parametri di input è molto più importante per il successo della previsione della rete. La domanda qui è: quali indicatori e i loro parametri descrivono completamente lo stato attuale del mercato e la sua storia? Conoscere solo alcuni prezzi passati di una valuta è tutt'altro che sufficiente per prevedere il prezzo futuro, non importa quanti strati ci siano nella rete. Per questo devi scegliere o molti prezzi passati o indicatori di diversi periodi. La stragrande maggioranza usa gli indicatori perché permettono un modo più efficiente di descrivere la posizione dell'ultimo prezzo rispetto ai prezzi passati. Forse dovremmo cambiare la discussione sulla selezione dei parametri di input. Penso che la correlazione dei valori recenti dei muvi di diversi periodi possa essere un buon input per la rete. Chi ha un'opinione diversa? Si possono mescolare diversi tipi di indicatori, ad esempio MACD, RSI, AC, Stoch, ecc. sull'ingresso della stessa rete?

 
gpwr >> :

Si possono mescolare diversi tipi di indicatori, ad esempio MACD, RSI, AC, Stoch, ecc. sull'ingresso della stessa rete?

Penso che sia possibile, a condizione che l'insieme degli indicatori dia buone entrate nel mercato. Dopo questo abbiamo un'altra domanda difficile - cosa dobbiamo fornire all'output netto durante l'allenamento? Cosa vogliamo? Riconoscere un modello? Prevedere il colore della prossima candela? O forse non uno ma diversi? O forse vogliamo prevedere l'ampiezza del movimento? )))

Vorrei trovare le risposte a queste domande.

Forse i praticanti mi diranno: su cosa addestrano le loro reti? :))

 

Cari membri del forum, l'argomento di questo thread è Reti Neurali, come padroneggiarle, da dove cominciare?

Avviciniamoci all'argomento....

 

Ragazzi, non si tratta di reti neurali - si tratta del modo in cui sono applicate......

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

Cari membri del forum, l'argomento di questo thread è Reti Neurali, come padroneggiarle e da dove iniziare?

Avviciniamoci al soggetto....

Ecco una breve descrizione delle reti in avanti, che a volte cito quando si presenta un argomento simile. Quindi, creiamo una semplice rete in avanti.

Passo 1: Scegliere i dati di input. Per esempio,

x1 = WPR Per1

x2 = WPR Per2

x3 = WPR Per3

Passo 2: Selezionare il numero di neuroni nello strato nascosto, per esempio due neuroni, y1 e y2. Seleziona il numero di neuroni nello strato di uscita, per esempio due neuroni, z1 e z2. Così, abbiamo creato una rete 3-2-2. z1 e z2 sono le nostre uscite.

Passo 3: Impostare la logica della decisione. Per esempio z1>=u comprare, z1<=-u vendere, z2<=-v chiudere comprare, z2>=v chiudere vendere, dove |u|<=1 e |v|<=1.

Passo 4: Descrivere i neuroni nascosti y1=F(x1,x2,x3) e y2=F(x1,x2,x3):

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

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

dove F() è una funzione non lineare. Per esempio, F(x)=tanh(x)=(exp(x)-exp(-x))/(exp(x)+exp(-x)). Preferisco una funzione più semplice per evitare errori nel calcolo di exp():

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

Passo 5: Descrivere i neuroni di uscita z1=F(y1,y2) e z2=F(y1,y2):

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

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

dove F() è la stessa funzione di attivazione del neurone.

Quindi, la rete è stata creata e descritta. Dare i periodi Per1, Per2 e Per3 per Williamps-Percent-Range (WPR) e ottimizzare tramite metadrae batter a0, a1, a2, a3, b0, b1, b2, b3, c0, c1, c2, d0, d1, d2, -1<=u<=+1, -1<=v<=+1. Potete anche ottimizzare Per1, Per2 e Per3. Si può giocare con diversi input. Per esempio, invece del WPR prova il MACD o un altro indicatore. Potete limitarlo a un neurone di uscita per le posizioni di apertura: z(y1,y2)>=u buy, z(y1,y2)<=-u sell. E chiudere con stoploss, trailing stop o takeprofit.

Si può anche creare una rete più complessa in cui ogni decisione commerciale è associata a un neurone di uscita corrispondente. Per esempio, con gli stessi dati di input e gli stessi neuroni nascosti creiamo 4 neuroni di output

z1(y1,y2)>u1 - aperto lungo

z2(y1,y2)>u2 - corto aperto

z3(y1,y2)>u3 - chiudere lungo

z4(y1,y2)>u4 - chiudere corto

In questo caso, il numero di coefficienti ottimizzati aumenta significativamente. Di solito u1=u2=u3=u4=0,9.

Potete aumentare il numero di strati nascosti e di neuroni in essi se avete un computer potente.

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

Cari membri del forum, l'argomento di questo thread è Reti Neurali, come padroneggiarle e da dove iniziare?

Avviciniamoci al soggetto....

Non preoccupatevi di programmare le reti neurali da soli, ci sono programmi già pronti. L'unico programma che ha un libro in russo - Statistica Neural Networks, e questo libro dà l'impressione che sia davvero scritto da esperti in reti neurali, e ha un'introduzione abbastanza decente e una panoramica delle tecniche di reti neurali e dei tipi di reti neurali esistenti. Il programma permette di esportare le reti addestrate come una DLL che può essere utilizzata in MT Expert Advisors (non l'ho provato personalmente però, scusate se mi sbaglio). I programmi specializzati di trader con non reti non sono così facili da attaccare alla MT, e se è possibile, sono storti o molto costosi. Ci sono terminali di broker che esportano i dati in meta file, non è così facile implementare un software specializzato per lavorare con reti non in crescita. Eh! Perché gli sviluppatori di MT non forniscono la possibilità di esportare i dati per poter utilizzare qualsiasi altro programma di analisi finanziaria senza modifiche inutili.

 

Per cominciare, imho, il miglior programma è NeuroShell -2, c'è una helpline russa ed esempi in russo. Inoltre, le reti neurali di NS 2 possono essere facilmente collegate a consulenti esperti e indicatori in MT4.

Potete leggere qui: http://www.fxreal.ru/forums/forums.php?forum=3