以下の記事を読んでいて、pandas 標準では日本株式の情報が直接とれないことに気づいたのでやり方をまとめたい。
この記事では以下 2 点の処理について書く。
補足 標準の v0.15.2 で簡単に動きをみているが、ちゃんとテストはしてない。特にローソク足チャートについては pandas の plot クラスにかなり依存しているため、バージョンが変わると動かなくなる可能性がある。
株価の取得
まず、pandas には標準機能として外部サイトのデータを DataFrame で取得する機能 DataReader がある。DataReader では 日本株の情報は直接はとれないが、簡単に動きを書いておく。
DataReader の利用
DataReader では、0.15.2 現在で以下 6 つのデータソースをサポートしている。詳しくは公式ドキュメントを。
- Yahoo! Finance
- Google Finance
- St.Louis FED (FRED)
- Kenneth French’s data library
- World Bank
- Google Analytics
Yahoo! Finance, Google Finance いずれも東京証券取引所ではなく ニューヨーク証券取引所の情報を取ってくるもの。そのため、米国で上場している企業の情報は取れる (ドル建てになるが、、)。Yahoo! Finance 経由でトヨタ自動車の情報を取得してみると、
import numpy as np import pandas as pd import pandas.io.data as web start = '2014-10-01' toyota_nyse = web.DataReader('TM', 'yahoo', start=start) toyota_nyse.head() # Open High Low Close Volume Adj Close # Date # 2014-10-01 117.94 117.99 116.46 116.65 676800 116.65 # 2014-10-02 115.02 115.18 113.64 114.48 507300 114.48 # 2014-10-03 115.70 116.31 115.48 116.16 281500 116.16 # 2014-10-06 116.61 117.22 116.41 116.70 339200 116.70 # 2014-10-07 117.00 117.14 115.80 115.82 398400 115.82
補足 もう少し詳細な情報が取れる Yahoo! Finance Options という機能もある。
補足 今後、この DataReader は別パッケージとして分離される予定。
Yahoo ファイナンス からのデータ読み込み
標準の DataReader では 東京証券取引所の情報がとれないので、上のような形でデータを取りたい。が、日本版である Yahoo! ファイナンスには 米国の Yahoo! Finance が提供しているものと同じ API はないようだ。
そのため、DataReader と同じような感じで Yahoo! ファイナンス から情報を取得する get_quote_yahoojp 関数を書いた (コードは最下部に添付)。ロジックを簡単に書くと、
- API がないので スクレイピングで
- 複数の URL にまたがる情報を、順次
pd.read_htmlで読み込み - 読み込んだ 各
DataFrameをpd.concatで結合し - 日付データをパースして
indexに設定
参考 このあたりの機能を使った。
作成した get_quote_yahoojp を使って、同じくトヨタ自動車の情報をとると、
toyota_tse = get_quote_yahoojp(7203, start=start) toyota_tse.head() # Open High Low Close Volume Adj Close # Date # 2014-10-01 6450 6559 6435 6500 14482100 6500 # 2014-10-02 6370 6423 6256 6275 15240200 6275 # 2014-10-03 6231 6309 6217 6290 10280100 6290 # 2014-10-06 6370 6444 6345 6383 10966200 6383 # 2014-10-07 6380 6455 6351 6366 10129100 6366
ローソク足チャートの描画
株価をとったらチャートが描きたいので、ローソク足チャートを作成する関数 / クラスを定義した (コードは最下部に添付)。こちらは pandas のプロットフレームワーク上に実装したので、添付のコードを実行した後は DataFrame.plot(kind='ohlc') でローソク足チャートが描けるようになる。
補足 内部的には、matplotlib.finance.candlestick を使っているが、この関数を含む matplotlib.finance モジュールは matplotlib v1.4.0 で deprecate されており、今後どのような扱いになるのかわからない。
# 最下部に添付のコードを実行してから import matplotlib.pyplot as plt toyota_tse.plot(kind='ohlc')
土日の間にスペースが空くのが嫌なら、一度 BusinessDay に変換してからプロット。
toyota_tse.asfreq('B').plot(kind='ohlc')
ついでだが、DatetimeIndex をもつ Series から呼び出すと ohlc にリサンプリングしてプロットするようにした。
np.random.seed(1) idx = pd.date_range(start='2015-01-05 09:00', freq='H', periods=1000) values = np.random.randint(low=-500, high=500, size=1000) s = pd.Series(10000 + np.cumsum(values), index=idx) s.head() # 2015-01-05 09:00:00 9537 # 2015-01-05 10:00:00 9272 # 2015-01-05 11:00:00 9680 # 2015-01-05 12:00:00 9252 # 2015-01-05 13:00:00 9519 s.plot(kind='ohlc')
また、ohlc でリサンプリングされた結果 ( DataFrame ) からもプロットできる。
df = s.resample('B', how='ohlc') df.head() # open high low close # 2015-01-05 9537 11168 9252 11168 # 2015-01-06 11176 11872 9912 11458 # 2015-01-07 11099 11099 10174 10652 # 2015-01-08 10465 11236 8980 9539 # 2015-01-09 9655 10805 8797 9910 df.plot(kind='ohlc')
以下、利用したコード。