English Русский 中文 Español Deutsch Português 한국어 Français Italiano Türkçe
トレード戦略の統計的実行

トレード戦略の統計的実行

MetaTrader 5トレーディング | 27 10月 2015, 11:01
629 0
Ruslan Lunev
Ruslan Lunev

経済規制

アダム・スミスの理論はその著書『国富論』[1]で次のように説明しています。すべての経済プロセスが自動的にこのように最適な状態でそれらを維持し、需要と供給の力を使用して市場経済によって規制されている。

ただ残念ながら現実は別のことを示しています。マーケットの需要と供給はしばしば歪んだ財務関係に導き、経済危機をもたらします。

経済的不均衡の影響を減らすため、政府政策者はマーケット経済を助けることに関与します。

政府政策者の目的は以下によって経済プロセスを間接的に管理することです。

  • 銀行支払準備金、すなわち集積された保険資金
  • 輸出入割当て
  • 世界的競争を自立して勝ち残れない特定経済分野の支援
  • 金利の調整

金利

金利は政府レベルで経済プロセスを管理するために中央銀行によって利用されます。

  • 基準割引率(ODR)は政府経済政策のもっとも効果的なツールです。これは中央銀行が商業銀行に対して融資をするにあたり請求する利率です。
  • レポ・レートは商業銀行から公債を買い戻す中央銀行によって利用されます。
  • 「ファンド金利」は積立金利です。
  • ロンバードレートは 担保によって引き受けられるローンに対して課される利率です。


管理経済


「自由」市場の時代に生きることに幻想を抱かないことです。アダム・スミスの考えはユートピアどころではありません。マーケット参加者は自己責任により危険を覚悟で経済プロセスを管理する必要はありません。そして、商業的理由により反市場的なものに投資しがちです。それはたとえば以下です。

  • 麻薬密売への投資結果は人口の半分は再起不能となり犯罪率が高まります。
  • バブル投資結果、財政は経済的生産、また商品消費の一部となるため停止し、代わりに宝くじ詐欺の一部となります。そのような投資は最終的には人口の大半の貯蓄を失うことになります。
  • デリバティブへの投資デリバティブはマーケットの需要と供給に対する不安定要因の役目をし、大規模な経済変化、端から端まで世界的な危機に導きます。

われわれは管理経済の時代を生きているのです。経済プロセスが政府によって直接管理されるところで確実に計画されているわけではありませんが、それでも管理されているのです。


基準割引率

特定国の「中央銀行」によって設定される歩合は主要な投資要因です。それは投資家に指標を与えます。特に海外投資家に対してです。特定の国の通貨や国債で貯蓄額が守られたらその割合の収益を得るのです。割引率が高いほど金利は高くなります。

中央銀行は国家経済を管理するために基準割引率を利用します。すなわち、率を上げることで投資家を牽きつける、または経済が加熱した場合は率を引き下げるのです。

とはいうものの幻想にひたってはいけません。高い基準割引率は通貨の魅力を必ずしも増大するわけではありません。投資家が考慮する重大な要因が他にもあります。それはインフレです。インフレ率が基準割引率を大きくしのぐようなら、そんな経済に投資する意味はありません。

たとえば、ジンバブエの「中央銀行」がかつて基準割引率を 950% まで増やしました。投資家はただ怖れました。その国の紙幣印刷処理がインフレに追いつかず、紙幣印刷用紙の方が額面価値よりも高くなってしまったのです。

低い基準割引率が低いからといって必ずしも実際の経済が加熱しているとは限りませんが、バブル蔓延のきっかけだというのはよくあることです。


キャリートレード戦略

「キャリートレード」はポジティブスワップに基づく収益を生む戦略です。

通貨ペアをトレードするとき、基準割引率は購入する通貨の割引率と売却する通貨の割引率の差、すなわちスワップに変換されます。よってその差は購入、または売却に対してマイナスになる場合もあります。ポジティブスワップを基に資金を得ること、特にレバレッジを与えられることはトレーダーにとっては魅力あることです。ただし、レバレッジは両刃の剣です。オープンポジションとは逆の方向に価格が変動し始めると、損失は将来の見込み収益を越え、マージンこーづに至ることになります。よって1種類の通貨ペアをトレードするのにスワップを基に資金を得ることはリクスの高い冒険です。

キャリートレードにはいくらか確かなメリットがあります。低い振幅のトレーディング戦略には、高い振幅のトレードに伴う問題はありません。つねにトレーディングシグナルを監視する必要や接続不良などです。VPS ホストは不要です。ときどきただ統計を監視し、ニュースを追う必要があります。

本稿は、オープンポジションの方向とは逆に動く価格の潜在的リスクを補うことができるキャリートレード保護戦略のバリアントを提供します。

統計的キャリートレード戦略は複数通貨戦略です。2組み以上の通貨ペアを対象とし、相互関係により望まない価格動向による潜在的損失を補うためです。ただし、ネガティブに相関している金融商品によってブロックされている場合でも徐々に資金上で収益を増やすという方法で取り入れられます。


統計的キャリートレードの数学

統計的キャリートレードは次の仮定に基づいています。

  1. 通貨ペアに対する価格はポジティブスワップ方向に動く。
  2. 2組以上の通貨ペアが1種類の流動の激しい通貨に関しクオートされていたら、その相関関係はポジティブである。価格変動はその結果として逆方向でポジティブな相関ポジションによってキャンセルされることがある。

ただ仮定は決まったルールとして扱われるわけではありません。上記2点は統計的方法を用いて証明する必要がある仮定にすぎません。ポジティブスワップに関わらず、大半の投資家がなんらかの理由で基本要因に基づく異なる意見を持ったり、リスクを避けたがったりすることはありえます。

キャリートレード保護戦略のバリアントはお互いに望ましくない価格を相殺する複数通貨ペアを対象とするため、履歴データを利用するクオートプロセスの統計的分析はひじょうに綿密である必要があります。

n 通貨ペアを対象とするごくシンプルなケースでは、クオートプロセスの統計モデルは次のような一次方程式です。

v1 * d1 + v2 * d2 + …  + vn * dn  = 収益

ここで

n は金融商品のトータル数です。
v1, v2, …, vn は対応するインスツルメントがオープンしているポジションのボリュームです。ボリューム値がマイナスであれば、ショートポジションがオープンしています。
d1, d2, …, dn は一インスツルメントに対してトレーディングをしたある1日の平均価格変動です。
収益はトレーディングをしたある1日の平均収益です。

2種類のインスツルメントに対して簡略化すれば式は短くなります。
v1 * d1 + v2 * d2 = 収益

変形します。
d1  =  (-v2 * d2 + 収益) / v1

この場合、次のように仮定すると
v1 = 1
y = d1
a = -v2
b = 収益
引数1つと未知数2つの一般的な一次方程式となります。
y = a * x + b

未知数 a および b は一般的な最小二乗法を用いて計算することができます。

そのあと、スワップを使用して収益サイズを指定し、トレーディンをしたある1日の潜在的収益の最終結果を取得します。
b’ = b – スワップ1 + a * スワップ2


ここで

スワップ1、スワップ2 は適切なオープンポジション方向に対するトレーディンを行ったある1日について計算された通貨ペアのスワップです。


本稿で説明しているアルゴリズム戦略は次の2つの条件が同時に満たされていることを前提としています。

  1. 通貨ペアのボリュームと方向は、平均的にそれらに収益性があるように選択されている。
  2. 戦略に関わる全通貨ペアのスワップはポジティブである。

上記条件に従った最後の式を使用した別の検証は不要です。


例証

なぜ式に y = a * x + b, b = 収益 とあるのでしょうか?

計算例


識別子 y および x で表示される2組の通貨ペアの日次価格変動が次の式で表記されるとします。

y = 2 * x + 1

それを似た式に変換します。
y – 2 * x = 1


最初のインスツルメントではロングポジション(プラス記号)とショートポジション(マイナス記号)をオープンする必要があり、二番目のインスツルメントではサイズは最初のポジションの2倍(a = 2 なので)となります。

われわれの例では現在インスツルメント価格は 10 と 8 です。

二番目の銘柄の価格がトレーディングした1日中に1上がったとします。すはわち 9 になったということです。その結果、最初のインスツルメントの価格は平均 2 * x + 1 = 2 * 1 + 1 = 3 変動し、13 (両インスツルメントの価格が同時に上がりました。なぜなら相関関係がポジティブだからです)に到達します。二番目のインスツルメントのポジションがショートなので、その損失は 2 となり、一方最初のロングポジションのインスツルメントは 3 を獲得します。差、すなわち収益は +1です。

続き次のトレーディング日、二番目のインスツルメント価格が1 減り、以前の値 8 に戻ったとします。最初のインスツルメント価格はこの場合、同じく 2 * x + 1 = 2 * -1 + 1 = -1 下がり12 となります。結果計算:最初のインスツルメントには 1 の損失、二番目のインスツルメントには 2 の収益です。最終結果はまたもや +1 です。これは、方向および価格変動範囲に関わらず、それでも平均的に式で指定し、識別子 bで示される金額の収益を得るであろう、ということです。

一次方程式の形の式を知ることで2つのファイナンシャルインスツルメントの相関関係でのオープンポジションの方向とボリュームを判断することができます。そうして価格方向にかかわらず平均収益を得ることができるのです。


ただ式は最小二乗法で計算される、すなわち、統計的方法に続いて履歴データを用いるのであまり興奮しないことです。将来のそれ以上の収益は保証されません。統計が必要なのは、選択したマーケットに入る方向が履歴データを利用するときおよびトレーディングを実行するとき双方で収益性があることを確認するためです。将来なにかI計算に基づいて期待するようにいかないことがあって、も、スワップ差から利益を得るのです。

実装

手動計算には労力を使いすぎるので、最小二乗法を Expert Advisor に割り当てる方がよいでしょう。

Expert Advisor は 2 つのファイナンシャルインスツルメントについてポジション方向とボリュームを計算し、平均収益を得るようにします。それからサーバーに対して選択されたオープンポジションの方向についてスワップボリューム情報を提供します。そしてどちらのスワップボリュームもプラスであればそのインスツルメントを推奨します。

以下は Expert Advisor のソースコードです。

//+------------------------------------------------------------------+
//|                                        StatisticCarryTrading.mq5 |
//|                                  Copyright 2012, Ruslan V. Lunev |
//|                              https://www.mql5.com/ru/articles/491 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, Ruslan V. Lunev"
#property link      "https://www.mql5.com/ru/articles/491"
#property version   "1.00"

// Second currency pair
input string secondpair="AUDUSD";
// Statistics collection period in bars
input int p=100;


// Arrays for storing historical opening prices
double open0[];
double open1[];

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   // Reading the time series of opening prices
   // for the currency pairs involved
   CopyOpen(_Symbol,PERIOD_D1,0,p+1,open0);
   ArraySetAsSeries(open0,true);
   CopyOpen(secondpair,PERIOD_D1,0,p+1,open1);
   ArraySetAsSeries(open1,true);

   int i=0;

   double pp=p;

   double s1 = 0;
   double s2 = 0;
   double s3 = 0;
   double s4=open1[0]-open1[p];
   double s5=open0[0]-open0[p];

   double averagex = s4 / pp;
   double averagey = s5 / pp;

   for(i=0; i<p; i++) 
     {
      double x0 = open1[i] - open1[i + 1];
      double y0 = open0[i] - open0[i + 1];
      double x1 = x0 - averagex;
      double y1 = y0 - averagey;
      s1 = s1 + x1 * x1;
      s2 = s2 + y1 * y1;
      s3 = s3 + x1 * y1;
     }
   
   // Pearson's linear correlation coefficient
   double r=s3/MathSqrt(s1*s2);

   // Calculation of proportions of opening positions sizes given the contract sizes
   double a = signum(r) * SymbolInfoDouble(_Symbol, SYMBOL_TRADE_CONTRACT_SIZE) * MathSqrt(s2) 
   / (MathSqrt(s1) * SymbolInfoDouble(secondpair, SYMBOL_TRADE_CONTRACT_SIZE));
   
   // Calculation of the average daily profit
   double b = averagey - averagex * a;

   // Derive the resulting formula of joint price movement
   if(b>0) 
     {
      Print(_Symbol+" = ",a," * "+secondpair+" + ",b);
        } else {
      Print(_Symbol+" = ",a," * "+secondpair+" - ",MathAbs(b));
     }

   a=-a*signum(b);

   // Recommendations
   string recomendation="Buy "+_Symbol;

   if(b<0) 
     {
      recomendation="Sell "+_Symbol;
      if(SymbolInfoDouble(_Symbol,SYMBOL_SWAP_SHORT)<0.0) 
        {
         recomendation="Short positions swap in "+_Symbol+" is negative";
         MessageBox(recomendation,"Not recommended",1);
         return(0);
        }
        } else {
      if(SymbolInfoDouble(_Symbol,SYMBOL_SWAP_LONG)<0.0) 
        {
         recomendation="Long positions swap in "+_Symbol+" is negative";
         MessageBox(recomendation,"Not recommended",1);
         return(0);
        }
     }

   if(a<0) 
     {
      recomendation=recomendation+"\r\nSell "+a+" "+secondpair;
      if(SymbolInfoDouble(secondpair,SYMBOL_SWAP_SHORT)<0.0) 
        {
         recomendation="Short positions swap in "+secondpair+" is negative";
         MessageBox(recomendation,"Not recommended",1);
         return(0);
        }
        } else {
      recomendation=recomendation+"\r\nBuy "+a+" "+secondpair;
      if(SymbolInfoDouble(secondpair,SYMBOL_SWAP_LONG)<0.0) 
        {
         recomendation="Long positions swap in "+secondpair+" is negative";
         MessageBox(recomendation,"Not recommended",1);
         return(0);
        }
     }

   double profit=MathAbs(b)/SymbolInfoDouble(_Symbol,SYMBOL_POINT);

   if((SymbolInfoInteger(_Symbol,SYMBOL_DIGITS)==5) || (SymbolInfoInteger(_Symbol,SYMBOL_DIGITS)==3)) 
     {
      profit=profit/10;
     }

   recomendation = recomendation + "\r\nCorrelation coefficient: " + r;
   recomendation = recomendation + "\r\nAverage daily profit: "
   + profit + " points";


   MessageBox(recomendation,"Recommendation",1);

   return(0);
  }

// Step function - Signum
double signum(double x) 
  {
   if(x<0.0) 
     {
      return(-1.0);
     }
   if(x==0.0) 
     {
      return(0);
     }
   return(1.0);
  }
//+-----------------------The End ------------------------

Expert Advisor は入力パラメータを2つ持ちます。

  • p は計算に必要な統計情報をすべて提供する日次バーの期間です。このパラメータ値が、第一、第二の通貨ペアとして指定されている通過を持つ国の中央銀行によって行われた基準割引率の直近の変更時の値を越えないことが望まれます。
  • secondpair は二番目のファイナンシャルインスツルメントです。最初のファイナンシャルインスツルメントは Expert Advisor がアタッチされているチャートの通貨ペアです。二番目のペアはポイント計算に使用する通貨が最初の通貨のポイント(通貨ペア識別子の最後の3文字)と一致するように選択します。たとえば、EURUSD と AUDUSD、または GBPJPY と NZDJPYなどです。二番目のペアを選択する前に、契約仕様をチェックしてそれがプラスのスワップであることを確認します。


Expert Advisor は D1 時間枠で実行している最初の通貨ペアのチャートにアタッチする必要があります。また二番目の通貨ペアは入力パラメータで指定する必要があります。

このあと入力パラメータに設定したバー 'p' 数に対して計算が行われ、推奨が表示されます。

与えられた推奨インスツルメントがトレーダーの意向に沿うものであれば、 Expert Advisorから指示される方向とボリュームに忠実に手動でポジションをオープンします。その後、Expert Advisor をチャートから消去する必要はありません。採用された戦略は低頻度戦略で端末が常にサーバーに接続される必要はないからです。代わりに Expert Advisor が端末にアクセスするたび、前と同じ推奨をするか、仲介会社のスワップレート変更に応じまたは履歴データに基づく統計に応じ、『推奨されません』メッセージを表示します。それによりトレーダーはすぐさま前回戦略を変更しすでに発注済みトレーディングをすべてクローズします。


警告

ファイナンシャルインスツルメントは時間依存ではなく、その統計的パラメータは時間の経過とともに変化します。統計を利用したこの戦略にのっとって計算されたボリューム値と通貨ペア方向は予測されませんが、ある程度、プラスの基準割引率の方向に価格が動いているという仮定を裏付けます。逆方向の通貨ペアの相互相関によって相殺されたとしても、です。それは高い基準割引率の通貨に対する統計的に裏付けられるマーケット需要があるということです。


参照資料

  1. Smith, А., An Inquiry of the Nature and Causes of the Wealth of Nations. — М.: Eksmo, 2007. — (Series: The Anthology of Economic Thought) — 960 p. — ISBN 978-5-699-18389-0

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

添付されたファイル |
標準ライブラリのトレーディングストラテジークラスの探求- ストラテジーのカスタマイズ 標準ライブラリのトレーディングストラテジークラスの探求- ストラテジーのカスタマイズ
この記事では、トレーディングストラテジークラスの標準ライブラリをどのように探求していくか、そして、カスタムストラテジーやフィルター/シグナルをMQL5ウィザードのパターン・モデルロジックを用いてどのように追加するかについて紹介したいと思います。最終的に、MetaTrader5の標準インジケーターを用いて独自の戦略を追加できるようになり、MQL5ウィザードがシンプルで強力なコードや、機能的なエキスパートアドバイザーを作成できるようになります。
ニューラルネットワーク:理論~実践 ニューラルネットワーク:理論~実践
今日、トレーダーはだれしもニューラルネットワークについて聞いたことがあり、それを使うのがかっこいいということがわかっています。多数の人がニューラルネットワークを利用してディールを行える人はスーパーヒューマンだと思っています。本稿ではニューラルネットワークのアーキテクチャを説明し、アプリケーションについて記述し、実用例を示していこうと思います。
MetaTrader モバイル端末におけるMetaQuotes ID MetaTrader モバイル端末におけるMetaQuotes ID
Android や iOS を備えたデバイスにより、われわれが知りもしない数多くの機能が提供されています。こういった機能のひとつは、どんな電話番号であろうと、モバイルネットワーク提供会社がどこであっても個人的なメッセージを受け取ることのできるプッシュ通知です。MetaTrader モバイル端末ではすでに売買ロボットからそういうメッセージを受信することが可能となっています。それにはご自身の MetaQuotes ID を知るだけでよいのです。9,000,000 以上のモバイル端末がすでにその機能を利用しています。
MetaTraderのマーケットからトレードロボットを購入し、インストールする方法 MetaTraderのマーケットからトレードロボットを購入し、インストールする方法
メタトレーダーのプロダクトは、mql5.com のウェブサイト上またはMetaTrader4,MetaTrader5から直接買うことができます。 希望のお支払い方法を選択して、トレーディングスタイルに合ったプロダクトをお選びいただき、アクティベートしてください。