以下の記事を読んでいて、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')
以下、利用したコード。