読者です 読者をやめる 読者になる 読者になる

Abnormalに生きる

化学の研究者→消防士→ITエンジニア(2016年11月〜)

Pythonで株価データを取得し、Matplotlibで可視化する。

はじめに

 株価データは、代表的な時系列データの一つですが、Pythonはこの時系列データを取り扱うのを非常に得意としています。特に、Pythonライブラリの一つであるpandasはもともと金融データを扱うために開発されたため、時系列データの分析に強力な機能を数多く備えています。

 今回やることは非常にシンプルで、下記の2点だけです。(すべてIPython Notebook上で行っています。)

 1. Yahoo! Financeからトヨタの株価データを取得する。

 2. 取得した株価データを時系列データとしてプロットする。

株価データの取得

 まず始めに、下記のように必要となるライブラリをインポートします。

import pandas as pd
from pandas import Series, DataFrame
import numpy as np

import matplotlib.pyplot as plt
%matplotlib inline

 最後の1行は、描画するグラフをIPython Notebook上にそのまま埋め込むために書いたものです。

 pandasの標準機能であるDataReaderを使えばYahooやGoogleなどから簡単に株価を取得できます。

from pandas.io.data import DataReader
from datetime import datetime

end = datetime.now()
start = datetime(end.year - 1, end.month, end.day)
toyota = DataReader('TM', 'yahoo', start, end)

toyota.head()


f:id:hirotsuru314:20160517174824p:plain

 ここで、注意してもらいたいのが、今回Yahoo! Financeから取得したデータは、東京証券取引所のものではなく、ニューヨーク証券取引所つまりアメリカの株式市場の情報です。日本版である Yahoo! ファイナンスには アメリカのYahoo! Finance が提供しているAPIと同じものはありません。今回はより簡単に株式データを取得するため、Yahoo! Finance が提供しているAPIを使いました。(実際に、日本の株式市場のデータを取得するためには、少し手間はかかりますが、スクレイビングでできます。)

 上記のコードでendとstartはいつからいつまでのデータを取得するかを決めています。endをnow(現在)として、startを現在から1年前までとしています。つまり1年分の株価データを取得しています。取得したデータは"toyota"に格納しており、表のようなデータが入っていることがわかると思います。ここで最後の行のheadは、データのうち5行分だけを表示するために書いたものです。

株価データの可視化

 MatplotlibはPythonでグラフを描画するときに非常に便利なライブラリです。今回プロットに使うデータは、上の表でAdj Closeのカラムのデータです。これは、調整後終値と呼ばれるもので、その詳細は割愛します。

Yahoo!ファイナンスヘルプ - 調整後終値とは

 次のように1行書くだけで簡単に株価を時系列データとして描くことができます。

f:id:hirotsuru314:20160517180606p:plain

おわりに

 今回は、Pythonを用いて株価データの取得とその可視化という非常にシンプルな作業を行いました。現在、Pythonは金融・経済データの実践的な分析ツールとして絶大な力を持っており、非常に注目されています。Pythonによるデータ分析を極めていくと、人工知能を使って、システムトレードで大儲け、なんてこともできるかもしれませんね。次回は、複数の企業の株価を比較し、その相関関係を分析するといった過程を書きたいと思います。

 ちなみに、Pythonでデータ分析をするならオライリーの下の書籍が一番いいです。NumPyやpandasを使ったデータ分析がかなり詳しく解説されています。特に今回のような時系列データを取り扱うノウハウは網羅されており、他に同じような書籍は見当たらないため、Pythonでデータ分析をやりたい人にとってはほぼ一択と言っていいと思います。

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理