為替の予測をロジスティック回帰でやってみる(機械学習3回目)

2018年11月2日

タロットカード

今回は機械学習シリーズの第3弾で、ドル円の価格予測を機械学習でやってみようと思います。

機械学習のモデルには、ロジスティック回帰を利用します。

興味のある方は、以前の記事も参照いただければと思います。

FXの環境認識に機械学習を使ってみる(機械学習1回目)

為替において単回帰分析で何ができるか?(機械学習2回目)

ロジスティック回帰とは

ロジスティック回帰(ロジスティックかいき、英: Logistic regression)は、ベルヌーイ分布に従う変数の統計的回帰モデルの一種である。連結関数としてロジットを使用する一般化線形モデル (GLM) の一種でもある。1958年に David Cox が発表した[1]。確率の回帰であり、統計学の分類に主に使われる。医学や社会科学でもよく使われる。

モデルは同じく1958年に発表された単純パーセプトロンと等価であるが、scikit-learn などでは、パラメータを決める最適化問題で確率的勾配降下法を使用する物をパーセプトロンと呼び、座標降下法や準ニュートン法などを使用する物をロジスティック回帰と呼んでいる。

出典: フリー百科事典『ウィキペディア(Wikipedia)』

もう何を言ってるのか全然分からないですね。

機械学習をやるうえで内容を完全に理解しながらプログラムを書いていくのはとても難しいです。

よく分からないものを利用することに抵抗があると思います。

しかし、よくよく考えていくとエクセルなどの表計算ソフトを当たり前のように使っていますが、どのような仕組みで動いているのか理解していません。

エクセルというアプリケーションが提供され、そのうえで日々の業務をこなしていく。

機械学習もそれと同じような考えで臨むのが良いのではないでしょうか。(できる人は理解したうえでやってください。)

もちろん、少しでも理解するために裏で学習は進めていきましょう。

 

モデルについて完全に何も知らない状態ではさすが使えないので、ロジスティック回帰については以下のようにざっくり理解しておきましょう。

ロジスティック回帰の簡単な特徴

  • 説明変数(パラメタ)は複数入力可能
  • 目的変数(予測値)は0 or 1で入力
  • 目的変数(予測値)が1になる確率を求める

ロジスティック回帰の数式をグラフで表すと以下のようになります。

結果が0.5を超えれば1になる確率が高いので、「1」と予測できます。

ロジスティック回帰のグラフ

 

方針

「何のデータを使って」、「何を予測するのか」を考えます。

色々パターンは考えられるのですが、今回はより実践に近い以下の状況を想定します。

「当日の始値で買いエントリーし、エントリー価格から+[N]pipsの利食い値まで当日中に到達するか?」

※最終的にマイナスになったとしても、一時的に[N]pipsを超えればOKと判断します。

指値で利食い値を設定しておく想定なので、一時的にでも超えれば利食いできたという判断です。

 

※プログラム言語はPythonを使います。

※検証データは【ドル円】「2010年1月1日」~「2017年1月1日」の日足とします。

 

説明変数を決める

当日のデータを予測するため、使うのは前日までに取得できるデータのみです。

今回はシンプルに価格の4本値(始値、終値、高値、安値)から割り出せる数値のみ使うことにしました。

(外部から日経平均やダウなどを引っ張って来ないで、為替(ドル円)のみのデータで検証するという意味です。)

 

具体的には、4本値から導くことができる値とテクニカル指標を大量に入力データとします。

数が多過ぎるので全量は書きませんが、以下にいくつか抜粋しものを掲載します。

  • 1日前のプラスマイナス判定・・・1日前の終値 – 1日前の始値
  • 移動平均線・・・100期間の単純移動平均の値
  • RSI・・・2期間、5期間、14期間のRSIの値
  • ADX・・・14期間のADXの値

 

目的変数を決める

「買いエントリー価格から+[N]pipsの利食い値まで当日中に到達するか?」

というのが予測したい値になります。

「当日の高値 – 当日の始値」がプラス[N]pipsより大きくなるか?

[N]pips以上なら「1」、それ以外は「0」にします。

 

プログラミングと検証

まずは何も考えずに作成します。

全部の説明変数を使い、10pips上がるかどうかを判定できれば良いかなと思います。

 

検証1回目

1. 必要なライブラリをインポート

ロジスティック回帰を行うために必要なライブラリをインポートします。

 

2. データの取込みと目的変数の作成

BODYには「高値 – 始値」が格納されており、その価格が0.1(10pips)以上ならば目的変数(RISE)に1を格納して、それ以外ならば0を格納しています。

dfの中身を確認すると以下のようになります。

データ分析の表

 

3. パラメタの単位を揃える

このようにある程度の塊にすると、傾向が見えやすくなります。

[単位を揃えなかった場合]
細かすぎてよくわからないですね。

RSIの細かいグラフ

[単位を揃えた場合]
これなら少しは傾向が見えます。

RSIを丸めたグラフ

 

4. 説明変数と目的変数の設定

dfから不要な説明変数を削除したものをXに格納します。
BODYはRISE(目的変数)を作成する元にしたデータのため不要で、RISEは目的変数なので説明変数には不要です。
RISEは目的変数なので、Yに格納します。

 

5. モデルの作成と検証

トレーニングデータとテストデータに分割して検証します。

このプログラムを実行した結果、以下のような数値が出ました。

0.733652312599681

結果が「1」に近いほど予測値に対して、結果が正しかったということなので良い結果なのではないでしょうか。

 

6. 落とし穴

実はこの検証結果には大きな落とし穴がありました。

先ほどのプログラムの「closs_predict」という変数に予測した結果が「0 or 1」で格納されていますので、中身を確認しました。

全て1

ご覧の通り・・・全て「1」だったのです。

これはとんだぬか喜びでした。。。

何が悪いのかを考えた結果、1つ怪しい点が見つかりました。

先ほど載せたRSIのグラフですが、よく確認してみるとRSIが0~100全てのケースでRISEが1になる可能性の方が高いということが分かります。

つまり、「条件関係なしに当日プラス10pips利食いできる確率は極めて高い」のです。

 

試しに、条件なしで10pips利食いできる確率を計算してみました。

10pips利食いできる日が「1555日」で、できない日が「535日」で合計2090日です。

1555日 ÷ 2090日 = 0.7440191387559809

はい。。。先ほどの結果とほぼ変わらないので、全く機能していないことが分かりました。

元々10pips利食いできる確率は74%程度で、ロジスティック回帰の結果73%程度であったということです。

 

検証2回目

検証1回目から学んだ、モデルが機能するかを評価する基準は以下です。

「条件なしで起こりうる確率」と「モデルの正解率」を比較して、一定以上モデルが優れていなければならない。

 

1. 目的変数の条件を変更

検証1回目では目的変数を0.1(10pips)以上で分けましたが、今度は0.25で分けます。

これなら先ほどよりは少し傾向が見えてきそうです。

RSIを丸めたグラフ

 

2. 無駄な説明変数の削除

明らかに機能していない説明変数を削除しました。

具体的には以下のグラフのように、人間がぱっと見で傾向を見つけられないものです。

DEMのグラフ

 

3. 検証

検証結果は以下のようになりました。

0.62360446570972883

ここで先ほどのようなぬか喜びになっていないかを確認します。

まずは予測結果が「1」のみになっていないことを確認しました。

0と1の表

今度はしっかりと「0 or 1」で予測しているようです。

さらに条件なしで25pips利食いできる確率を確認します。

25pips利食いできる日が「1056日」で、できない日が「1034日」で合計2090日です。

1056日 ÷ 2090日 = 0.5052631578947369

先ほどの予測値の方が数値が良さそうですね。

0.62360446570972883 – 0.5052631578947369 = およそ0.118

条件なしに買いエントリーした場合よりも、11.8%良い結果となりました。

この値を大きいと捉えるか小さいと捉えるかは人それぞれですが、不確実な世界において10%以上の差はとてつもなく大きいという感じがします。

 

最後に

いかがだったでしょうか。

だいぶ遠回りしていますが、少しは可能性のある数値が出たのではないかと思います。

「結局どう使うんだ?」という話が出ると思いますが、最終的にはメタトレーダー(MT4/MT5)にデータを連携しようと思っています。

例えばですが、Pythonで環境認識したり今回のように25pips上がる確率を求め、MT4/MT5にデータを受け渡します。

MT4/MT5側でそのデータを見たうえで、「今日は買い方向のみ」といったフィルターに使います。

ある程度かたちになったタイミングでプログラムを公開しますので、少々お待ちください。

 

MT4/MT5で為替の自動売買をする方法は、「メタトレーダー(MT4/MT5)で自動売買するための事前準備(第1回)」をご参照ください。