こんにちは、自称窓埋めアナリストのたっきん(Twitter)です!
OANDA APIとBokehを使ったFXトレードツールっぽいものに、またまた機能を追加したので紹介していきたいと思います!
今回追加したのは「窓埋めの勝率を自動で解析してくれる」機能になります。
「窓埋め」とは?
窓とは上のチャートに示すように、「ぽっかり空いたすき間」のことを言います。
基本的に窓は「月曜日の始値」と「前週末の終値」で開くことが多く、窓が開くと窓を閉じる方向にチャートが動くことが多いとされています。
このように、窓が閉じる方向にチャートが動くのを狙ってトレードする戦略を「窓埋めトレード」と言います。
今回、僕が作成した「窓埋め勝率自動解析」機能も全て月曜日の始値で形成される窓を対象としています。
「窓埋め勝率自動解析」機能の紹介
あれこれ難しい説明をするよりかは実際に出来たものを見てもらった方がわかりやすいと思うので、まずは下の動画を見ていただきたいと思います!
なんとなくやろうとしていることはざっくりと理解できましたか?
それでは改めて「窓埋め勝率自動解析」機能の詳細を紹介していきたいと思います!
①解析結果リスト
解析開始~終了日時を指定し解析実行ボタンをクリックすると、その期間の毎週月曜日における窓埋めの詳細リストが下図のように作成されます。
各パラメータの定義は以下のようになってます。
名称 | 意味 | 参考No |
---|---|---|
Date | 日付(月曜日) | |
Close Price | 前週末の終値 | ① |
Open Price | 月曜日の始値 | ② |
Direction | 窓が開いた方向(Up or Down) | |
Spread | Open Priceのスプレッド | |
Gap Price | 窓の幅 | ③ |
Result | 窓埋め成功 or 失敗 | |
Fill-Gap Time | 1時間足での窓埋め完了時刻 (失敗時は「00:00」固定) | ④ |
Max Open Range | 窓埋め完了までに窓を閉じる方向 とは逆方向に開いた最大幅 | ⑤ |
理解しやすいように上記の参考Noを下の図に記しました。
さらに、リストのいずれかの行をクリックすると、その日付の1時間足チャートを確認することができます。
②ヒストグラムを使った統計データの見える化
窓埋め勝率の解析結果を見える化するために、ヒストグラムを使った統計データで表現してみました。
概要は以下のようになってます。
「全データ」と「有効データのみ」の違い
「全データ」は文字通り、解析結果リストに表示されている全データについての解析結果となります。
一方、「有効データのみ」は「全データ」中の有効データのみに絞った解析結果となります。
では「有効データ」とは何かといいますと、以下のように定義しています。
- 有効データ: Gap Price > スプレッド
- 無効データ: Gap Price ≦ スプレッド
当然のことながら窓が開いたとしても、その開き幅がスプレッド以下であったら利益になりませんよね!
なので確実に利益にならない「無効データ」を除去した解析結果を上図の右側に表示させています。
[1] 成功 or 失敗回数
窓埋めが成功した回数と失敗した回数を全データ(All data)と有効データのみ(Only valid data)に分けてカウントしています。
[2] Gap Price ヒストグラム
窓埋めが成功 or 失敗した際のGap Priceの幅を縦軸に、回数分布を横軸で表しています。
赤は窓埋め失敗時、緑が窓埋め成功時を表しています。
例えば、全データ(左図)で窓埋めが成功した回数50回のうち、Gap Priceが0.04~0.06の範囲内であったものは9回であることがわかります。
このヒストグラムを見て分かることは、Gap Priceの幅の開きが狭かった場合はそれなりに窓埋め成功率が高く、逆にGap Priceの幅の開きが広いほど窓埋め失敗率が上がってくることが読み取れます。
このヒストグラムはGap Priceの幅によって窓埋めトレードの要否判断に活用できそうです。
[3] Max Open Rangeヒストグラム
窓埋めが成功した際のMax Open Rangeの幅を縦軸に、回数分布を横軸で表しています。
例えば、全データ(左図)で窓埋めが成功した回数43回のうち、Max Open Rangeが0.06~0.08の範囲内であったものは7回であったことがわかります。
このヒストグラムを見て分かることは、窓埋めが成功する場合のMax Open Rangeの幅は0.00~0.02の範囲内に収まることが大半であることが読み取れます。
このヒストグラムは窓埋めトレードする際に、ロスカットをどこの値に設定すべきかの判断に活用できそうです。
結局どうすれば窓埋めトレードで効率よく勝てるのか?
まぁ、多くの人が知りたいと思ってるのはここですよね。
今回ヒストグラムを使った窓埋め勝率解析では、「Gap Price」と「Max Open Range」の2つのパラメータについて考えてきました。
ヒストグラムの結果を見る限り、窓埋めが成功するとき、失敗するときにある程度の傾向があることから、以下の2つの方針でトレードするのが良いと考えました!
<方針>
- なるべく窓埋めが成功するパターンのみに絞ってトレードする。
- もし窓埋めが失敗した場合でも損失が最小限になるところにロスカットを設定する。
しかし、この方針で進めるためには以下の課題を解決する必要があります。
<課題>
- 窓埋めが成功 or 失敗するパターンはGap Price ヒストグラムから予測できそうだが、その線引き(閾値)をどこに設定するのがよい?
- 損失が最小限になるロスカット値の設定はMax Open Rangeヒストグラムから予測できそうだが、その線引き(閾値)をどこに設定するのがよい?
さて、面倒くさそうな課題が出てしましましたねw
要は最適な2パラメータを決めればいいので、最適化問題的なものを解けばよさそうなのですが、残念ながら僕にはそんな知識はありませんw
なので、いつものゴリ押し戦法で、
「実際に値を総当たりで入れてみて最も高い利益となるとき」
を調べてみることにしました。
さっそく過去チャートを使った総当たりシミュレーションをやっていきましょう!
総当たりシミュレーション計算手順
まず、Gap Price閾値とMax Open Range閾値を2変数とした合計損益値aは以下の(1)式で計算できます。
\begin{align*}
a_{(gpth,\ morth)} = \sum_{ d = start }^{ end } {f_{(d,\ gpth,\ morth)}} \cdots (1)
\end{align*}
- f(): 窓埋め損益値算出関数
- gpth: Gap Price閾値
- morth: Max Open Range閾値
- start: シミュレーション期間の開始日時
- end: シミュレーション期間の終了日時
この合計損益値a(gpth, morth)の総当たり演算結果の集合をAとすると、Aは以下の(2)式となります。
\begin{align*}
A = \left\{ a_{(gpth,\ morth)} \mid 0<gpth<gpmax, \ 0<morth<mormax \right\} \cdots (2)
\end{align*}
- gpmax: Gap Priceの最大値
- mormax: Max Open Rangeの最大値
最後に、集合Aの最大値を調べ、最大値となるときのgpthとmorthが求めたかった値となります。
シミュレーション結果の見える化
総当たりシミュレーションは変数が2つあるため、結果を見える化するには3Dマップ等を使用しなければならないのですが、2Dでも直感的に理解しやすいようにヒートマップを使って表現してみました。
縦軸がGap Price閾値、横軸がロスカット閾値(Max Open Range閾値)、そしてグラデーションカラーが合計損益値を表しています。
黄色に近いほど合計損益値が高く、青色に近いほど合計損益値が低いことを表しています。
そして、最も黄色くなっている座標の縦軸と横軸がそれぞれ、最適なGap Price閾値と最適なMax Open Range閾値(ロスカット閾値)となります。
さいごに
今回、窓埋め勝率を自動で解析してくれる機能を追加したのですが、思いのほか完成度が高いのもが作れたんじゃないかと思ってます。
実際に使ってみると窓埋めが成功するとき、失敗するときはある程度の傾向があるので、自動取引ツールに実践投入しても、そこそこ良いパフォーマンスが得られるんじゃないかなぁ~って思ってます。
いずれは自動取引ツールも作る予定でいるので楽しみです!
また、今回僕が作成した「窓埋め勝率自動解析」機能のコードはGitHubで公開しています。
コードをダウンロードして自分で実際に動かしてみてもいいですが、実際にトレードして損失が出たとしても僕は責任を負いませんので、あくまでもトレードに関しては自己責任でお願いします。
コメント