プログラミング

機械学習でFXの聖杯を見つけたと思ったら勘違いだった話

初心者がFXで機械学習をする

私は株価のスクレイピングの記事でも書いたように、まったくプログラミングの経験がありません。しかしながら、機械学習に対する漠然と憧れていました。そこで今回はFXで機械学習を行って、上がるか下がるかを予測できるようにしたいと思います。値動きやテクニカル指標を見て取引し、勝っている人がいるということはそのデータをいれてやれば私のような凡人でも聖杯を見つけることができるのではと考えました。初めての機械学習なので、比較的理解しやすいランダムフォレスト法を用いています。

プログラミング前の下準備

今回はGoogleのColaboratryを用いて行いました。Colaboratryは無料で12GBのメモリが使用できます。これは私が使用しいるPCのスペックより高いので、嬉しいのか悲しいのか複雑な気持ちですが、ありがたく使わせていただきます。Colaboratry用のデータの読み込みコード等も省かずにのせていきたいと思います。

まずはFXのデータをダウンロード
FXのデータはHistData.comよりGeneric ASCII形式でダウンロードすることができます。2016年のEURUSD1分足をダウンロードしました。

実際に機械学習

まずは必要なライブラリを読み込みます。

次に先程ダウンロードしたファイルをアップロードします。
ここで、参照をクリックして、ダウンロードした場所をひらいてファイルを選択します。

データフレームとして読み込みます。

特に意味はないのですが、プロットして確認したりするのも楽しいです!

次に終値の差分を取っていきます。diff1は一日前からどれだけ値段が変わったか。diff5とdiff10はそれぞれ5日前、10日前から終値がどれだけ変化したかです。ランダムフォレストは一行のデータだけでモデルを調整するので、始値や終値よりも差分の方が大事なデータになると考えています。

次に列の名前をそれぞれ整え、空の行を削除します。
今回は5分先の終値がどうなっているかを予測したいので、diff5を前方に5つ分ずらすことで、正解のデータを作成します。

ここで、そもそも5分でどれくらい価格が動くのか確認します。ヒストグラムを作成することで5分後の価格の動きの分布をみることができます。
本当はここで、統計的に目標を定めるべきなのでしょうが、なんとなく0.0005動くかどうかを予想したいと思います。ちなみにこれはFXでいう5pipsに相当するので、予想できれば十分に利益が出ると考えられます。

そこで、+5pips以上なら2、0~5pipsなら1、0~-5pipsなら-1、-5pips以下なら-2のラベルを振ります。

いよいよ実際に機械学習していきます。まずは、データをトレーニング用とテスト用にわけます。トレーニング用にはデータの80%を使い、そこで学習した内容を残りの20%のテストデータで検証します。

まずは、トレーニングデータで分類器を作成します。

実際にトレーニングデータとテストデータがどれくらいの正解率か確認すると、トレーニングデータでは当然ながハイスコアですが、テストデータでは正解率が50%をきっています。しかし、ここで考えなくてはいけないのは4種類に分類する問題なので、それぞれの正解率が大事てあること、また、5pips動かないと予想して動いた分には単なる機会損失なので実際にお金はなくなりませんが、5pips動くと思ってトレードして逆に行ってしまうと損が出てしまいます。つまり、適合率の高さが重要になってきます。

そこで混合行列を確認します。
5pips以上または-5pips以下だと予想して反対に大きく動かず正解する確率は60%であり、動かないとしても若干予想方向に動くことが多いことが分かります。また取引数もあるので、優位性のあるトレードが行えると考えられます。
こんなに簡単なデータセットで勝てそうな予想ができるなんて!!!!!!と、興奮しましたが、現実はそんなに甘くありませんでした。

幻に消えた聖杯

このシステムを実装しようと考えたとき、ふとトレーニングデータとテストデータの分割の仕方がよくないことに気づきました。予測ためには過去のトレーニングデータによって未来の予想をしなくてはいけません。しかし、私の分割方法ではランダムに抽出しているため、未来のデータから過去のデータを予想してしまうことになります。

そこで、shuffle=Falseを追加することでランダムに抽出するのではなく、データを前後で分割します。

そして、混合行列を表示すると、完全に優位性を失っていることが分かりました。適合率もほぼ50%であり、これではまず勝てないでしょう。
やはり、テクニカル要素の追加や、パラメータの最適化を行わないとだめなようです。

Pythonで証券会社からスクレイピング(例外を取り除く)

前回のおさらい。今回したいこと。

前回までで、自動で証券会社にログインしてスクリーニングを行い、合致したものをpandasで取り込み整形することができました。証券会社のスクリーニング機能は無料で公開されているものよりもはるかに多くの設定が可能です。しかしながら、すべての要素を含んでいるわけではありません。そのため、会社の不祥事でニュースに取り上げられるなど、非定量的なデータに弱くなります。そこで、今回はスクリーニングにかかったとしても買いたくない銘柄をグーグルのスプレッドシートと連携して除外する方法を考えます。

グーグルスプレッドシートで例外を登録

まずは、スプレッドシートにもしスクリーニングにかかったとしても買いたくない銘柄を記入していきましょう。グーグルスプレッドシート(https://www.google.com/intl/ja_jp/sheets/about/)はエクセルと似た機能を持っており、オンラインで使用できることから、どこからでも容易にアクセスすることができます。シートに銘柄コードを打ち終わったらファイルの共有ボタンからリンクを発行し、リンクを知っている全員が閲覧可能な状態にします。

python上のスクリーニング結果から除外

まず、おなじみのpandasでグーグルスプレッドシートのスクレイピングを行います。”google spread sheet link”にはさきほど取得したURLリンクを打ち込んでください。

次に、不要な空白行を消去します。

まず最初の行では列要素の空白行を削除しています。axis=1は列方向をhow=’all’はその列がすべて空白であった際に列を削除することを指定しています。二行目は空白を含む行すべてをhow=’any’で指定しています。この作業で除外したい銘柄コードを抽出できました。

銘柄コードは抽出できましたが、グーグルスプレッドシートからスクレイピングしたコードはなぜか小数になっています。そこで、整数に直します。その後文字列に変換して(なぜか分かっていないのですが、文字列にしないと最後のスクリーニング結果との比較ができませんでした。。。)、スクリーニング結果から、除外したいコードと一致するものを除くことで、スクリーニング設定に含められない判断を反映することができました。

Pythonで証券会社からスクレイピング(データ整形編)

前回のおさらい。今回したいこと。

前回はスクリーニング結果をスクレイピングによって取得するところまで行ないました(スクレイピング編)。しかし、このままでは必要なデータと不要なデータが同じセルにはいっていたりとデータを上手に扱うことが出来ません。そこで、pandasの基本的な機能を使いながらデータの整形を行ないます。

必要な要素の確認

まず、取得したデータにはいくつかのデータフレームがはいっていますが、目的のデータは2つ目にはいっているので、その部分を取り出します。
中身を見てみると、

  連番 銘柄 現在値
0 1 *東16773パイオニア 174 15:00+2.0 (+1.16%)

上記のようなデータになっていると思います。銘柄には取引市場と銘柄コード、銘柄名が一緒に入ってしまっています。また、現在地の部分には、現在地の他に取得時間と騰落率がはいっています。実際にスクリーニング結果にもこれらの要素は同一セルにはいっているため、分離する必要があります。

銘柄コードと銘柄名の取り出し

銘柄コードと銘柄名を取り出していきます。取引市場はすべて*〇〇の形式で表示されており、東証一部なら*東1、JASDAQなら*JQといった具合になっています。

そこで、まず銘柄コードはセル内の4文字目から7文字目に表示される部分であることが分かるので、その部分をnumberとして取り出します。次に7文字目以降の文字列が銘柄名になっているため、nameとして取り出します。また、現在値のセルはそれぞれスペースによっと区切られているため、スペースで別々のセルに区切ります。 最後にそれらをあわせて一つのデータフレームとし、それぞれの列に名前をつけると自分がスクリーニングをかけた株の銘柄コードと名前、現在値のはいったデータフレームを得ることができます。

Pythonで証券会社からスクレイピング(スクレイピング編)

前回のおさらい。今回したいこと。

前回はseleniumを使ってカブドットコム証券にログインする方法を書きました。seleniumを使えば簡単にログイン処理をすることができます。
今回は、ログイン後に実際にスクレイピングによって、必要なデータをpythonまで持ってくる方法を考えます。

kabuナビでスクリーニングする

カブドットコム証券にログインすると以下のようなページがでてくると思います。
スクリーニングには赤い矢印の部分にある、kabuナビを用いるので、kabuナビのエレメントをクリックします。

kabuナビをクリックすると新しいウインドウが表示されるので、操作するウインドウを切り替えます。その後詳細設定をクリックするのですが、ウインドウ変更後に要素を探しても、見つからない旨のエラーが返ってきます。私はここでつまずきました。HTMLにはインラインフレーム要素というものがあり、要素を入れ子状に埋め込むことができます。このインラインフレーム要素にフレームを切り替えないとインラインフレーム要素を探してクリックすることはできません。

また、新しいウインドウを開いた際に表示される前に操作を行ってしまうと要素が見つからずエラーが返ってきてしまいます。そのため、読み込みのために操作を一時停止するsleepをいれ、その後、スクリーニングのための詳細検索のページに移動します。

次にお気に入りから自分の設定したフィルタを適用します。このお気に入りの設定は事前に自分でしておく必要があります。PERやPBRなどの基本的な指標から、有利子負債比率や売上高変化率など細かな設定を行っておくことが出来ます。この細かい設定が可能なところが証券会社のスクリーニング機能を使うメリットです。
マウスオーバーによってひらくメニューは、通常状態でエレメントとして探すことが出来ないため、seleniumで擬似的にマウスオーバーする必要があります。その時に使えるのがActionChainsです。

最後に検索ボタンを押すことで、スクリーニング条件に合致する株式の一覧が表示されます。

表示された株式の一覧は以前に株価データサイトから取得する記事に書いた株価のスクレイピングと同様の方法でpandasを使ってテーブル形式でそのままスクレイピングを行ないます。

Pythonで証券会社からスクレイピング(ログイン編)

何を基準に株を選ぶか

株の銘柄は日本だけでも数千の銘柄があり、その中から自分の買いたいと思う銘柄を探すために色々な指標が考えられています。例えば、テクニカルな指標であれば騰落率や平均線からの乖離など、株価のみから読み取れるものもありますが、株価収益率(PER)や株価純資産倍率(PBR)などのファンダメンタルな指標を加味して探したいと考えると、フリーアクセスのサイトでは物足りないことがあります。
そこで、証券会社の提供しているスクリーニング機能を使って目的の銘柄を探す方法を考えます。

この記事でしたいこと

証券会社のホームページにログインし、スクリーニング機能を用いて目的銘柄を抽出した後に、結果をスクレイピングによって取り出し、整形作業を行います。

まずはログイン

まずライブラリのインポートを行います。
seleniumはウェブブラウザを操作するためのライブラリです。
また、ActionChainsはマウスオーバー操作の時に使用します。
pandasはデータを取得後の整理に使います。

一行目で使用するブラウザにChromeを指定します。
次に、カブドットコム証券のページをChromeで開きます。

上記のようなログインページが開いた後、➀に自分のidを打ち込み次いで➁にパスワードを打ち込み、最後にログインします。

pytho事始め 本当のゼロからはじめるpyhon

プログラミング経験

読み書き算盤の時代から読み書きプログラミングの時代になったと言われて久しくなりました。たくさんのプログラミング体験記がネットに存在しますが、多くは少しプログラミングをかじったことのある人や、他の言語を知っている人の記事です。そこで、本当にゼロから始める体験記を書こうと思います。

なぜpythonか

「初心者 プログラミング」で検索すると多くの言語がおすすめされています。Java、Ruby、PHP等どれをするのが正解か分かりません。私は漠然と人工知能やクオンツといったデータ解析に興味があったのでpythonを選びました。一人でする勉強はモチベーションの管理も難しいので、憧れやかっこよさで選ぶのもいいと思います。また、アルゴリズムトレード等ができるようになれば、お金も少しはいってくる

のではないかという下心もあります。

まずは株価のスクレイピング

プログラミングの最初の大きな課題として、何を目標にすればいいのか分からないということがあると思います。私はアルゴリズムトレードを最終的な目標として、プログラミングを学習していきたいと思います。まずは、データの取得方法ですが、株価を提供してくださっている株価データサイト(http://k-db.com/)というものがあります。今回はこちらを利用させていただきます。pythonで簡単にテーブルをスクレイピンするためにBeautifulSoup4とpandasというライブラリを使います。コマンドプロンプトで

pandasをダウンロードします。 pandasはpythonのデータ解析用ライブラリで、表などが扱いやすくなります。

pandasをダウンロードします。 pandasはpythonのデータ解析用ライブラリで、表などが扱いやすくなります。

一行目ではpandasを使えるようにpythonに読み込みます。

二行目は株価データサイトの株価がのっているページにアクセスしてtablesに格納します。なお、この方法はこちら(https://qiita.com/driller/items/0fe323dec5bb2f267c96)を参考にしました。

flavorの説明はまだよく分かっていないの

で、分かり次第追記します。。。

データをとってくるだけではつまらないので、この中から150円以下の株価をつけている株だけを抽出します。

さきほど手に入れたデータはテーブルとして格納されているので、リスト型にいれなおします。

その後、5列目の現在値が150円以下の株を抽出します。

まずは、データのスクレイピングと簡単な抽出ができるようになりました。今後も勉強を続けて、もっと複雑なことができるようになりたいと思います。