StatsFragments

Python, R, 統計のこととか書く

Python pandas で日本の株価情報取得とローソク足チャート描画

以下の記事を読んでいて、pandas 標準では日本株式の情報が直接とれないことに気づいたのでやり方をまとめたい。

この記事では以下 2 点の処理について書く。

  1. Yahoo! ファイナンス からの情報取得
  2. ローソク足チャートの描画

補足 標準の v0.15.2 で簡単に動きをみているが、ちゃんとテストはしてない。特にローソク足チャートについては pandasplot クラスにかなり依存しているため、バージョンが変わると動かなくなる可能性がある。

株価の取得

まず、pandas には標準機能として外部サイトのデータを DataFrame で取得する機能 DataReader がある。DataReader では 日本株の情報は直接はとれないが、簡単に動きを書いておく。

DataReader の利用

DataReader では、0.15.2 現在で以下 6 つのデータソースをサポートしている。詳しくは公式ドキュメントを。

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 関数を書いた (コードは最下部に添付)。ロジックを簡単に書くと、

参考 このあたりの機能を使った。

作成した 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')

f:id:sinhrks:20150201233256p:plain

土日の間にスペースが空くのが嫌なら、一度 BusinessDay に変換してからプロット。

toyota_tse.asfreq('B').plot(kind='ohlc')

f:id:sinhrks:20150201233313p:plain

ついでだが、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')

f:id:sinhrks:20150201233324p:plain

また、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')

f:id:sinhrks:20150201233339p:plain

以下、利用したコード。