English Русский 中文 Español Deutsch Português 한국어 Français Italiano Türkçe
重回帰分析ストラテジージェネレータ兼ストラテジーテスタ

重回帰分析ストラテジージェネレータ兼ストラテジーテスタ

MetaTrader 5トレーディングシステム | 28 10月 2015, 08:37
1 542 0
ArtemGaleev
ArtemGaleev

はじめに

ある知人がForex トレーディングコースに参加したとき、トレーディングシステムを開発する宿題が出たことがありました。一週間それでたいへんな思いをしたあと、その人は、このタスクはおそらく卒業論文を書くより難しいだろうと言いました。そのとき私が提案したのが重回帰分析です。結果、一晩で一から作成したトレーディングシステムは問題なく合格点をもらいました。

重回帰を利用することですばやくインディケータと価格の関係を見つけられるのが成功の秘訣です。見つかった関係で特定の確率レベルのインディケータ値を基にした価格値を予測することができるようになります。最新の統計ソフトウェアではこういった関係を見つける何千というパラメータを同時にフィルターにかけることが可能です。これは産業的な意味で砂利から金をふるいにかけるようなものです。

既製の戦略やストラテジージェネレータは、それぞれインディケータデータを重回帰分析にロードしデータ操作を行うことで作成されます。

本稿では重回帰分析を利用してトレーディング戦略を作成するプロセスをお見せしていきます。


1. ロボトレーダーの開発 - 簡単だ!

前に述べたように一晩で開発されたトレーディングシステムのバックボーンはたった一つの式です。

Reg=22.7+205.2(buf_DeMarker[1]-buf_DeMarker[2])-14619.5*buf_BearsPower[1]+22468.8*buf_BullsPower[1]-139.3*buf_DeMarker[1]-41686*(buf_AC[1]-buf_AC[2])

ここで Reg >0 ならば買い、Reg < 0 ならば売りです。

その式は標準インディケータのデータサンプルを利用する重回帰分析の結果です。EA はこの式を基に作成されました。トレーディング判断を行うコード部分はたった15 行です。完全なソースコードを持つ EA は本稿に添付しています(R_check)。

   //--- checking the price change range
   double price=(mrate[2].close-mrate[1].close)/_Point;


   //--- if the range is big, do not take trades and close the current positions 
   if(price>250 || price<-250)
     {
      ClosePosition();
      return;

     }

   //--- regression equation
   double Reg=22.7+205.2*(buf_DeMarker[1]-buf_DeMarker[2])

                 -14619.5*buf_BearsPower[1]+22468.8*buf_BullsPower[1]
                 -139.3*buf_DeMarker[1]
                 -41686*(buf_AC[1]-buf_AC[2]);


   //--- checking for open positions
   if(myposition.Select(_Symbol)==true) //--- open positions found
     {
      if(myposition.PositionType()==POSITION_TYPE_BUY)

        {
         Buy_opened=true;  // long position (Buy)
        }
      if(myposition.PositionType()==POSITION_TYPE_SELL)
        {
         Sell_opened=true; //--- short position (Sell)

        }
     }

   //--- if an open position follows the trend as predicted by the equation, abstain from doing anything.
   if(Reg>0  &&  Buy_opened==true) return;
   if(Reg<=0 && Sell_opened==true) return;


   //--- if an open position is against the trend as predicted, close the position.
   if(Reg<=0 && Buy_opened==true) ClosePosition();
   if(Reg>0 && Sell_opened==true) ClosePosition();


   //--- opening a position in the direction predicted by the equation. 
   //--- using level 20 to filter the signal.
   if(Reg>20) BuyOrder(1);
   if(Reg<-20) SellOrder(1);

回帰分析のデータサンプルは 2011 年7月1日~2011年8月31日までの2か月間EURUSD H1について収集されました。

図1は EA が作成された対象期間のデータに対するパフォーマンスを示しています。おかしなことに、トレーニングデータではテスターでよくある超過利潤は観測できません。これは最適化ができていない兆しに違いありません。

図1 トレーニング期間中のEA のパフォーマンス

図1 トレーニング期間中のEA のパフォーマンス

図2はテストデータについての EA パフォーマンス結果を示しています(2011年9月1日~11月1日)。 EA がさらに次の2か月間収益性を保つためには、2か月のデータは十分だったようです。それは検証期間に EA が出した収益はトレーニング期間に出したものと同じである、ということです。

図2 検証期間中のEA のパフォーマンス

図2 検証期間中のEA のパフォーマンス

重回帰分析を基に、たいへんシンプルな EA が開発され、トレーニングデータをしのぐ収益を生みました。これで回帰分析はトレーディングシステムを構築する際問題なく適用できそうです。

ただし、回帰分析のリソースは過大評価してはいけません。以下にそのメリットおよびデメリットを述べます。


2. 重回帰分析

重回帰分析の一般的目的は、複数の独立変数と従属変数の間の関係を分析することです。われわれの場合は、インディケータと価格変動値の間の関係分析です。

もっともシンプルな形式では、この式は以下のように表記されます。

価格変動 = a * RSI + b * MACD + с

回帰式は独立変数と従属変数間に相関関係がある場合のみ作成されます。インディケータ値は概して相互関係があるため、インディケータの予測への貢献は、インディケータが分析に追加されたり分析から消去されたりするとかなり多様化します。回帰式はただの数値的依存関係を示すにすぎず、因果関係を説明するものではないことに注意が必要です。係数(a、b)は各独立変数の従属変数との関係における貢献を示しています。

回帰式は変数間の理想的依存関係を表します。ただしこれは Forex では不可能です。予測はつねに現実とは異なるものですから。予測値と観測値の差は残差と言われます。残差の分析により、インディケータと価格の非線形の依存関係を特定することができます。われわれの場合、インディケータと価格の間には非線形依存関係しかないものとします。さいわいにも、回帰分析は線形性からのささいな偏差に影響をうけることはありません。

それは量的パラメータ分析のみに使用されます。遷移値を持たない質的パラメータはこの分析には適しません。

回帰分析はどんなパラメータ数も処理するため、できるだけ多くのパラメータを分析したい誘惑にかられます。しかし、従属変数との相互関係の観測値より独立変数の数が増えると、式がランダムな変動に基づいているにもかかわらず、良い予測値を出してしまう可能性が増えます。

観測数は独立パラメータ数の10~20倍になってしまいます。

ここでの場合、データサンプルに含まれるインディケータ数はサンプルのトレード数の10~20倍となるべきです。そうすると作成された式は信頼性があるとみなされます。第1項で述べたロボトレーダー を基にしたサンプルが作成されました。それにはパラメータ33個と観測値836個が含まれます。結果、パラメータ数は観測数より25倍大きくなっています。この要件は統計では一般的なルールです。それは MetaTrader 5 ストラテジーテスタ最適化ツールにも適用されています。

また、最適化ツールの既定のインディケータ値それぞれは実際には個別のパラメータです。すなわち、10個のインディケータ値を検証するとき、再最適化を避けるため考慮すべき独立パラメータを10個処理しているのです。最適化ツールのレポートはおそらくもうひとつ別のパラメータを含んでいることでしょう。トレードの平均数と最適化されたパラメータの値数です。インディケータ値が10より小さければ、おそらく再最適化が必要でしょう。

もうひとつ配慮すべきことは異常値です。稀ですが大きく影響をすることがら(ここの場合、価格スパイク)が式に見せかけの依存性を追加する可能性があります。たとえば、想定外の出来事に続いてマーケットが数時間相当な変動をするということがあります。今回、テクニカルインディケータ値は予測についてはほとんど重要ではありませんが、マークされた価格変動があるため回帰分析ではかなり重要だとみなされます。よってサンプルデータをフィルターにかけるか、可能な異常値をチェックするとよいでしょう。


3. 自分の戦略を作成する

自身のデータを基に回帰式を作成する方法を見る主要パートに取り組みました。回帰分析の実装は前に述べた判別分析 に似ています。回帰分析には以下が含まれます。

  1. 分析対象データの準備
  2. 準備済みデータから最良変数の選択
  3. 回帰式の取得

重回帰分析は統計データ分析のために生産される数ある最新ソフトウェアの一部です。もっとも利用されるのがStatistica( StatSoft Inc. 社製)およびSPSS(IBM Corporation 社製)です。のちに Statistica 8.0 を利用して回帰分析のアプリケーションについて考察していきます。


3.1. 分析対象データの準備

現在バーのインディケータ値を基に次のバーにおける価格動向が予測できる回帰式を作成しようとしています。

判別分析に使用されたと同様の EA を使用してデータ取集を行います。他の期間とともにインディケータ値を保存するための関数を追加することでその機能性を拡げます。拡張されたパラメータセットは同じインディケータの分析に基づいて戦略分析に使用されますが、別の期間で行います。

Statistica にデータをロードするには以下のストラクチャの CSV ファイルが必要です。変数は列に並べられます。そこでは各列が特定のインディケータに対応しています。行には連続する測定値(ケース)があります。すなわち特定バーのインディケータ値です。別の言い方をすると、ヨコの表見出しにはインディケータが、タテの表見出しには連続バーが含まれます。

分析対象のインディケータは以下です。

われわれのファイルのデータ行には以下が含まれます。

  • 「オープン」と「クローズ」の間の価格変動
  • 以前のバーに観測されたインディケータ値

そして、判っているインディケータ値を基にした将来の価格変動を記述する式を作成します。

絶対インディケータ値から離れて、インディケータ値における変更の方向を見るために絶対値と以前の値の差を保存する必要があります。例にある変数の名前には接頭辞 'd' がつきます。シグナルラインインディケータには、メインとシグナルラインの差、その変動を保存することが必要です。その他期間でインディケータにより収集されたデータ名は '_p'で終わります。

最適化のデモンストレーションには、期間を一つだけ追加し、インディケータの標準期間の長さを2倍にします。また、新規バー時刻と適切な時間値を保存します。インディケータが計算されるバーに対して「オープン」と「クローズ」の差を保存します。これは異常値をフィルターにかけるため必要です。結果、33個のパラメータが分析され、重回帰式を作成します。上記のデータ収集は本稿添付の EA R_collection で実装されています。

terminal_data_directory/MQL5/Files で EA を起動したあとMasterData.CSV ファイルが作成されます。テスターで EA を起動するとき、それは terminal_data_directory/tester/Agent-127.0.0.1-3000/MQL5/Files にあります。取得されたファイルは Statistica で使用することができます。

そのようなファイルの例は MasterDataR.CSV にあります。データは2011年1月3日~2011年11月11日に EURUSD H1 にたいして ストラテジーテスタを用いて収集されました。そして分析では8月と9月のデータだけが使われました。残りのデータは練習用にファイルに保存さています。

Statisticaで .CSV ファイルを開くには以下を行います。

  • Statistica では、メニューに行き、ファイル > 開く、「データファイル」タイプを選択する、と進み .CSV ファイルを開きます。
  • 「テキストファイル インポート ウィンドウ」の「区切り」を出て OK をクリックします。
  • 開かれたウィンドウで下線の項目を有効にします。
  • そこにすでにあってもなくても、忘れずに「小数点」分離文字フィールドで小数点を入れます。

図3 Statistica にファイルをインポートする

図3 Statistica にファイルをインポートする

重回帰分析のために準備されたわれわれのデータを持つ表を取得するために OK をクリックします。Statistica で利用するために取得されたファイル例は MasterDataR.STA にあります。


3.2. インディケータ上での自動選択

回帰分析を実行します(統計 -> 重回帰)。

図4 回帰分析の実行

図4 回帰分析の実行 

開かれたウィンドウで「詳細設定」に進み、マークされた項目を有効にします。「変数」ボタンをクリックします。

最初のフィールドで「従属変数」を選択し、二番目のフィールドで式を作成する元となる「独立変数」を選択します。われわれの場合は、最初のフィールドで「価格」パラメータを選択し、二番目のフィールドでdWPRに対して「価格2」を選択します。

図5 パラメータ選択準備

図5 パラメータ選択準備

「ケース選択」ボタンをクリックします(図5)。

分析に使用するケース(データ行)を選択するウィンドが開きます。図6に表示される項目を有効にします。

図6 ケースの選択

図6 ケースの選択

分析に使用する7月および8月のデータを指定します。これは 3590 ~ 4664 のケースです。ケース数は変数 V0 によって設定されます。異常値、価格スパイクの影響を避けるため、価格ごとにデータのフィルターを追加します。

最終バーの「オープン」と「クローズ」の差が250ポイント以上にならないインディケータ値のみ分析対象とします。分析に選択するケースへのルールをここで指定することで、回帰式作成のためのデータサンプルを設定します。こことパラメータ選択準備用ウィンドウで OK をクリックします(図5)。

自動データ選択法のオプションウィンドウが開きます。「前方段階的」方法を選択します(図7)。

図7 手法選択

図7 手法選択

OK をクリックします。回帰分析は問題なく終了した旨を告げるウィンドウが開きます。

図8 回帰分析結果ウィンドウ

図8 回帰分析結果ウィンドウ

パラメータの自動選択はパラメータ(独立変数)と従属変数間の多重相関に物質的に貢献するものだけを対象とします。われわれの場合は、インディケータセットが選択され、もっともよく価格を判断します。事実上、自動選択はストラテジージェネレータの役を果たします。作成された式は信頼性あるインディケータのみで構成され、価格の動向をもっともよく記述します。

結果ウィンドウの上側(図8)には作成された式の統計的特質があり、一方で式に使用されるパラメータは下側にリストアップされています。下線が施された特性にご注意ください。複数のRは式に関わる価格とインディケータ間の多重相関値です。"p" はそのような相関の統計有意性です。

0.05 より低いレベルは統計的に有意とみなされます。『ケース数』は分析に使用されるケース数です。貢献が統計的に有意なインディケータは赤で表示されています。理想的にはすべてのインディケータが赤でマークされていることです。

分析にパラメータをインクルードするのに Statistica で用いられるルールはかならずしも最適とは限りません。たとえば、有意なパラメータの大きな数字が回帰式に含まれるかもしれません。よってクリエーティビティを発揮してパラメータ選択にあたりプログラムをアシストします。

リストに有意でないパラメータが含まれていたら、「サマリー:回帰結果」をクリックします。

ウィンドウが開き、各インディケータデータを表示します。

図9 パラメータ上のレポートには回帰式が含まれています。

図9 パラメータ上のレポートには回帰式が含まれています。

p レベルの最高値を持つ有意でないパラメータを見つけ、その名前を覚えます。分析にパラメータが含まれているステップまで戻り(図7)、このパラメータを分析のために選択されたパラメータリストから削除します。

戻るには、分析結果ウィンドウで「キャンセル」をクリックし、分析を繰り返します。この方法で有意でないパラメータをすべて除外します。そうするにあたり、取得した多重相関値を探します(複数R)。それは大幅に初期値を下回ってはいけないからです。有意でないパラメータは一つずつまたは一度にすべて分析から除外することができますが、一つずつ除外する方が望ましいでしょう。

結果、表には有意なパラメータだけが含まれています(図10)。相関値は 20% 下がりました。これはおそらく偶発同時計数のためです。無限に長い数字系列は偶発同時計数の無限数をもつことで知られています。

われわれが処理するデータサンプルがきわめて長いため、偶発同時計数とランダムな関係がしばしば問題になります。そのためご自身の戦略では統計的に有意なパラメータを使用することが重要なのです。

図10 式には有意なパラメータのみ含まれます。

図10 式には有意なパラメータのみ含まれます。

パラメータセクションが続けば、有意に価格と相関している複数インディケータのグループは作られず、価格は過去のイベントについてほとんど情報を持たなそうです。テクニカル分析をもとにしたトレードはこのような場合、ひじょうに慎重に行うか、またはすべて停止する必要があります。

われわれの場合、33個のパラメータ中5個だけが回帰式を基にした戦略開発で有効であると証明されました。この回帰分析の式はご自身の戦略に対するインディケータを選択するとき大いに役立ちます。


3.3. 回帰式とその分析

そんなわけで回帰分析を実行し、「正しい」インディケータリストを取得しました。ここでそれをすべて回帰式に変換します。各インディケータに対する式係数は回帰分析結果のB 列に表示されています(図10)。同じ表のインターセプトパラメータは式の自立したメンバーで、独立係数としてそこにインクルードされます。

B 列から係数を取り、表(図10)を基に式を作成します。

価格 = 22.7 + 205.2*dDemarker - 41686.2*dAC - 139.3*DeMarker + 22468.8*Bulls - 14619.5*Bears

この式はMQL5コードとしてこの式を基に開発した EA の「テスター」から取得されたパフォーマンス結果と共に第1項でもすでに書きました。ご覧のように、回帰分析はストラテジーテスタとして使用されているときは適切です。分析は特定の戦略を促進し、提案リストから適切なインディケータを選択しました。

式の安定性をより分析したいと思うなら、次を確認する必要があります。

  • 式の異常値
  • 残差の分布の正規性
  • 式内個別パラメータにより生じる非線形効果

これら確認は残差分析によって実行することができます。分析を進めるには結果ウィンドウ(図8)で OK をクリックします。作成された式に関して上記確認を行ったあと、式が異常値の小さな数字、データの正規分布からの小さな偏差、パラメータの特定の非線形性に敏感でなさそうか確認します。

関係の有意な非線形性があればパラメータは線形化することができます。このために、Statistica は固定の非線形回帰分析を提供します。分析を始めるために、メニューに行き、統計 -> 高度線形/非線形モデル -> 固定非線形回帰 と進みます。通常、行われた確認は重回帰分析が分析されたデータ適量のノイズに敏感でないことを証明しました。


4. 戦略最適化ツールとしての回帰分析

回帰分析は何千というパラメータの処理を可能とすることで、戦略最適化に使用することができます。よって、あるインディケータに対して50の期間を処理する必要があれば、それらは50の個別パラメータとして保存され、一度に回帰分析に送られます。Statistica における表には 65,536 個のパラメータが挙がっています。各インディケータに対して50とおりの期間を処理する場合、 約 1,300 ものインディケータが分析されるのです!これは MetaTrader 5 標準テスターの能力をはるかに超えています。

われわれの例で使用しているデータを同じ方法で最適化します。上の 4.1 項で述べたように、最適化のデモンストレーションをするのに、標準期間の2倍の長さを持つインディケータ値をデータに追加しました。データファイル内ではこれらパラメータ名は '_p'で終わります。われわれのサンプルには今標準期間インディケータを含め、60個のパラメータがあります。3.2 項で説明したステップに続いて、以下のような表(図11)を得ます。

図11 異なる期間でのインディケータ分析結果

図11 異なる期間でのインディケータ分析結果

回帰式は11個のパラメータから成っています。6個は標準期間インディケータから、5個は拡張した期間インディケータからのものです。パラメータの価格との相関関係は四半期ごとに増加します。どちらの期間についてもMACD インディケータのパラメータは式に含まれているようです。

異なる期間に対する同一インディケータ値は回帰分析では異なるパラメータとして扱われるため、式は異なる期間に対するインディケータ値で構成され、コンバインされます。たとえば、分析により RSI(7) 値が価格増と連動しており、RSI(14) 値は価格減と連動しています。「標準テスター」による分析は決してそこまで細かくありません。

拡張された分析(図11)に基づく回帰式は以下です。

価格 = 297 + 173*dDemarker - 65103*dAC - 177*DeMarker + 28553*Bulls_p - 24808*AO - 1057032*dMACDms_p + 2.41*WPR_p - 2.44*Stoch_m_p + 125536*MACDms + 18.65*dRSI_p - 0.768*dCCI

この式が EA にもたらす結果を見ます。図12は回帰分析を適用した、2011年7月1日~9月1日のデータを使用した EA の検証結果を示します。チャートは平滑化され EA はより多くの収益を上げています。

図12 トレーニング期間中のEA のパフォーマンス

図12 トレーニング期間中のEA のパフォーマンス

2011年9月1日~11月1日の検証期間にわたり EA を検証します。収益値チャートは標準期間インディケータだけの EA よりも悪くなっています。作成された式は正規化と内部インディケータの非線形性を確認する必要があります。

非線形性は標準期間インディケータに見られるため、それは拡張期間では重大な意味を持ちます。この場合、式のパフォーマンスはパラメータを線形化することで改善が可能です。どちらの方法も検証期間においてメルトダウンすることはなく、ただ収益を産まないだけでした。これは開発した戦略をかなり安定したものとみなします。

図13 検証期間中のEA のパフォーマンス

図13 検証期間中のEA のパフォーマンス

MQL5 はファイルの1行に64個のパラメータしかサポートしないことに注意が必要です。さまざまな期間に対するインディケータの大規模な分析では Statistica またはMS Excelで作成される表を融合させる必要があります。


おわりに

本稿で紹介した小さな調査は回帰分析が多様なインディケータから価格予測に関してもっとも有意なものを一つ選択する機会を提供することを示しました。また、回帰分析は既定サンプル内で最適なインディケータ期間を検索するのにも使用することができます。

注目すべきは、回帰式は簡単に MQL5 言語に変換され、アプリケーションは高いプログラミング技能を要求するものではないことです。よって、重回帰分析はトレーディング戦略の作成に導入可能なのです。それは、回帰式がトレーディング戦略のバックボーンとしての役目を果たすということです。


MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/349

添付されたファイル |
masterdatar.zip (5271.46 KB)
r_check.mq5 (9.93 KB)
r_collection.mq5 (17.37 KB)
MetaTrader 4へのシグナル提供者としてのMetaTrader 5利用 MetaTrader 4へのシグナル提供者としてのMetaTrader 5利用
MetaTrader 4での実行結果をMetaTrader 5 プラットフォームにおいてトレーディング分析する方法の分析と例本稿では MetaTrader 5でシンプルなシグナルプロバイダーの作成方法とそれを複数クライアント、動作中の MetaTrader 4にも連携する方法を示します。またみなさんの MetaTrader 4 実アカウントにおいて自動売買チャンピオンシップの出場者をフォローする方法を見つけ出します。
初めてのお客様へのアドバイス 初めてのお客様へのアドバイス
有名人の格言ではよくこう言われます。「失敗を恐れる者はなにもなしえない。」怠慢自体が誤りであることを認めなければ、この言葉を語るのは難しいでしょう。しかし、将来の過ちを最小にするために過去の過ち(自分自身または他者の)を分析することは常に可能です。これから、同じ名前のサービスにおけるジョブ実行中に再発生可能性な状況を検証していこうと思います。
MQL5-RPC. MQL5からのリモートプロシージャコール:ウェブサービスアクセスと、利益のためのXML-RPC ATC アナライザー MQL5-RPC. MQL5からのリモートプロシージャコール:ウェブサービスアクセスと、利益のためのXML-RPC ATC アナライザー
この記事は、リモートプロシージャコールを可能にするMQL5-RPCフレームワークを紹介します。XML-RPCの基礎から始め、MQL5の実装、そして、二つの実例を紹介します。最初の例は、外部のウェブサービスを使用するというもので、二つ目は、XML-RPC ATC 2011 Analyzerサービスのクライアントの例です。もし、ATC 2011からの異なる統計の実装や分析方法に興味のある場合、この記事はうってつけだと思います。
ボックスーコックス変換 ボックスーコックス変換
この記事は、読者がボックスーコックス変換について詳しく知ることができることを意図されています。使用方法に関して取り組まれ、ランダムなシーケンスと実際の取引価格での変換率を評価を行うものに関しての例がいくつか提示されています。