ローソク足の動きを予測するための簡単な方法
概論
ローソク足は、オープン、クローズ、最高、最低という価格間の相関関係を示す、一定の期間における価格情報を反映させる手法の1つです。基本的に、ローソク足はテクニカル分析で使われ、よく知られたモデルに従い解釈されます。
市場の動きを予測する為に、いくつかのインディケータを作成した後で、私の中に以前のローソク足の動きについてのデータをベースに、ローソク足の動きを予測することができるかどうかの分析をしようというアイディアが生まれました。
記事では、いくつかの簡単な予測方法が検証されており、またアイディアを検証するためのいくつかのエキスパートアドバイザを提案し、その機能性を評価しています。
注意!記事に添付されているエキスパートアドバイザはテスターでの使用専用です。
1つ目の方法では、次のローソクの動きは、その前のものの動きと一致すると仮定します。2つ目の方法では、次のローソク足の動きは前のものとは逆になると仮定します。これらの方法の良いところは、簡単なところです。これらは、『ナイーブメソッド』のコーナーで検証します。
3つ目の方法は、始めの2つのコンビネーションです。始めは、1つ目か2つ目を選択します。選択された方法が使用され、事実と予測が一致しない場合は(間違いの発見)、他の方法と交換します。この方法は、前の段階で起きた間違いを考慮に入れる為、始めの2つの方法よりも難しいです。したがって、この方法は『適応方法』コーナーで検証していきます。
予測の為の基礎データ
全ての検証される方法は、以前のローソク足の動きについてのデータに基礎を置きます。したがって、一番初めに任意のローソク足の動きの情報を得るための方法を開発する必要があります。
ローソク足のオープン価格とクローズ価格の差の数値をローソク足の動きと名付けましょう。あらゆるローソク足の動きは、「上昇」、「下降」、「動きなし」の3つのうちのいずれかで表します。
OpenとClose配列を介して、ローソク足のオープンとクローズ価格の情報を利用することができます。これらの配列ではインデックスとして、シフトが使用されます。これはチャートの右端から、ゼロから数えられるローソクの番号です。つまり、現在のローソクのシフトはゼロで、前のローソクのシフトは1となります。
// ローソク足の動きを取得 double GetCandleDirection(int shift) { double diff=Close[shift]-Open[shift]; if (diff>0.0) { return (DIRECTION_UP); } else if (diff<0.0) { return (DIRECTION_DOWN); } else /*if (diff==0.0)*/ { return (DIRECTION_NONE); } }
関数にはローソク足のシフト(shift)が引き渡されます。関数はオープン価格とクローズ価格の差を計算し、その後、得られた符号の数に応じて、3つの定数DIRECTION_UP、DIRECTION_DOWN、DIRECTION_NONEのうちの1つの値を返します。これらの定数は、それぞれ『上昇』、『下降』、『動きなし』を意味します。
全ての検証する予測方法は、1つの特別な場合を想定していることを強調しておきます。もし前のローソクの動きが判断できない(GetCandleDirection(1)の呼び出しにDIRECTION_NONEが返ってくる)という場合、次のローソクの予測として、不確定な動きが返されます。この場合、テストの為に作成されたエキスパートアドバイザは、市場へのエントリーを行いませんでした。
様々な動きを示す為に使用される定数値は、反対方向の計算が困難を生じさせないように定義をする必要がある点に留意してください。反対方向を計算する方法のうちの1つとして、符号の置き換えを採用することができます。その場合、これらの定数は次のように定義することができます。
// 可能なローソクの動きの判別 #define DIRECTION_NONE 0 #define DIRECTION_UP 1 #define DIRECTION_DOWN -1
添付ファイルからCandleColor.mq4インディケータを使用し、ローソク足の動きを別個にチャート上に出力します。インディケータはローソク足の動きを反映し(青色と赤色のヒストグラム)、また一定期間のローソクの一般的な傾向を判断することができる単純移動平均も表示します。
時間ごとのローソク足の動き。
インディケータが示すように、入れ替わったり、いくつかのローソク足が続けて等しくなったりと、ローソク足の動きは頻繁にその動向を変えます。1つのローソクの動きを予測することでさえ、簡単な作業ではないことは明らかです。
それでは、提案した方法の詳細な分析と検証に移っていきましょう。
ナイーブメソッド
始めの2つの方法から検証を始めます。
- 次のローソクの動きが、前のローソクの動きと一致する。
- 次のローソクの動きが、前のローソクの動きと逆行する。
2つの方法の有効性をチェックする為、エキスパートアドバイザを作成し(添付ファイル内CandlePredTest_naive.mq4)、テストを行いました。
エキスパートアドバイザは、オープン価格で動作します。新しいバーごとに、エキスパートアドバイザは全てのポジションを閉じ(利益と損失を確定する)、予想される次のローソクの動きに応じてポジションを開きます。次のローソクの動きの予測は、ModelPredict関数が行います。
// 使用するモデルによる予測 int ModelPredict() { if (modelState==STATE_NORMAL) { return (GetCandleDirection(1)); } else /*if (modelState==STATE_REVERSE)*/ { return (-GetCandleDirection(1)); } }
関数は2つの予測方法を実装しています。選択は、modelState変数の値によって行われます。
modelState変数が、STATE_NORMALを得る場合、予測は1番目の方法に沿って行われます。関数が前のローソクの動きを、GetCandleDirection(1)の呼び出しを使って照会し、次のローソクの動きとして返します。
2つ目の予測方法は、modelState変数がSTATE_REVERSEと等しい場合に使用します。こういった場合に予想される反対方向の動きの計算は、符号の置き換えにより実行されます。つまり、ModelPredict関数は-GetCandleDirection(1)を返します。
ModelPredict関数では、2つ目の方法と相応するSTATE_REVERSE定数との明らかな比較はされていません。エキスパートアドバイザのコードでは、ユーザーによって入力されるデータは常に正しく、またmodelState変数は常にSTATE_NORMALまたはSTATE_REVERSEの2つの値うちの1つを取ると想定しています。明示的な比較をする為には、コードにもう1つの条件のifを追加し、関数本体から"/*"や"*/"というコメントに含まれる括弧を削除する必要があります。
エキスパートアドバイザのパラメータのリストにはmodelState変数がありませんが、この値はエキスパートアドバイザ起動時に、initialModelState外部変数からコピーされています。
// モデルの状態 extern int initialModelState=STATE_NORMAL;
この過度なコードの複雑化は、後の状態が大きくなり可能性があり、これらの全てが動作の開始に利用できるとは限らないということを想定してのことです。状態の表示として、任意の値を使用することができます。検証中のエキスパートアドバイザで、これらは以下のように定義されています。
// モデルの状態の定義 #define STATE_NORMAL 0 #define STATE_REVERSE 1
エキスパートアドバイザの残りのコードには、綿密にコメントを書くので、読者の中にこれらを判読するのに困難は生じないと思います。
エキスパートアドバイザのテストに次の条件が適用されています。
- ポジションボリュームー0.1ロット
- 初期デポジットー1万ドル
- 期間ー利用可能なもの全て
- 動作モードーSTATE_NORMAL、STATE_REVERSE
- テスト間隔ー利用可能な全履歴
- 通貨ペア
- USDCHF
- GBPUSD
- EURUSD
- USDJPY
- AUDUSD
- USDCAD
- EURGBP
- EURCHF
- EURJPY
- GBPJPY
- GBPCHF
- EURAUD
結果の比較を行う基準として、純利益と勝ち取引のパーセンテージが選択されています。
次の2つの表には、STATE_NORMALモード(1つ目の方法)でのエキスパートアドバイザのテスト結果が示されています。
純利益
M1 | M5 | M15 | M30 | H1 | H4 | D1 | |
---|---|---|---|---|---|---|---|
USDCHF | -9902 | -9900 | -9903 | -9907 | -9901 | -9900 | -9927 |
GBPUSD | -9868 | -9864 | -9869 | -9887 | -9873 | -9868 | -9924 |
EURUSD | -9921 | -9957 | -9949 | -9941 | -9934 | -9910 | -9879 |
USDJPY | -9900 | -9905 | -9900 | -9905 | -9935 | -9926 | -9904 |
AUDUSD | -9952 | -9957 | -9966 | -9962 | -9961 | -9956 | -10000 |
USDCAD | -9901 | -9903 | -9901 | -9900 | -9902 | -9904 | -8272 |
EURGBP | -9862 | -9861 | -9864 | -9869 | -9875 | -9871 | -5747 |
EURCHF | -9862 | -9865 | -9865 | -9874 | -9869 | -9862 | -5750 |
EURJPY | -9866 | -9877 | -9964 | -9877 | -9869 | -9867 | -10000 |
GBPJPY | -9848 | -9841 | -9840 | -9845 | -9848 | -9870 | -9849 |
GBPCHF | -9891 | -9885 | -9850 | -9844 | -9857 | -9856 | -9891 |
EURAUD | -9865 | -9863 | -9868 | -9874 | -9861 | -9891 | -10000 |
勝ち取引の割合
M1 | M5 | M15 | M30 | H1 | H4 | D1 | |
---|---|---|---|---|---|---|---|
USDCHF | 19.55 | 27.82 | 31.50 | 38.18 | 39.86 | 43.29 | 43.95 |
GBPUSD | 21.18 | 27.81 | 30.29 | 33.81 | 35.20 | 41.39 | 46.71 |
EURUSD | 26.06 | 33.20 | 34.59 | 37.55 | 41.64 | 43.73 | 44.37 |
USDJPY | 19.28 | 31.68 | 34.13 | 35.48 | 39.04 | 42.99 | 46.85 |
AUDUSD | 19.71 | 21.30 | 26.25 | 27.20 | 33.15 | 39.96 | 44.69 |
USDCAD | 21.88 | 25.13 | 27.59 | 31.79 | 33.07 | 39.48 | 46.40 |
EURGBP | 21.78 | 28.90 | 31.49 | 34.55 | 35.24 | 42.11 | 47.04 |
EURCHF | 28.70 | 27.86 | 27.85 | 31.13 | 32.90 | 39.08 | 47.65 |
EURJPY | 23.69 | 30.62 | 35.81 | 38.89 | 39.06 | 44.04 | 48.16 |
GBPJPY | 10.11 | 19.47 | 33.48 | 37.39 | 37.75 | 43.09 | 47.42 |
GBPCHF | 23.17 | 23.95 | 30.84 | 33.50 | 36.03 | 42.43 | 47.90 |
EURAUD | 1.65 | 7.35 | 16.55 | 22.24 | 27.65 | 36.11 | 44.64 |
1つ目の方法のテストは、満足できない結果を示しました。全ての通貨ペアで期間に関係なく、デポジットの損失が起こりました。この際、勝ち取引の数は期間の増長とともに大きくなりますが50%を越えません。
次の2つの表には、STATE_REVERSEモード(2つ目の方法)でのエキスパートアドバイザのテスト結果が示されています。
純利益
M1 | M5 | M15 | M30 | H1 | H4 | D1 | |
---|---|---|---|---|---|---|---|
USDCHF | -9900 | -9912 | -9902 | -9917 | -9915 | -9901 | +83 |
GBPUSD | -9864 | -9866 | -9869 | -9874 | -9870 | -9911 | -5565 |
EURUSD | -9920 | -9917 | -9923 | -9947 | -9922 | -9886 | +4249 |
USDJPY | -9906 | -9901 | -9906 | -9900 | -9900 | -9928 | +2003 |
AUDUSD | -9955 | -9956 | -9957 | -9956 | -9969 | -9947 | +1203 |
USDCAD | -9900 | -9900 | -9900 | -9900 | -9901 | -9906 | -3129 |
EURGBP | -9868 | -9862 | -9862 | -9863 | -9867 | -9902 | -9867 |
EURCHF | -9863 | -9861 | -9863 | -9862 | -9869 | -9869 | -6556 |
EURJPY | -9861 | -9864 | -9866 | -9868 | -9897 | -9886 | -10000 |
GBPJPY | -9850 | -9887 | -9905 | -9857 | -9969 | -9848 | -9964 |
GBPCHF | -9846 | -9841 | -9842 | -9842 | -9886 | -9914 | -9850 |
EURAUD | -9870 | -9866 | -9874 | -9910 | -9872 | -9872 | -2411 |
勝ち取引の割合
M1 | M5 | M15 | M30 | H1 | H4 | D1 | |
---|---|---|---|---|---|---|---|
USDCHF | 18.38 | 27.41 | 33.76 | 37.46 | 42.28 | 46.71 | 52.15 |
GBPUSD | 18.59 | 27.71 | 34.07 | 39.01 | 43.79 | 47.33 | 49.39 |
EURUSD | 23.37 | 33.88 | 41.05 | 43.80 | 43.56 | 48.16 | 52.56 |
USDJPY | 16.88 | 30.39 | 38.13 | 40.29 | 43.94 | 46.62 | 49.34 |
AUDUSD | 18.84 | 22.52 | 25.39 | 29.83 | 36.36 | 43.51 | 49.84 |
USDCAD | 22.44 | 24.04 | 27.07 | 31.06 | 35.69 | 43.51 | 49.84 |
EURGBP | 20.52 | 28.89 | 35.18 | 38.82 | 42.41 | 45.82 | 45.55 |
EURCHF | 27.43 | 31.82 | 32.80 | 35.05 | 36.74 | 43.89 | 46.04 |
EURJPY | 18.79 | 28.15 | 37.09 | 39.80 | 43.05 | 44.15 | 46.92 |
GBPJPY | 10.02 | 19.76 | 31.92 | 38.06 | 41.84 | 44.32 | 47.53 |
GBPCHF | 19.87 | 27.24 | 33.72 | 35.70 | 39.74 | 47.59 | 46.11 |
EURAUD | 1.43 | 7.66 | 17.24 | 26.95 | 34.46 | 41.29 | 47.07 |
2つ目の方法のテストは、複雑な結果を示しました。D1よりも小さい全ての時間軸では、結果は1つ目の方式で得られた結果とおおよそ一致しました。D1の時間軸では、12のうちの4つの通貨ペアで利益が出ました。この時、勝ち取引の数は50%に近く、2つの例では52%に達しました。
総じて、エキスパートアドバイザのテスト結果はより良いものを望ませます。これらの欠点を補うために、ナイーブメソッドを一緒に使用してみましょう。
適応方法
適応方法の要点は、予測の構築の為にナイーブメソッドのうちの1つが選択され、エラー時には他のものと置き換えられるという点にあります。このようにして、一連の予測行動への適応が行われます。
エキスパートアドバイザのテストを使用し、この方法の有効性が検証されました。(添付ファイル内、CandlePredTest_adaptive.mq4)
このエキスパートアドバイザは、CandlePredTest_naiveの修正版になります。本質的な違いは、新しいバーごとに、エラーの検出をする目的で、前回の予測の分析を行います。
// エキスパートアドバイザの動作関数 int start() { // ポジションオープンは、各バーごとに1度行われます if (!IsNewBar()) { return (0); } // 全ての開いているポジションを閉じます TradeClosePositions(DIRECTION_UP); TradeClosePositions(DIRECTION_DOWN); // モデル状態を更新します if (prediction!=DIRECTION_NONE) { ModelUpdate(prediction==GetCandleDirection(1)); } // 次のローソクの色を予測します prediction=ModelPredict(); if (prediction==DIRECTION_NONE) { return (0); } // 必要な方向へポジションを開きます TradeOpenPosition(prediction,""); return (0); }
エラーの分析は、前のバーでエキスパートアドバイザがポジションを開いた場合、つまり、もし予測として定数DIRECTION_NONEが返されなかった場合にのみ行われます。予測と実際の動きの不一致は全てエラーとして見なされ、これの変位は新しいバーが開いた時に1と等しくなります。
1つのナイーブメソッドの他のものとの置き換えは、パラメータとして予測の正確性のフラグが引き渡されるModelUpdate関数が実行します。(prediction==GetCandleDirection(1))
// モデル状態の更新 void ModelUpdate(bool correct) { // もし予測が誤っていた場合、モデル状態を変更します if (!correct) { if (modelState==STATE_NORMAL) { modelState=STATE_REVERSE; } else /*if (modelState==STATE_REVERSE)*/ { modelState=STATE_NORMAL; } } }
関数は予測の正確性(correct)のフラグを分析し、エラーを検出した際には選択したナイーブメソッドを、数値を変更するmodelState変数を使って置き換えます。modelState変数初期値は、初期化の際にinitialModelState変数からコピーされます。エキスパートアドバイザは、動作時に自分で予測方法を変更するので、これはあまり重要なことではありません。
予測は、CandlePredTest_naiveインディケータで使用されているようなModelPredict関数が行います。動作中のmodelState変数の値の変更により、1つ目の方法で予測を行ったり、2つ目の方法で予測を行ったりします。
エキスパートアドバイザのテストは同じ条件で行われました。固定であった(STATE_NORMAL)initialModelState変数の値の選択は例外です。
純利益
M1 | M5 | M15 | M30 | H1 | H4 | D1 | |
---|---|---|---|---|---|---|---|
USDCHF | -9903 | -9905 | -9902 | -9915 | -9902 | -9907 | -3738 |
GBPUSD | -9866 | -9875 | -9876 | -9864 | -9867 | -9933 | -6404 |
EURUSD | -9924 | -9924 | -9931 | -9920 | -9920 | -9903 | -3779 |
USDJPY | -9904 | -9900 | -9900 | -9904 | -9920 | -9902 | -6493 |
AUDUSD | -9955 | -9954 | -9955 | -9995 | -9955 | -9965 | -8649 |
USDCAD | -9903 | -9902 | -9901 | -9911 | -9900 | -9904 | -1525 |
EURGBP | -9861 | -9867 | -9865 | -9862 | -9881 | -9877 | -9913 |
EURCHF | -9861 | -9862 | -9872 | -9881 | -9870 | -9875 | -9258 |
EURJPY | -9861 | -9865 | -9866 | -9868 | -9876 | -9905 | -9880 |
GBPJPY | -9842 | -9844 | -9867 | -9840 | -9919 | -10000 | -9933 |
GBPCHF | -9841 | -9843 | -9917 | -9840 | -9893 | -9848 | -9895 |
EURAUD | -9866 | -9869 | -9863 | -9872 | -9867 | -9904 | -7656 |
勝ち取引の割合
M1 | M5 | M15 | M30 | H1 | H4 | D1 | |
---|---|---|---|---|---|---|---|
USDCHF | 19.22 | 26.82 | 32.29 | 35.71 | 40.29 | 44.15 | 47.93 |
GBPUSD | 20.12 | 28.16 | 32.01 | 34.87 | 40.05 | 41.97 | 49.39 |
EURUSD | 25.24 | 32.65 | 38.32 | 39.48 | 41.50 | 45.81 | 48.88 |
USDJPY | 19.16 | 29.48 | 35.02 | 37.03 | 40.19 | 44.45 | 47.34 |
AUDUSD | 19.63 | 21.67 | 25.76 | 28.16 | 32.11 | 41.11 | 46.76 |
USDCAD | 22.84 | 24.46 | 27.39 | 29.79 | 34.44 | 42.26 | 48.46 |
EURGBP | 21.44 | 29.45 | 33.05 | 36.55 | 38.19 | 41.86 | 46.23 |
EURCHF | 27.51 | 29.98 | 30.92 | 34.44 | 34.09 | 40.87 | 44.27 |
EURJPY | 21.24 | 28.56 | 35.58 | 38.78 | 40.50 | 44.23 | 47.12 |
GBPJPY | 11.30 | 19.90 | 31.91 | 37.15 | 36.76 | 41.11 | 46.24 |
GBPCHF | 22.00 | 26.81 | 32.13 | 34.38 | 36.99 | 43.11 | 47.16 |
EURAUD | 1.50 | 6.56 | 15.14 | 22.25 | 31.63 | 37.96 | 47.70 |
テストは1つ目と2つ目の方法と比較して、顕著な結果の改善は示しませんでした。全ての期間において、全ての通貨ペアで利益は消極的なもので、勝ち取引の数は50%を越えませんでした。
まとめ
記事に書いたテストの結果は、検証した方法の低い有効性を示しました。
- 1つ目の方法は非常に非効率的であることがわかりました。明らかに、前のローソクの動きと次のローソクの動きの一致についての予測には、更なる検証が必要です。
- 2つ目の方法は、検証した方法の中で最も良い結果を示しましたが、より綿密な分析が必要です。例えば、利益が固定されていなかった取引数のデータは興味を引くかもしれません。
- 3つ目の方法は、1つ目と2つ目の方法に比べ、平均的な結果を出したので、更に改善していく必要があります。これを作成する主なアイディアとなったのは、使用されたナイーブメソッドの性質と比較した性能の向上です。しかし、改善は起きませんでした。恐らく、メソッドは余りにも頻繁に予測方法を変えるので、追加のエラーに繋がっているのかもしれません。
MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/1374
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索