FXの売買シグナルの「だまし」を機械学習で見破る方法(XGBoost編)

使っているFX会社はどこ?
テクニカル分析用(チャートが使いやすい) → DMM FX
Python API用(FX APIはここしかない) → OANDA ジャパン
デイトレ用(スプレッドがとにかく狭い) → SBI FXトレード

FXテクニカルトレーダーの悩みの種である「売買シグナルのだまし」。本記事では機械学習手法「XGBoost」を使ってゴールデンクロスの「だまし」を推測するモデルの作成方法をまとめました

こんばんは、新米データサイエンティスト(@algon_fx)です。今月は本業が極めて忙しいのに加えて、巷で話題になっているデータ分析競技に参加して大忙しです。

とはいえ、時間を見つけてはトレードもやっていますし、もはや趣味でるFX機械学習の研究も進めています。やっぱり楽しいですね、FX機械学習トレード。今は自動売買ではなく、機械学習モデルを売買シグナルやテクニカル指標と捉えてトレードをしています。

さて、前回はPythonでゴールデンクロス(デットクロス)の分析方法を記事にしました。今回はもう一段階進めて、Pythonを使ってゴールデンクロスの「だまし」を学習する流れをまとめます!

冒頭にも書きましたが、ノウハウ公開みたいな類の記事ではありません。あくまで超基本的なやり方をまとめただけです。これを実装したところで利益は100%出ません。これからFX機械学習トレードを始める方の最初の一歩になれば幸いです。

本記事ですが前回の記事の続編です。ゴールデンクロス/デッドクロスの詳しい説明は前回の記事をご参考ください。

売買シグナルの騙しとは?

初心者から上級者までこよなく愛される「ゴールデンクロス」「デッドクロス」ですが、当然ですが100%の確率で売買シグナルが成り立つわけではありません

ゴールデンクロスは「買いシグナル」ですが、そのシグナル通りに買い注文を入れたのに・・相場は下がってしまい損をした・・なんてことはよくあることです。

このように売買シグナルの意図と反して相場が動くことを「だまし」と呼びます。下のチャートをみてください。これはドル円の10分足のデータを簡単にチャートに落としたものです。(参考:Pythonでローソク足を作る方法

赤い矢印に注目しましょう。短期移動平均(緑線)が長期移動平均(赤線)を下から上へ突き抜けています。いわゆるゴールデンクロス=買いシグナルです。

ところが、その後に大幅に為替相場は下がり続けていますよね。売買シグナル通り、このタイミングで注文を入れたとすると大損になります。これが「だまし」です!

ゴールデンクロス/デッドクロスの「だまし」を見破る手法は多くあります。基本的な見破る方法としては他のテクニカル指標と組み合わせて売買シグナルを吟味することで、「だまし」を回避できます。

「だまし」を見破ることが可能?!なら機械学習でやってみましょう!ってのが今日のお題です。(笑)

XGBoostとは?

冒頭にも書きましたが、今回は機械学習手法のXGBoostを使って売買シグナルの「だまし」を訓練します。機械学習をやっている方であれば、一度は耳にしたことがあるかと思います。

 

数学的な厳密な解説は行いませんが、簡単にどのようなアルゴリズムなのか概要を説明します。XGBoostはPythonのオープンソースライブラリで比較的新しい機械学習の手法です。

2014年のデータ分析コンペで使われました。他者を寄せ付けない圧倒的な精度を叩き出し、それ以来Kaggleなどのデータ分析コンペの上位ランカーは必ずと言って良いほど使う手法に定着しました。

XGBoostの仕組みと知っておくべき特徴は以下の通りです。

【XGBoostの仕組み】
・XGBoostはランダムフォレストの勾配ブースティングのフレームワーク
・勾配ブースティングとはアンサンブル学習の手法の一つです
・アンサンブル学習とは複数のモデルを組み合わせる手法です
・つまりランダムフォレストのモデルを多数構築して組み合わせます
・勾配ブースティングは複数モデルの組み合わせ方に工夫があります
・各モデルの弱点(間違った推測)を学習して最終的に間違いを減らします

【XGBoostの特徴】
・大規模データでも非常に高速に処理できるよう設計されています
・設計がとてもフレキシブルで高度なカスタマイズが可能
・ハイパーパラメータが多数あるのでチューニングは必須
・多くのデータに対して非常に高い予測精度がでる
・回帰と分類で使えます

機械学習の現場でもXGBoostは頻繁に使われる手法です。とても身軽かつ、一定の推測精度がでうのでひとまずベースラインを作るときなどにも活用されます。

上記にもある通りXGBoostはランダムフォレストの勾配ブースティングです。ランダムフォレストというのは、決定木のアンサンブル学習です。(参考:決定木を使ってFX予想をやってみる

ひとまず「身軽で推測精度が優秀なやつ!」ってくらいに理解しておけば問題ないと思います!ただ、特徴にも記載しましたがハイパーパラメータが多いので、必ずと言って良いほどチューニングを行う必要があることも覚えておきましょう。

では、実際にPytyhonを使ってやってみましょう!

STEP1 実行環境とデータ

今回も実行環境はGoogle Colab(グーグルコラボ)を使って行いましょう。もし自身のPCで行う場合は、XGBoostのインストールが必要です。pip経由で簡単にインストールが可能です。

Google Colabを初めて使う方は「知らないと損をするGoogle Colabの隠し技と基本操作」の記事をご参照ください。ブラウザのみで5分もあれば機械学習の実行環境が整います。またXGBoostも事前にインストールされていますので、環境構築も不要です。

Google Colab

データですが、ドル円の10分足のデータを使います。下記のURLからダウンロードが可能です。(こちらは私がOANDA FX APIから作成したデータをCSVファイルに書き出したものです)

【使うCSVファイル】
usd_10min_api.csv

ダウンロードしたら準備完了です。次のステップに行きましょう。

STEP2 データの確認

では、Google Colabを立ち上げて早速始めましょう。まずは今回使うライブラリをインポートします。XGBoostですが、途中でWarning(警告)が出る箇所があるので、あらかじめ非常にする設定をしています。(特にモデル構築に問題はありません)

上記のコードをGoogle Colabの「コードセル」に入力できたら、Shift + Enterでコードの実行をしましょう。

次に為替レートのCSVファイルをGoogle Colabへアップロードします。下記のコードを実行して、「ファイルを選択」からCSVファイルを選んでアップロードしましょう。

では、CSVファイルをPandasのデータフレーム形式で読み込んであげましょう。同時に単純移動平均も計算をしちゃいます。(参考:Pythonで単純移動平均を算出する方法

こちらのデータは2018年3月1日15:40から2018年8月10日 16:10までの期間のデータです。冒頭でも触れましたがOANDA FX APIから取得した実際のドル円の10分足の過去為替レートです。

上記にもある通り今回は期間5と期間15の単純移動平均を使います。これらの期間を変更すれば結果も大きく異なります。時間がある方は検証してみてください。

STEP3 ゴールデンクロスとデッドクロスを検出

では売買シグナルとして「ゴールデンクロス」「デッドクロス」をまずは検出してあげましょう。詳細は「Pythonでゴールデンクロスとデッドクロスを分析する方法」をご参考ください。

今回はささっと、一つのコードにまとめて処理をしちゃいます。

ご覧の通りゴールデンクロスがしっかり算出できています。上記の例ですと9:20の時点でsma_5(短期平均線)がsma_15(長期平均線)を下から上へ抜けている(つまり差分がマイナスからプラスへ転換した)のが確認できますね。

STEP4 前処理と特徴量エンジニアリング

ゴールデンクロスが為替レートから算出できました。次はXGBoostに学習させる特徴量を計算しましょう。特徴量ですがやり方は無数にあります。

どのような特徴量を使ってモデルを構築するのかで推測の制度が大きく変わります。冒頭でも書きましたが、今回の目的は儲けるのが目的ではありません。ですので、超シンプルかつ初歩的な特徴量を使かいます。

今回は下記のアイデアを実装します。

【特徴量 その1】
ゴールデンクロスが出現した時点の終値、短期移動平均の値、長期移動平均の値を使ってみる。

【特徴量 その2】
ゴールデンクロスが出現した時点の終値を基準として、10分前〜50分前の終値の差分を使ってみる。

【特徴量 その3】
ゴールデンクロスが出現した時点を基準として、10分前〜30分前の短期移動平均(sma_5)と長期移動平均(sma_15)の差分を使ってみる。

では、実際にデータの処理を行いましょう。まずは終値の差分の特徴量を計算します。

diff_10を確認するとわかりますが、その時点の終値から10分前の終値を差し引いた値なのが確認できます。

続いて短期 – 長期の差異も計算をしましょう。

大丈夫そうですね。やっていることは言葉で表すと非常に複雑に聞こえますが、コードを見ればやっていることは単純なのが判ると思います。

続いて正解ラベルを作りましょう。これにも色々と考え方がありますが、今回は「売買シグナルが発生した20分後に決済をする」をルールとして設けましょう。

ですので、正解ラベルとしてはゴールデンクロスが出現した終値から20分後の終値の差分を計算します。この終値の差分の値がマイナスの場合は「0」、プラスの場合は「1」とします。

ゴールデンクロスは「買い」のシグナルですので、20分後の終値が上がっていれば「成功」、逆に下がっている場合は「だまし」というわけです。

ちょっと横長で見辛いですが・・一番右のカラムに「target」が追加されました。最後にデータをゴールデンクロスが出現したものだけを切り分けましょう。

また不要なデータ(時間など)はデータフレームから落としましょう。これでXGBoostへ訓練させる特徴量の作成は完了です。

STEP5 訓練データとテストデータへ分割

次に全てのデータを訓練データとテストデータへ分割しましょう。訓練データを使ってモデルの訓練を行い、テストデータを使ってモデルの精度を確認するためです。

大丈夫そうですね。訓練データには「1」が240個含まれています。ターゲットが「1」というのは、ゴールデンクロスが出現した時点で買い注文を行い、20分後に決済をした時に利益がでたことを意味しています。

STEP6 ハイパーパラメータチューニング

XGBoostの概要説明でも触れましたが、XGBoostは多数のハイパーパラメータがあります。それらを細かく調整することで非常に高い推測精度が出ます。

今回は細かいチューニングは行いませんが、やり方だけ記載しておきます。Scikit-learnのグリッドサーチCVを利用すると、非常に簡単にハイパーパラメータの交差検証が行えます。

まずはターゲット(y_train)サイズを変更してあげましょう。本来のサイズは(504, 1)なのですが、Scikit-learnのグリッドサーチでエラーが出ます。(謎の仕様)

次にグリッドサーチCVで交差検証をするXGBoostのハイパーパラメータを設定します。今回は簡単なものしかやりませんが、より精度をあげたい方は、ここの値を色々と調整してしっかり交差検証をしてみください。

では交差検証を実行してみます。

データがとても小さいのであっという間に終わりますね(笑)。普段、本職でグリッドサーチCVやると余裕で数時間とかかかりますが。

では交差検証した結果、最も正解率が高かったハイパーパラメータ の組み合わせを確認します。

ふむふむ、なるほどですね。参考までにですが、このハイパーパラメータ が正解という訳ではありません。各自、色々とハイパーパラメータ の値を調整してみましょう。

STEP7 XGBoostのモデル訓練

では、いろいよ訓練データを使ってXGBoostのモデルを作りましょう!ランダムフォレストの勾配ブースティングをスクラッチでコーディングするのは非常にしんどいですが・・

XGBoostを使うとなんとたったの一行で実装できます(笑)

これでモデル訓練完了です!では、テストデータを使って、本当に学習できているのか確認して今ます。ドキドキな瞬間ですね。

う〜ん・・まぁなんとなくの精度ですね笑。混同行列は分類の推測精度を評価する指標の一つです。上の結果の意味としては、テストデータに含まれるゴールデンクロスの「だまし」は25回あり、うち12回は「だまし」として推測を正しく出来たことを意味します。

正解率(Accuracy)も確認してみましょう。

まぁこんなもんですよね。今回の特徴量で作ったゴールデンクロスの売買シグナルのモデルの正解率は38.18%でした。間違いなく、このモデルに従ってトレードしたら「損」しますね(笑)

STEP8 「だまし」の確率を出力してみよう

私がXGBoostを好きな理由の一つに「確率」を出力できる点があります。ステップ6ではモデルはターゲットの値(1か0)を直接出力しました。

確率が出力できるというのは、例えばこのゴールデンクロスは成功(値1)する確率が72%、だまし(値0)の確率は28%といった具合に確率を出すことが可能です。

やってみましょう。

上記の意味ですがテストデータの2番目の特徴量(ゴールデンクロス)は「だまし」の確率が56%を意味しています。

最後に異なる閾値でどれくらいの確率を信じれば良いのかを確認してみましょう。

どれも微妙ですが・・閾値を0.6とするとテストデータに含まれる25回の「だまし」のうち、22回は正しく検知できているようです。ただ、上の結果を見るとわかりますが、非常に微妙な精度です。

まとめ

いかがでしたでしょうか?今回はXGBoostを使ってゴールデンクロスの売買シグナルの「だまし」を予測する方法をまとめました!

冒頭でも説明した通り、本記事はあくまで「やり方」を解説するのが目的です。全然、精度が出てないじゃん!って思わず・・それぞれ各自、これをスタートラインとして精度改善に挑戦してみてください!

FXで機械学習を使うための初心者向けチュートリアルもまとめています!Pythonの初歩的な知識があれば実装が可能ですので、興味がある方は是非ご覧ください!

決定木を使ってFX予想をやってみる
FXトレードでロジスティック回帰を独自テクニカル指標として活用する方法

ブログ読んでいただきありがとうございます!Twitterでも色々と発信しているので、是非フォローお願いします!

FX 機械学習

Posted by algon