Pythonで株価のデータ分析|株価分析を通してpythonによるデータ分析でできることを学びましょう【株価のデータ取得から、データ加工、指標の追加、グラフ化まで】

Pythonデータ分析

この記事の執筆・監修

キノコード
キノコード    

テクノロジーアンドデザインカンパニー株式会社のCEO。
日本最大級のプログラミング教育のYouTubeチャンネル「キノコード」や、プログラミング学習サービス「キノクエスト」を運営。
著書「あなたの仕事が一瞬で片付くPythonによる自動化仕事術」や、雑誌「日経ソフトウエア」や「シェルスクリプトマガジン」への寄稿など実績多数。

はじめに

こんにちは。キノコードです。
Pythonで株価のデータ分析 (第2弾)|チャートに指標を追加してテクニカル分析【ビットコインや為替 (FX)にも応用できます】」について説明します。

この動画では、MACD、RSI、ボリンジャーバンドのデータ取得方法と、それをグラフするの方法、つまりチャートに追加する方法について解説をします。 この動画紹介をするテクニカル分析は、ビットコインや為替FXにも活用できます。 そこで、ビットコインや為替FXの日足のデータ取得の方法について解説していきたいと思います。 このようなテクニカル指標を使う他に、ローソク足を使って売買の意思決定をしていらっしゃる方もいると思います。 可視化のライブラリが少し特殊なので、ローソク足については、簡単にではありますが紹介していきたいと思います。 証券会社が提供しているツールでやれることに限界を感じている方、プログラミングもついでに覚えたいという方にはぴったりの動画だと思います。 また、会社で売上や在庫などの予測の分析をしている方がいると思います。 金融のデータ分析は私は世界でもっとも難しいデータ分析の1つだと思っています。この題材を通してデータ分析や可視化を練習するのは、奥が深く学びが多いと思います。 金融のデータという興味深いテーマなので楽しみながら学んでいただければと思います。

レッスンで使ったファイルはこちら

キノクエストでアカウントの新規登録に進み、メール認証を完了します。

ログインした状態(プラン選択画面が表示されます)で下記のボタンをクリックしてください。

環境構築

さて、この動画では、前回の「株のデータ分析」のレッスン動画と同様に、日経平均の日毎の株価をもとにデータ分析を進めていきます。
前回の動画では、5日と25日、50日の移動平均を計算。
移動平均を、出来高、つまり、株取引された量とともに可視化をしました。
今回は、他の指標であるMACDやRSI、ボリンジャーバンドを追加したいと思います。ただし、この指標の作成で問題になってくるのがライブラリです。MACDやRSIなどの指標のことをテクニカル指標といい、
Pythonでのテクニカル指標の追加は、Ta-Libというライブラリを使うと簡単できます。
しかし、このTa-libのインストールがクセモノです。
Anacondaのバージョンによってはインストールができなかったり、インストールができたとしてもインストール方法が複雑だったり、環境によってうまくいかないケースがあります。

Dockerを使った環境構築

そこで、この動画では、Dockerを使って株のデータ分析の環境構築をしていきたいと思います。
キノコードでは、「理屈はさておき、最速でDockerを使ってPythonのデータ分析の環境構築をする」という動画を作っています。
この動画のタイトルが長いので「DockerPython」と名付けると、
「DockerPython」の動画通りに進めていけば私と同じ環境構築ができるようになっています。
そこで、この動画では、「DockerPython」の動画をみて頂いている前提で、Dockerでの環境構築を進めていきます。
まだみていない方は、一度、みていただければと思います。
今、右上にカードが出ているはずです。

FROM ubuntu:latest
RUN apt-get -y update && \
apt-get install -y sudo wget vim curl gawk make gcc
WORKDIR /opt
RUN wget https://repo.continuum.io/archive/Anaconda3-2019.03-Linux-x86_64.sh && \
sh /opt/Anaconda3-2019.03-Linux-x86_64.sh -b -p /opt/anaconda3 && \
rm -f Anaconda3-2019.03-Linux-x86_64.sh && \
sudo curl -sL https://deb.nodesource.com/setup_10.x | sudo bash – && \
sudo apt-get install -y nodejs
ENV PATH /opt/anaconda3/bin:$PATH
RUN pip install –upgrade pip
RUN pip install pandas_datareader
RUN wget –quiet http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz -O ta-lib-0.4.0-src.tar.gz && \
tar xvf ta-lib-0.4.0-src.tar.gz && \
cd ta-lib/ && \
./configure –prefix=/usr && \
make && \
sudo make install && \
cd .. && \
pip install TA-Lib && \
rm -R ta-lib ta-lib-0.4.0-src.tar.gz
WORKDIR /
RUN mkdir /work

# コンテナ内での実行コマンド
CMD [“jupyter”, “lab”, “–ip=0.0.0.0”, “–allow-root”, “–LabApp.token=””]

まずDockerfileです。
前回の「株のデータ分析」の動画では、JupyterLab上でpip installで「pandas_datareader」をインストールしました。Dockerで予めインストールしておきましょう。
その記述をしています。
また、Ta-libについてもここの記述でインストールしています。
このDockerfileはキノコードのウェブサイトに保存しています。使われる方はダウンロードしてください。
このDockerfileを任意のフォルダに保存をします。
私はデスクトップに、MyPythonFinanceというフォルダを作成し、Dockerfileを置きます。

docker build -t mypf:latest /Users/kinocode/Desktop/MyPythonFinance

それではビルドします。フォルダの指定はデスクトップのMyPythonFinanceとします。
コンテナ名は、MyPFとします。
「Successfully built」と表示されたらDockerfileからイメージ作成の完了です。

docker run -p 8870:8888 -v /Users/kinocode/Desktop/MyPythonFinance:/workspace –name mypf {IMAGE ID}

次にコンテナを作成しましょう。
ポートを8870とします。パスの記述もデスクトップにあるMyPythonFinanceとしてこれをマウントします。
コンテナ名のmypfの記述も忘れないようにしましょう。
イメージIDは、イメージ作成の時に出力されたものをコピペしましょう。
エンターして実行です。このURLにアクセスをします。
jupyter labが立ち上がったら完了です。
1番の山場をこえました。おめでとうございます。少し休憩です。
キノコードでは、 「より多くの人に、よりよい学習を」という想いで動画を配信しています。
皆さんのキャリアや趣味、学生さんには勉強にお役立ちできる情報を、高いクオリティで提供できればと思っています。
株のデータ分析の続編を出していく予定です。
また、今後、人工知能やデータ分析の動画もアップしていく予定なので、チャンネル登録がまだの方は、新着通知がいくのでぜひチャンネル登録をお願いします。
パソコン画面に切り替えます。

前回の復習

さて、インストールが難しいTa-libのインストールが終わりました。
ライブラリのインポートを進めていきましょう。
まずPandasをpdという名前でインポート。
numpyもインポートしましょう。
次に苦労をしたTa-libです。taという名前で使えるようにインポートしましょう。
そして、pandas_datareader、次にmatplotlibをpltという名前で使えるようにして、matplotlibをJupyterLabで表示させる記述をしましょう。
またmatplotlibを使ってグラフ化をする部分で、日付の変換についてのwarningがでます。グラフ化には問題がないので、その警告を表示させない設定をしましょう。import warninnsと書きます。そして、warningsドットsimplefilterと書いて無視という意味のignoreを書きます。実行します。これで警告がでなくなります。また各種ライブラリのインポートも完了です。
ここからは前回の「Pythonで株価のデータ分析」で説明した内容なので駆け足でいきます。
まず日経平均を読み込みます。
こんな感じのデータです。
次に、日付をdateという変数に、終値をcloseという変数に代入をします。
ちなみに、前回、調整済みの終値をpriceにしていましたが、今回はcloseという変数名に代入をします。
そして、5日間、25日間、50日間の移動平均を算出します。
そして、複数のグラフを表示できる、subplotを使って、2つのグラフを表示するようにしてグラフ化、つまり、可視化をしました。このようなグラフです。もう一度実行するとwarningが消えるようです。
さて、このグラフに新しいテクニカル指標のMACDのグラフを追加していきましょう。

MACDの作成

これがMACDのヒストグラムです。
ただし、厳密にはヒストグラムではなく、ヒストグラムのデータを使って塗りつぶしの折れ線グラフで描いています。
MACDは簡単に説明をすると、トレンドをみる指標です。ゼロ以上なら上昇トレンド、ゼロ以下なら下降トレンドと判断をして、売り買いをします。
ここは上昇トレンド、ここは下降トレンドになっていることがわかります。
さて、このMACDを実装していきましょう。
macdは、TA-Libを使えば容易に描くことができます。
taドットMACDと書きます。最初に引数に、終値を記述します。closeです。
MACDは、短期の移動平均、長期の移動平均、MACDシグナルの3つで成り立っています。
それらの3つを引数に設定します。一般的には、短期の移動平均は12、長期の移動平均は26、MACDシグナルが9に設定することが多いので、そちらを設定します。
これの返り値は3つです。具体的には、MACD、MACDシグナル、MACDのヒストグラム用のデータです。
実行します。
これで、DataFrameにMACD、MACDシグナル、MACDのヒストグラム用のデータができたはずです。
headで確認してみます。
sma01などにもNaNがあります。
これは、移動平均の仕組みを考えればわかりやすいです。
エクセルを使ってみていきます。例えば、5日間の移動平均は、直近5日分の平均が移動していきます。
移動平均は、裏を返せば、5日間、経たなければ平均が算出されません。
したがって、5日間の移動平均のsma01は、最初の4日間、平均が算出されず、NaNになっています。
MACDについても、移動平均を使っているため、最初の方はNaNになるのです。
では、tailを使ってMACDなどのデータができているか確認をしてみましょう。
MACDなどのデータができているようです。
MACDヒストグラムのデータを使って、可視化してみましょう。
ただし、先ほどちらりと触れましたが、MACDのヒストグラムは、ヒストグラムではなく、塗りつぶしの折れ線グラフで可視化をしています。
ヒストグラムで描くこともできるのですが、私はこの方が簡単でわかりやすため塗りつぶしの折れ線グラフで可視化をしています。
今まで出来高をグラフ化していた2つ目のグラフMACDのヒストグラムに変えてみましょう。
塗りつぶしの折れ線グラフは、fill_betweenでできます。
plt.fill_betweenと書いて丸括弧。丸括弧の最初の引数にx軸の値、第二引数にはY軸の値を記述します。つまり、dateと、df角括弧macdhistと記述します。
色はgrey、塗りつぶしの色を透過、透ける設定をしましょう。alphaの引数に0.5を渡します。
ちなみに、alphaは0~1の間で設定をします。
ラベルはMACD_histとしましょう。
MACDは、0以上だと上昇トレンド、0以下だと下降トレンドです。そのため、Y軸に0のところに水平線をひきましょう。
水平線をひくにはhlinesを使います。。ちなみに、垂直線を引くにはvlinesを使います。さて、水平線を描く記述です。
pltドットhilnesと書いて丸括弧。第一引数にラインを引くY軸の値を渡します。1本しか水平線を引かない場合は、そのまま値を記述して、複数の水平線を引く場合には、リストで値を渡します。
次に、第2引数に水平線を描き始めるx軸の値、第3引数に水平線を描き終えるx軸の値を記述します。つまり、startとendを描きます。
線の種類は、今回は点線としましょう。dashedを渡します。
それでは、実行しましょう。
MACDヒストグラムを描くことができました。

RISの作成

次は、RSIを記述してみましょう。
RSIについて簡単に説明をします。
RSIは、「売られ過ぎ」や「買われ過ぎ」を判断する指標です。
一般的には、RSIは、20~30%を下回ると「売られ過ぎ」、70~80%を上回ると買われ過ぎだと判断されます。
したがって、売られ過ぎ場合は逆張りの買いと判断をして、買われ過ぎの場合は逆張りの売りの判断をします。
実際にチャートを見てみましょう。
ここが売られ過ぎていますよね。RSIをみると30%を下回っています。
したがって、ここのタイミングで買えば、その後、価格は上昇して利益を出せたはずです。
このRSIのデータ作成もTA-Libを使えばあっという間にできます。
span02、つまり、25日のRSIを作ってみましょう。
taドットRSIと書いて丸括弧。丸括弧の最初の引数に終値のclose、そして、何日のRSIを作成するか数字を渡します。
今回は、span02、つまり25日の値を渡しましょう。
これをDataFrameのRSIというカラムに代入しましょう。
これでRSIのデータができたはずです。
tailで確認してみます。
データができているようです。
これをグラフにしてみましょう。
線グラフで作成するので、pltドットplot丸括弧。x軸はdate、y軸はDataFrameのRSI、ラベルはRSIとして、色はグレーにしましょう。
RSIは0から100までの値を取りうるので、Y軸は0から100までを表示させましょう。
また、一般的には、RSIが20~30%より下回ると「売られ過ぎ」、70~80%より上回ると買われ過ぎだと判断されるので、30%と70%のところに点線をひきましょう。あわせてちょうど中間の50%のところにも点線をひきましょう。
実行します。
RSIができました。

ボリンジャーバンドの作成

次にボリンジャーバンドです。
ボリンジャーバンドもRSIと同様に、「売られ過ぎ」や「買われ過ぎ」を判断するのに使われることが多いです。
ボリンジャーバンドは、移動平均などの一定期間の平均に対して、これまた一定期間の標準偏差を足したものと引いたもののラインを2本ひきます。
一般的にプラスマイナス標準偏差の2倍を使うことが多く、統計学の考え方から、終値はこの2本のラインの間に収まると考えます。
収まらなかった場合は、売られ過ぎ、買われ過ぎだと判断します。
このボリンジャーバンドの作成もTA-Libを使えば簡単に作成できます。
25日間の移動平均、標準偏差2のボリンジャーバンドを作ってみましょう。

df[“upper”], df[“middle”], df[“lower”] = ta.BBANDS(close, timeperiod=span02, nbdevup=2, nbdevdn=2, matype=0)

taドットBBANDS丸括弧。第一引数に終値のcloseを渡して、timeperiodにspan02つまり25日を渡します。
上のボリンジャーバンドも下のボリンジャーバンドも標準偏差2としましょう。
matypeには0を渡します。0を渡すと単純移動平均となります。
1を渡すと指数移動平均、2を渡すと加重移動平均のボリンジャーバンドになります。
戻り値は3つになっていて、1つ目は上のボリンジャーバンド、2つ目は移動平均、3つ目は下のボリンジャーバンドになります。
そこで、DataFrameの各列に代入をしましょう。
実行します。
これでボリンジャーバンドの値ができたはずです。
tailで確認してみましょう。
できているようです。
これはチャートに追加してみましょう。
終値とともに、ボリンジャーバンドを塗りつぶし折れ線グラフととみにプロットをしてみましょう。
まずpltドットプロットで終値をプロットします。
次に塗りつぶし折れ線グラフを記述するのでpltドットfill_betweenを書いて丸括弧。
x軸のdateを書いて、塗りつぶす上側つまりDataFrameのupper、次に塗りつぶす下側lowerを記述します。
色はグレーにして、透過を0.3とします。
実行します。
ボリンジャーバンドを記述することができました
サブプロットの最初の引数を5にして、5つのグラフ、移動平均、出来高、MACD、RSI、ボリンジャーバンドを同時に描いてみましょう。
実行しましょう。
同時に描くことができました。
売り買いを判断するのにすべてのテクニカル指標を使う方は少ないと思われます。
ご自身が使われるチャートをピックアップして利用とよいでしょう。

ビットコイン データの作成

今までみてきたテクニカル分析は、ビットコインの分析にも使うことができます。
ビットコインのデータ取得方法をみていきましょう
ビットコインの日足のデータであれば、pandas_datareaderを使って取得することができます。
pandas_DataReaderのN225と書いていた部分をBTC-JPYと書き換えればオッケーです。
取得する日付は、2017年7月から2020年7月までとしましょう。
実行します。
head関数で確認をしてみましょう。
取得ができています。
それではビットコインもテクニカル指標を追加して可視化をしてみましょう。
ここでは、今まで一緒に作ってきたテクニカル指標のデータ作成の部分をそのままコピペしています。
この部分は使い回しの部分なので、利用頻度が多い場合は、関数化してもいいでしょう。
関数については、Python超入門コースのレッスン12で説明していますのでそちらをご覧ください。実行します。
またグラフ化の部分もfigsizeを動画のみやすさの観点から若干変更していますが、それ以外はまるっきりコピペです。
これも関数化ができればより便利になるでしょう。
ご自身が分析している対象にあわせてカスタマイズしてみてください。
実行します。
可視化することができました。
2017年ごろのピークに下落して、今は半値ぐらいまで持ち直して価格が安定していますね。
ただし、出来高が非常に増えてきています。
先日、ビットコインの保有アドレス、過去最多になったというニュースがありましたので、その裏付けるデータかもしれません(https://www.coindeskjapan.com/74348/)。
日足よりスパンの短い時間足、分足のデータ取得についてはbitFlyer(ビットフライヤー)のAPIなどを使って取得することができます。
ご興味ある方はやってみてください。

為替データの作成

次に為替データの取得方法です。
こちらもpandas_datareaderを使います。
2020年1月から2020年7月までのデータを取得してみましょう。
N225と書いていた部分を、DEXJPUSと書き換えればよいです。
headで上位20件を確認してみましょう。
取得できています。
ここの処理でadj closeをいうカラムを指定しているので、カラム名をadj closeに変更してみましょう。
カラム名を変更するにはrenameメソッドを使います。
これはPandas入門コースにて説明しています。ご興味ある方は今カードが出ているので詳しく知りたい方はご覧ください。
renameメソッドを使ってこれを再度dfという変数に代入をします。実行します。
また、データを見るとFX市場が閉じている日がNanになっているので、そのデータは削除をしましょう。
データを削除するにはdropnaを使います。これを再度dfという変数に代入をします。実行します。
再度、head関数で表示させてみましょう。
それではテクニカル指標と可視化をします。
為替データについては出来高がありませんので、subplotの最初の引数を4に変更。figsizeを若干変更しています。
実行します。
可視化ができました。
ボリンジャーバンドのグラフをみると、バンドから上に抜けている時はその後価格が下がり、下に抜けている時は上に抜けていますね。
ここでも上に抜けているときは下がっています。
もう少しふかぼって分析したり、シミュレーションをしてみると新たな気づきがあるかもしれません。
ちなみに、為替データについてはAPIを使って時間足、分足を取得できます。
これについては別途動画を作る予定なので、チャンネル登録をしてお待ちいただければと思います。

ローソク足のデータ作成

さて、最後について、ローソク足について簡単に説明をします。
冒頭では説明しましたが、ローソク足の作成に使っている可視化のライブラリがmplfinanceといってファイナンスに特化した可視化のライブラリです。
matplotlibやseabornの可視化のライブラリとは違い、特殊なライブラリなので、皆さんからのニーズがあるのか不明です。
もし取り上げて欲しい方がいらっしゃいましたらコメントをください。
ご希望である旨のコメントが50件以上いただけましたらmplfinanceについても取り上げていこうと考えております。
この動画では、簡単ではありますが、こんなことができるんだよって程度で紹介をしていきたいと思います。
ちなみに、mplfinanceのライブラリについても冒頭で紹介したDockerfileでコンテナ作成をすれば自動的に使えるように設定をしています。
Dockerfileをご利用の方はそのままimportをしてください。Dockerfileを使っていない方は、pipなどでインストールをしてください。
それではmplfinanceをmplという名前で使えるようにインポートをします。
まずデータ取得をして、テクニカル指標を追加します。
ただし、使うのはボリンジャーバンドだけです。
ローソク足用のデータのみにします。
このコードでローソク足を作ることができます。
データを絞ればしっかりみることができます。
またボリンジャーバンドはローソク足と一緒に使われる方もいらっしゃると思います。
ボリンジャーバンドと出来高を一緒に表示させてみましょう。
ローソク足、ボリンジャーバンド、出来高を表示できました。
mplfinanceでは、この指標以外にも、移動平均を追加したり、subplotのようなことができたりと、色々なことができます。
詳しい解説をご希望の方はコメントいただけましたら幸いです。
Pandas入門コースやこれから作成予定のmatplotlib入門コースを終了しないとわかりにくいところがあったと思います。
急ぎ講座を作りますので少々お待ちください。
キノコードでは、業務自動化の動画などもあるのでご興味ある方はぜひご覧ください。
長い時間ご視聴ありがとうございました。
それでは次のレッスンでお会いしましょう

未経験からはじめるPython学習「キノクエスト」 キノクエスト
  • スキルアップしたいけど何からはじめればよいかわからない…
  • プログラミングスクールに入りたいけど料金が高い…
  • プログラミングを学んでも業務やキャリアに活かせるか不安…

キノクエストは、このような悩みを持つ方にぴったりのプログラミング学習サービスです。
国内最大級のプログラミング学習系YouTubeチャンネル「キノコード」が提供しているから、未経験者にもわかりやすく質の高い学習体験を実感していただけます。

キノクエスト