ストックドッグスマートフォン用の表示で見るストックドッグKatoTakahiro。金融系の会社で働くSEが株やPython、その他諸々について書いています。前処理モデルの学習もう一段ステップアップするには何をしたらいい?まとめ今回使ったコードはじめにプログラミングを始めたばかりの人、機械学習を使って株価を分析してみたい人、このような人たちのために記事にしました。助けとなれば私はうれしいです。全てを読めば、株価を予測するためのコードを理解することができるよう心がけました。理解することが大事なので、コードはシンプルにしてあります。ひとつ注意点があります。この記事を読むことで、株価を予測するためのコードは理解できるようになりますが、株価の予測はできません。株価の予測は非常に難しいことであり、たくさんの工夫が必要です。この記事は最初の一歩になると思います。一歩さえ踏み出してしまえば、あとは各自で工夫していけるはずです。ページの最後に本記事で使用したコードを掲載しています。ランダムフォレストです。ランダムフォレストは、調整が必要なパラメータが少なく過学習もしにくいため、機械学習の中でも扱いやすい部類に入ります。言って、判別精度が悪いわけではないので非常に優秀な手法です。ランダムフォレストについて詳しく知りたい方は以下の記事を参考にして下さい。本記事で予測するのは、野村総合研究所(4307)の株価です。)がダウンロードできます。CSVと書かれている部分をクリックするだけです。CSVダウンロード次に説明変数となるデータを集めてきます。野村総合研究所の株価を予測するには、野村総合研究所の株価データだけでは足りません。何を集めてきたらいいでしょう?まずは日経平均株価かな、次はTOPIX?あとドル円データも欲しいな...あとは原油価格もあればうれしい、といろいろとあると思います。あげだしたらきりがないし、正直それぞれ集めてくるの面倒くさいですね。いうか、こういうデータは自分で考えながら集めてくるものはありませんね。集めれるだけデータを集めて、そこから説明変数として効果的なものを選びだすほうが効率が良いです。少なくとも私はそうしています。いうことで、ここに載っているデータを適当に集めましょう。ここにETF一覧が掲載されています。stocks.finance.yahoo.co.jpあれ?ETF??私が探しているのは日経平均株価とか為替データで...いいんです、ETFで。ETFについて、とても軽く説明します。知っている方は読み飛ばして下さい。ETFというのは、上場投資信託というもので、その名の通り投資信託が上場しているんです。ヨーロッパ・アメリカでは有名な金融商品であり、最近は日本でも注目度が上がっている商品です。投資信託と比べて色々とメリットはあるのですが、話が逸れそうなので詳しくは他のサイトに譲ります。ETFは説明変数候補として集めるかというと、指標と連動させている商品だからです。これは日経平均株価と連動するように運用されています。組み込むのは同じこと、になるんです。とうもろこしなどなど。これらの指標は説明変数になりえます。いうことで、先ほどのETF一覧を見ながら、野村総合研究所の株価データをダウンロードしたサイトから集めてきましょう。全部集めるのはしんどいので、適当に選びましょう。上場インデックスファンド日本高配当(東証配当フォーカス100)これらをダウンロードしました。プラスアルファ手動でデータを集めてくるのもいいですが、効率良く集めたいならスクレイピングがいいです。スクレイピング]でググってみましょう。スクレイピングが簡単にできることがわかると思います。今回は、できるだけ記事をシンプルにしたいので余計な技術は使いません。データが集まったらいよいよ前処理です。前処理がおそらく一番難しくて、大変な作業です。前処理ですること野村総合研究所のデータと全てのETFのデータを統合して、ひとつの.csvにまとめるまずは野村総合研究所の株価データを読み込んでみましょう。range(len(df))]print(df.head(10))人によっては、UnicodeDecodeErrorが出るかもしれません。この原因は、ダウンロードしたcsvデータのcolumnsが日本語だからです。部分が文字化けしていると思うので、少し面倒ですがcsvデータからこれらを適当な英数字に修正しましょう。次のステップでETFのファイルを読み込み、それらを野村総合研究所の株価データと統合します。そのために、まずETFのリストを作ります。etf_listにダウンロードしたETFファイルのコードを入れましょう。ETFファイルの名前を「etf_1309.csv]にします。".csv"」にすることで、ループ分を回した時にETFコードの部分を変えるだけで読み込むファイルを変えることができるようになります。1698,#上場インデックスファンド日本高配当(東証配当フォーカス100)]さきほどの名前構成を変更したので、ループ分でetf_listに入っている全てのETFファイルを読み込むことができます。Value"]読み込むことができたら、次はETFファイルと野村総合研究所のデータを統合します。統合する際に少し工夫が必要です。ETFファイルは中身を見て頂ければわかると思いますが、穴ボコです。NaNデータが多く、野村総合研究所のデータとそのまま統合すると、データの長さが異なるためズレて統合されてしまいます。そのため、以下のコードでは野村総合研究所の日付をループ分で順番に取り出しながら、ETFファイルの日付に検索をかけます。日付が一致した日のETFのCloseデータを取り出します。そのCloseデータがNaNであった場合は前日のデータを代わりに入れています。axis=1)#野村総合研究所のデータとETFデータを統合ETFデータは、Closeしか必要はありません。プログラムでは日付データも一緒に追加しています。これは、統合した後に目視で確認しやすいようにです。(出来上がったデータを見てもらえば、確認のしやすさがわかります)よくデータ同士の統合で、データが一段ずれるなどのトラブルが起こります。これはこういったトラブルを防ぐためのちょっとした工夫です。このETFデータにもうひと工夫する必要があります。ETFのデータを階差系列に変更する必要があります。このステップは非常に重要で、ETFの価格自体を説明変数として使っても、野村総合研究所の株価データは説明することはできません。そのため、前日比などに変更する必要があります。このコードをfor文の中に入れてやる必要があります。1これで前処理は終了したので、新しくできたデータフレームをcode_4307_plus.csvとして保存します。df.to_csv("code_4307_plus.csv")モデルの学習ここで新しくファイルを作成しましょう。機械学習で株価を予測します。構築するモデルは、過去249日を学習して、250日目を予測するというものです。RandomForestClassifierETFデータを統合した野村総合研究所の株価データを表示しましょう。ascending=False)print(df.tail(20))ETFデータが全て統合されたデータが表示されたはずです。このデータをテストデータとトレーニングデータにわけます。df.iloc[1:len(df)-1]#はじまりを[1:]としているのは、階差系列をとっているため[1]がNaNデータだからです。#学習データにNaNデータがあると、エラーがでます。df.iloc[len(df)-1:len(df)]#テストデータには、一番最新のデータを入れます。説明変数として使用するものをリストにしておきます。"diff_1698",#上場インデックスファンド日本高配当(東証配当フォーカス100)]ここで学習用のデータを作ります。学習データの作り方は、x日のデータ(ETFの前日比)を説明変数に、x+1日の騰落を目的変数に入れます。x+1日の株価が上昇していれば、+1を入れ、下落していれば-1を入れます。y_train)n_estimatorsは、ランダムフォレストを構築するために生成する決定木の数です。基本的には、データ数と同じにすれば大丈夫です。コメントアウトしてあるprint文を表示してもらえば、一日づつズレて入っていることが解ると思います。最後に構築したモデルを使用して、株価を予測してみましょう。データの中で一番最新のもの、つまり、2月7日のETFデータをtest_xとしていれます。-1))マイナス1が出たということは、2/8の株価は下落ということですね。2月8日の株価を見てみましょう。下落しているので、予測は当たっていることになります。以上で予測は終わりです。興味が湧いたという方がいればこのコードを少し修正して、他の日もシミュレーションをしてみると良い練習になると思います。散々な結果がでると思います。一段ステップアップするには何をしたらいい?ちょっと物足りないという人は他にも色々と試せることはあります。他の手法を試す数値を指数平滑化する過去249日で1日後を予測しているが、これが最適か考えるテクニカル指標など他の説明変数を試してみるまとめとても簡単でしたね。今は色々なパッケージがあるので、機械学習は簡単に扱うことができます。簡単だったと思うので、この記事を機会に色々と勉強してみると面白いと思います。今回使ったコードベタ打ちですみません。ファイルは2つあります。(27)注目記事プロフィール金融系の会社で働くSEが株やPython、その他諸々について書いています。読者になるスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。