Pythonで株価データの取得と関数フィッティング

機械学習やらなにやらが流行っているのでPythonで何かやってみたいと思ってました。

どうせならお金になることやりたいなという不純な理由で株データの扱いをちょこっと手を出してみたので備忘録として書きます。

環境

・Python 3.5

使用したライブラリ

・pandas
・pandas-datareader
・numpy
・matplotlib
・scipy

株データの取得

調べればいろんなサイトでやり方が紹介されているので以下ではコードの紹介のみにします。例えば以下のサイトを参考にさせていただきました。
https://nkmk.github.io/blog/python-pandas-datareader/
http://d.hatena.ne.jp/graySpace/20161204/1480837324

pandasという便利なライブラリがあるので、それを使っていました。

ただ、pandasだとgoogleやら米yahooからの株価取得のみかと思うので、円で日本株を取得したければ、jsmモジュールなど使う必要がありそうです。
http://qiita.com/HirofumiYashima/items/0ef0f1a631ef1ebb2a47

株価データの処理方法

pandasでデータ取得すると”DataFrame”という形で結果が返るので、最初扱いが良くわからず、結構はまったのでどうやればデータ処理できるかがこの記事のメインです。

データ間隔の調整

pandas-datareaderのDataReader関数を使うと以下のようなデータが得られます。

Date AAPL
2006/1/3 9.684577
2006/1/4 9.71308
2006/1/5 9.636639
2006/1/6 9.885393
2006/1/9 9.853004

基本日ごとのデータが返されますが、週ごとやら月ごとのデータが欲しくなります。

そういうときは”resample”なる関数を使うとできます。

いろんなサイトを見ていると、mean()を使用しているのですが、この方法だとうまくいきませんでした。

以下のようにシンプルにやると月ごとに取得できます。

2015/12/31 57.85409091
2016/1/31 51.77947374
2016/2/29 42.37999995
2016/3/31 46.00227291
2016/4/30 46.24619057
2016/5/31 44.88095243
2016/6/30 44.20545459
2016/7/31 43.45300025
2016/8/31 47.14304357
2016/9/30 47.18285714
2016/10/31 49.90428576
2016/11/30 53.67809533
2016/12/31 55.0552379

もしtickerを複数にした場合は、以下のように取得したいtickerを指定することで上記のようなデータが得られます。

データのフィッティング

株が上がるかどうかを判断するために、関数フィッティングをやってみます。

フィッティングの結果、次の日、次の週、もしくは次の月に株が上がるかの指標にならないかという話です。
(システムトレードって簡単に言えばこんな方法なんでしょうか?真面目に利益を出したいならそこらへん勉強したほうが良さそうです。)

今回やってみた方法はフィッティングしたい関数を定義して、パラメータ最適化してくれる方法です(一番楽なんじゃないかなと思います)。

関数は3次関数にしてみました。

ポイントは、
1.numpyライブラリでx軸をリスト化
2.関数定義
3.パラメータ最適化
です。

それぞれ1行でできたのが驚きでした。こんなに簡単にできるとは思ってなかったので、python様様です。

結果は下図のようになります。(青が生データで、緑がフィッティングです。)

ちなみに、日ごとのデータの結果が下図のようになります。

これみてわかるのが、フィッティングすべき関数と期間の選定が難しそうってところですね。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です