FXトレードでロジスティック回帰を独自テクニカル指標として活用する方法(機械学習初心者向け)

使っている取引会社はどこ?
仮想通貨用(2019年5月からAPI取引対応) → GMOコイン
Python API用(FX APIはここしかない) → OANDA ジャパン

FXトレードでロジスティック回帰を独自のテクニカル指標として活用する方法。Pythonとドル円の過去レートを使って、ロジスティック回帰のモデル訓練からレートの値動きの確率を算出して、トレードに活用するまでの流れをまとめました
  • Pythonを使ってロジスティック回帰のモデルを構築します
  • 過去為替レートのデータはCSVファイルでダウンロード出来ます
  • データの処理からFXトレードへ活用するまでの一連の流れを解説
  • 基本的なモデル構築を行います。ノウハウ公開の類ではありません。
  • 所要時間は30分〜1時間程度

こんばんは、新米データサイエンティスト(@algon_fx)です。機械学習を使ってFXトレードへ生かす方法を日夜模索して生きています。

少し前まではLSTMというディープラーニングの一種を使ったFX予想ばっかりやっていたのですが、ここ最近はシンプルなニューラルネットワークでの予測により時間を割いています。

【参考記事】

TensorFlowでニューラルネットワークを使ってFX予想をする方法
LSTMでFX予測をやってみよう

ニューラルネットワークやLSTMは数学的にも理解が難しいですし、機械学習を始めたばかりの方だとしっかり理解して活用するには少しハードルが高いと思います。

そこで・・機械学習トレードを始めたばかりの方へおすすめなのが「ロジスティック回帰」です。機械学習には色々な種類の手法/アルゴリズムが存在します。ロジスティック回帰は線形回帰と並んで、一番最初に学ぶべきシンプルな機械学習手法です。

では、ロジスティク回帰の基礎を学びながら、実際にFXトレードでどのように使えばよいのか、モデル訓練を含めて一緒にやってみましょう。

ロジスティック回帰とは?

ロジスティック回帰とは機械学習の教師あり学習の手法の一つで分類を行う際に用いられます。非常にシンプルな構造ですが、計算コストも低く、簡単に実装が可能なことから根強い人気があります。

本記事では数式を用いた詳細の解説は行いません。ただし、どのような仕組みで動いているのかを理解するのは重要です。簡単な例題を使って、ロジスティック回帰の仕組みを紐解きましょう。

まずは下のデータをみてください。

成人の身長と性別を表した非常にシンプルなデータです。では、このデータを下記のように可視化してみましょう。

X軸に「身長」、Y軸には性別の値(1=男性、0=女性)を可視化したものです。男尊女卑ではありませんが、一般的に男性は身長が高く、女性は進捗が低い傾向にありますよね。それが顕著に現れたデータです。

では、ここで質問です。新たに2名のデータが下記のように追加されました。データAとデータBの性別を推測してみてください。

すでに与えられたデータ(赤マーカー)から推測すると、データAはおそらく男性、データBはおそらく女性と推測できるかと思います。

このように与えられたデータ(教師データ)をより厳密に数学を使って学習を行い、それぞれのデータが男性か女性かの確立を計算して分類予測するのがロジスティック回帰です。

ロジスティック下記では下記のような線をデータから導き出して分類推測を行います。(この線はシグモイド関数で導き出します。興味がある方は、詳細は調べてみてください)

こんな線を使ってどうやって予測するだよ(怒)って一見すると思いますが、実はこいつは非常に便利な形をしているのです。ではデータBとこの線を使って分類予測してみましょう。

データBですが身長が159cmですが、xが159の時の線のyを求めることで予測が可能です。下の図をみてください。データBと青い線が交わった部分のYの値を見ると「0.4」と読めます。

ここからが、重要です。このデータは1=男性で0=女性でした。ロジスティック回帰の線を使ったところデータBは0.4と出ました。

これは、データBは男性である確立が40%である。逆の言い方をすれば女性である確立が60%であることを示しています。

このようにロジスティック回帰では分類だけではなく、その分類に当てはまる確立までも確認することが可能なわけです。これはロジスティック回帰の大きなメリットの一つです。

例えば分類だけの精度で考えれば別の機械学習手法である「サポートベクターマシン(SVM)」などの方が一般的にうまく分類してくれます。ただし、SVMでは分類の確立を確認することは出来ません。

ロジスティック回帰をFXトレードで使う

ロジスティック回帰は解った、だが、どうやってFXトレードで使うだって話ですよね。結論から言うと使い方は様々です。

本記事では初歩の初歩として、為替レートが上がるか下がるかをロジスティック回帰で予測してみましょう。下のデータをみてください。

このように、当日の為替レートのデータを特徴量として使って、翌日の終値が上昇するか下降するかを予想することが可能です。

数字ばかりで見辛いデータですが、「終値」と「翌日終値」に注目してください。単純にこの2つのレートを差し引いてレートが翌日上がれば「上昇=1」、翌日下がっていれば「下降=0」をターゲットとして持っています。

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

STEP1 ライブラリとデータの読み込み

ロジスティック回帰の実装ですが、今回は機械学習ライブラリのScikit-learn(サイキット・ラーン)を使います。今回は便宜上、Scikit-learnを使いますが、機械学習初心者の方で、よりロジスティック回帰を深く理解したい方はスクラッチで組んで見て下さい。さほど難しいロジックではありません。

次は為替レートを読み込みましょう。何度も登場しましたが、私がOANDA APIから取得したドル円の一日足のCSVファイルを使いましょう。下記からダウロードしてください。

usd_jpy_api.csv

ご覧の通り、こちらのデータは最終日が2018年7月23日のドル円の1日足のデータです。終値(close)、始値(open)、高値(high)、安値(low)、取引量(volume)が含まれています。

STEP2 データの前処理

前述しましたが、ロジスティック回帰のモデルへ学習させる前にデータを少しいじってあげる必要があります。まずは終値を1日ずらして、その差分を計算してあげましょう。

上記テーブルの最上部の8月19日の終値(close)と差分(diff)を見てください。8月19日の終値は100.256で翌日の終値は100.355です。その差分として0.079がdiffとして計算されているのが確認できます。

FXに限らずですが、データを処理する場合は細かくチェックをするとミスが無くなります。

では、このデータで当日の終値から翌日の終値が上昇したものと下降したものの割合をチェックしてみましょう。

若干ではありますが、上昇したレートの方が多いのが確認できます。参考までにですが、為替レートはランダムウォークと呼ばれており、つまり上昇も下降も「ランダム」だぜ!って意味です。このデータを見てみると、本当に綺麗に上昇と下降を繰り返しているのが解ります。

次はロジスティック回帰のモデルへ訓練するためターゲットを解りやすい形に変えましょう。具体的にはレートが上昇したら「1」、下降したら「0」とします。

データを確認してみると当日と翌日の終値の変化量に応じて「1」「0」へ変換されています。

次は今回のモデルへ学習させない不要な列の削除やカラム名を解りやすいように変更して、順序も変更してあげましょう。

大丈夫そうですね!

STEP3 訓練/テストデータへ分割

ターゲットとなる値の処理も完了しました。次は訓練データとテストデータへ分割を行います。

機械学習ではモデルへ学習を行わせる「訓練データ」、さらに学習済みのモデルを使って予測を行いモデルの精度の評価を行う「テストデータ」へ分割するのが一般的なプロセスです。

データ分割方法は様々な手法がありますが、FXのように時系列データの場合はランダムに分割するのは得策ではありません。(これも時と場合によりますが)

今回のデータは全部で500レコード(500日分)ですので、8割にあたる400件を訓練データとしてモデルの学習用に、残り100件をテストデータとして分割しましょう。

前のステップで表示させたデータの最後2行と上記の出力を確認して見てください。ターゲットや終値など、全ての値が合致しているのが確認できます。(つまり正常に分割が行えた)

データの最終処理として特徴量(X)とターゲット(y)へ切り分けを行います。

これでデータ処理、完了です!

STEP4 モデル訓練

では、下準備した訓練データを使ってロジスティック回帰のモデル訓練を行いましょう。前述した通り今回は便宜上、Scikit-learnを使います。

機械学習ライブラリを使うと、本当に簡単にモデル構築が行えます。しかし、機械学習を始めたばかりの方にはあまりお勧めできません。時間がある方は入門書などを購入して、自分でスクラッチで組んでみましょう。

STEP5 テストデータから予測と評価

モデル訓練には訓練データを使いました。つまりモデルは訓練データの内容を「学習」しており、そのまま訓練データで予測をしても本質的な意味での推測にはなりません。

ということで、テストデータを使って予測して見ましょう。これまた、Scikit-learnのpredict()を使うことで簡単に行えます。

では、混同行列を使ってどれほど正しく予測できたか評価して見ましょう。混同行列(英:Confusion Matrix)は、今回のような分類モデルの評価を行う際に使われる最も初歩的な評価手法です。

混同行列の数値ですが、下記のような意味です。ロジスティック回帰で当日終値が翌日に「上昇するか」「下降するか」を予測した結果が下記です。

結果として実際に下降した46日のうち、モデルが下降すると予測できたのは33日でした。また、実際に上昇したのは53日ですが、そのうちモデルが正しく上昇と予測できたのは13日です。

混同行列ですが、分類の評価では頻繁に使われます。慣れるまではややこしいですが、これを機会に読み方を覚えておくと便利です。

では、今回のモデルの正解率(英:Accuracy)を計算してみましょう。正解率とは、モデルが実際にデータに対してどれほど正しく予測できたかを表す指標です。

び、び、微妙ですね!(笑)このロジスティック回帰のモデルを信用してトレードをしたら、確実に負けること必須ですね。

STEP6 確率を確認してみる

翌日の終値が今日よりも上がるのか、下がるのかを予測したところ、全く使い物にならないモデルが出来ました(笑)でも、安心してください。これでも使い道があります。

ロジスティック回帰の大きなメリットの一つとして「確率」が確認できると紹介しました。では、実際に確率を確認してみようではありません!Scikit-learnのpredict()では特徴量からターゲットの予測を行いますが、predict_proba()を使うことでそれぞれのクラスの確率を確認することが可能です。

こちらですが、左側の数字がターゲット「0=下降」する確率で、右側が「1=上昇」する確率を表しています。確率ですので、当然1行を足せば「1=100%」となります。

このままでは扱いにくいのでPandasのデータフレーム形式へ変換してあげましょう。

これで見やすくなりましたね。読み方として、最上部の行を見てください。Actualとあるのが正解です。つまりこの日の翌日の終値は「0=下降した」のが実際のデータです。

では確率を見てください。down_probaはレートが下降する確率ですが、若干ではありますがup_proba(上昇する確率)よりも高いのがわかります。つまりロジスティック回帰の判断では、「自信はあまりないけど・・どっちかといえば・・上がるんじゃないっすか?」ってことですね。

では4行目(index = 3)を確認してみましょう。この日の正解は「0 = 下降した」ですが、確率を確認すると54%下降するとモデルは予測しています。つまり、ロジスティック回帰の判断としては「1行目よりも少しだけ下降する自信あるっす!」って訳ですね。

このように確率を確認できるのは非常に有益な情報となります。では、ロジスティック回帰が「下降する」と予測したデータのうち、さらに自信が高い=確率が高いレコードのみを確認して見ましょう。

「Actual=正解ラベル」に注目してください。モデルが出力した確率56%で区切ってみると・・なんと100%の確率で実施にレートが下がっているではありませんか。

では、今度は上昇した確率が高いレコードも確認して見ましょう。

上記の出力はモデルが上昇すると予測した確率が56%のレコードです。実際に見てみると・・全部で8レコードあり、実際に上昇した(Actual = 1)は3つしかありません。

おいっ(怒)

STEP7 トレンドを確認しながら予測結果を吟味する

ロジスティック回帰で確率が出力できるのは便利なのがわかりましたが・・それだけでは実戦トレードで活用するには厳しそうでした。

そこで、おすすめなのが全体のトレンドを確認しながら、ロジスティック回帰の確率を一つの参考として使うトレード手法です。

では、Matplotlibを使って終値、さらにロジスティック回帰が予測した「上昇する可能性」をチャートにして見ましょう。

上部のプロットはテストデータ期間(100日)の終値の推移です。対して下部のプロットは各日にちに対して翌日の終値が上昇する確率をプロットしたものです。便宜上、0.5=50%の部分に緑色の直線を引いてみました。

まずは①を確認してみてください。この日の予測は上昇する確率が高いとありますが、翌日の終値をみると下がってます。予測確率だけでトレードすると大損しますが、それ以前のレートの動きから考えると、ここでレートが反転するのか?逆にしないとなれば近日中か?と推測は可能です。

②のポイントも若干ではありますが、上昇する確率が高いとモデルは予測しています。それ以前のレートをみると、このまま上昇傾向になり得そうだな?ってことはひとまずは買い注文か?と推測が可能です。

ロジスティック回帰の予測のみでは、正直、役に全く立ちませんが、このように予測した確率を一つのテクニカル指標として活用は可能だと思います(少なくとも私は!w)

まとめと次の課題

少し長くなりましたが、如何でしたでしょうか?今回はFXトレードでロジスティック回帰を使って独自のテクニカル指標を作ってみるという流れをまとめてみました。

結果を見れば、全く使えなさそうな予測精度でしたが安心してください。ここからがむしろスタートです!

今回、一緒にコーディングしたロジスティック回帰は基本中の基本と考えてください。まだ、ここから精度を大幅に改善する方法は無数にあります。

ぜひ、色々なデータを触りながら、試行錯誤して自分のトレードスタイルに最もあったロジスティック回帰シグナル(勝手に命名)を作ってみては如何でしょうか?

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

使っているFX会社はどこ?
仮想通貨用(2019年5月からAPI取引対応) → GMOコイン
Python API用(FX APIはここしかない) → OANDA ジャパン

FX 機械学習

Posted by algon