ニューラルネットワーク、どう使いこなすか、何から始めるか? - ページ 5

 
TheXpert >> :

レシェトフ氏が使っていた単純なリニアペルセトロンは40年以上も前のものだ。

ニューラルネットワークの本当の歴史は、活性化関数を持つローゼンブラット・ペルセプトロンから始まった。

しかし、彼のペルセプトロンも完璧ではありません。しかも、コースの方向を予測するのは苦手です。

では、ローゼンブラットの2層ペルセプトロン(彼が最初に作った)では、第1隠れ層が活性化関数の役割を担っていたのですね。

 
meta-trader2007 >> :

しかし、彼のペルセプトロンも完璧ではありません。また、コースの方向性を予測するのにも適していません。

つまり、ローゼンブラットの2層ペルセプトロン(彼が最初に作った)では、第1隠れ層が活性化関数の役割を担っていたのですね。

話題は追っているのですが、高尚なことをおっしゃっていますね。 簡単なことくらいは理解しないと...。


ここでは、簡単なExpert Advisorのアルゴリズムを紹介します。

例えば、最後のフラクタルに基づき、ストップロスやテイクプロフィットのあるエントリーポイントを提供する簡単なアルゴリズムを見てみましょう。

上向きにフラクタルが発生している場合、ゼロからフラクタルが形成されたバーまでのうち、最低価格以下のストップロスで、フラクタル突破の買い逆指値注文を出すのです。テイクプロフィットはストップロスと同額です。


以下は、この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);
  }

このアルゴリズムでは、いくつかのアンカーポイントを選択することができ、それに基づいてフラクタルモデルが測定されます。


重みとして使用できるパラメータ:

買う場合:
iUpFr
iUpFr-iSellSl
UpFr-SellSl
(UpFr-SellSl)/(iUpFr-iSellSl)
(UpFr-SellSl)/(iUpFr)

売る場合:
iDnFr
iDnFr-iBuySl
BuySl-DnFr
(BuySl-DnFr)/(iDnFr-iBuySl)
(BuySl-DnFr)/(iDnFr)


ニューラルネットワーク作成の次のステップは、これらの性質と比較される変数の導入ということでよろしいでしょうか?

また、比較は最適化の際に行われるのでしょうか?

もし私が間違っているなら、このEA、単純なニューラルネットワークをボルトで固定するには、さらにどのような実用的な手順が必要でしょうか?



 

ニューラルネットワークの 数学は、それほど複雑ではない。ネットワーク予測の成功には、入力パラメータの選択の方がはるかに重要である。ここで問題となるのは、どの指標とそのパラメーターが市場の現状と歴史を完全に表しているかということである。ある通貨の過去数回分の価格しか知らないのでは、ネットワークが何層あっても将来の価格を予測することは到底無理である。そのため、過去の価格が多いか、異なる期間の指標を選ばなければならない。直前の価格と過去の価格の位置関係をより効率的に表現できるため、大半はインジケータを使用しています。入力パラメータの選択に議論をすり替えた方がいいのでは?異なる時代のミューブスの最近の値の相関は、ネットワークの良いインプットになり得ると思います。異なる意見を持つ人は?MACD、RSI、AC、Stochなど、異なる種類の指標を同じネットワークの入力に混在させることは可能ですか?

 
gpwr >> :

MACD、RSI、AC、Stochなど、異なる種類の指標を同じネットワークの入力に混在させることは可能ですか?

インジケーターのセットが良いマーケットエントリーをする限りは、できると思います。この後、もう一つ難しい問題が出てきます。学習時にネットの出力に何を与えるべきか?私たちは何を求めているのか?パターンを認識するため?次のキャンドルの色を予測する?あるいは、1つではなく、いくつもあるのでしょうか?それとも、動きの大きさを予測したいのでしょうか?)))

その答えを探したいと思います。

練習生なら教えてくれるかもしれませんが、彼らは何を基準に網を鍛えているのでしょうか?:))

 

フォーラムメンバーの皆様、このスレッドのトピックは、Neural Networks、それをマスターする方法、何から始めればいいのか?

話を近づけよう...。

 

みんな、ニューラルネットワークの問題じゃないんだ、その応用の仕方なんだ......。

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

フォーラムメンバーの皆様、このスレッドのトピックは「ニューラルネットワーク、そもそもどうやって勉強するのか?

話を近づけよう...。

ここで、フォワードネットワークについて簡単に説明します。同じような話題が出たときに、時々引用しています。そこで、簡単なフォワードネットワークを作ってみましょう。

ステップ1:入力データの選択例えば、こんな感じです。

x1 = WPR Per1

x2 = WPR Per2

x3 = WPR Per3

ステップ2:隠れ層のニューロン数、例えばy1とy2の2つのニューロンを選択します。出力層のニューロン数、例えばz1とz2の2つのニューロンを選択します。こうして、3-2-2のネットワークが出来上がりました。z1、z2が出力です。

ステップ3:判定ロジックを設定する。例えば、z1>=u買い、z1<=-u売り、z2<=v寄り買い、z2>=v寄り売り、ここで|u|<=1、|v|<=1>とします。

ステップ4:隠れニューロン 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()は非線形関数である。例えば、F(x)=tanh(x)=(exp(x)-exp(-x))/(exp(x)+exp(-x))である。exp()の計算時にエラーが出ないように、もっとシンプルな関数が良いですね。

F(x) = x<=-1なら-1、-1<x<1ならx、x>=1なら1。

ステップ5:出力ニューロンz1=F(y1,y2)、z2=F(y1,y2)を記述する。

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

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

ここで、F()は同じニューロン活性化関数である。

そこで、ネットワークが作られ、記述されています。Williamps-Percent-Range(WPR)に周期Per1、Per2、Per3を与え、メタドラ打者a0、a1、a2、a3、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 buy, z(y1,y2)<=-u sell というように、ポジションを開くための出力ニューロンを1つに限定することができます。そして、ストップロス、トレーリングストップ、テイクプロフィットでクローズします。

また、より複雑なネットワークを作成し、各取引の決定が対応する出力ニューロンと関連付けられるようにすることもできます。例えば、同じ入力データと隠れニューロンを使って、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 писал(а)>>

フォーラムメンバーの皆様、このスレッドのテーマは「Neural Networks、どう使いこなすか、何から始めるか」です。

もっと近づいてみようか...。

ニューラルネットワークを自分でプログラミングしなくても、既成のプログラムがあります。ロシア語の本がある唯一のプログラム - Statistica Neural Networksですが、この本は本当にニューラルネットワークの専門家が書いたという印象で、ニューラルネットワークの技術や既存のタイプのニューラルネットワークの紹介と概要がかなりきちんと書かれています。このプログラムでは、学習したネットワークをMT Expert Advisorで使用できるDLLとしてエクスポートすることができます(自分で試していないので、間違っていたらすみません)。非ネットワークの専用トレーダープログラムは、MTに装着するのはそう簡単ではないし、装着できたとしても曲者か、非常に高価なものである。データをメタファイルに書き出すブローカー端末もありますが、成長しないネットワークを扱うための専用ソフトを導入するのは、そう簡単なことではありません。え!?なぜ、MTの開発者は、不必要な変更なしに他の財務分析プログラムを使用できるように、データをエクスポートする可能性を提供しないのでしょうか?

 

手始めに、イミフでは、最高のプログラムはNeuroShell -2であり、ロシア語のヘルプラインとロシア語の例があります。また、NS 2のニューラルネットワークは、MT4のエキスパートアドバイザーやインジケーターに簡単に装着することができます。

こちらからご覧いただけます: http://www.fxreal.ru/forums/forums.php?forum=3

 
nord >> :

しかし、「ベター」は非常に良い結果を出している。それは、適切な使い方をすれば、何かが生き残れるということだ。

ベターさんをはじめとするCHAMPI参加者がNSを使用した2008年の結果から判断すると、彼らのアドバイザーはどのような場所にいたのでしょうか?

2008年に見られたように、チャンピオンシップのリーダーは、あらゆるタイプのアドバイザーですが、NSを持つアドバイザーではありません!

2007年にベターズ氏が撃たれたのは事故ではなかったのか?