pandasで株価を取得
pandasの公式ドキュメント(Remote Data Access — pandas 0.15.2 documentation)によると、今のところ下記からデータをダウンロードすることが可能らしい。これは本当に便利。
- Yahoo! Finance
- Google Finance
- St.Louis FED (FRED)
- Kenneth French’s data library
- World Bank
- Google Analytics
今回は、Yahoo! Financeから株価を落としてみようと思う。
スタートとエンドの日付を決めて、all_dataというディクショナリ型の箱を用意する。そこにtickerでループさせて株価を突っ込んでいくという寸法。
In [45]: start = datetime.datetime(2000, 1, 1) ...: end = datetime.datetime(2014, 12, 31) ...: ...: #データ取得 ...: all_data = {} ...: for ticker in ['AAPL', 'IBM', 'MSFT', 'YHOO']: ...: all_data[ticker] = web.DataReader(ticker,'yahoo',start,end)
各社について、Open、High、Low、Close、Volume、Adj Closeが取れる。Adj Closeは、配当や株式分割等のコーポレートアクション考慮済みの株価と思われるため、以降はこれを使うこととする。
扱いやすいように各社のAdj Closeだけのデータフレームをmerge関数を使って作る。その際、日付で内部結合する。そのうえで、株価の時系列プロットを見てみる。
In [49]: stock_price=all_data['AAPL'].ix[:,['Adj Close']] ...: for ticker in ['IBM', 'MSFT', 'YHOO']: ...: stock_price = pd.merge(stock_price,all_data[ticker].ix[:,['Adj Close']], ...: left_index=True, right_index=True) ...: ...: #列名変更 ...: stock_price.columns=['AAPL', 'IBM', 'MSFT', 'YHOO'] ...: stock_price.plot() Out[49]: <matplotlib.axes._subplots.AxesSubplot at 0x1975e358>
予想通りAAPLの上昇がすさまじい感じだが、それぞれの株価の始点が違っていていまいちわかりづらいので、累積リターンを計算する。
In [51]: stock_cum_ret=stock_price.ix[:stock_price.shape[0]]/stock_price.ix[0]-1 ...: stock_cum_ret.plot() Out[51]: <matplotlib.axes._subplots.AxesSubplot at 0x19684518>
AAPLすごすぎワロタ
株価や累積リターンのままだと分析がやりづらいため(時系列的に言えば単位根過程であるため)、リターンに変換する。
pandasだと、pct_change()関数一発でこれができる。pandasすごいよpandas
で、あとはいつも通り統計量や時系列プロット、スキャッターマトリックスや相関行列を見て、大体の特徴をつかむ。
In [53]: stock_ret=stock_price.pct_change() In [54]: stock_ret.describe() Out[54]: AAPL IBM MSFT YHOO count 3772 3772 3772 3772 mean 0.001306 0.000284 0.000232 0.000336 std 0.027962 0.017036 0.020219 0.033706 min -0.519444 -0.155476 -0.155941 -0.218362 25% -0.012166 -0.007431 -0.00882 -0.014154 50% 0 0.000151 0 0 75% 0.014707 0.007959 0.009221 0.014288 max 0.139571 0.120228 0.195793 0.479666 In [55]: stock_ret.plot() In [56]: pd.scatter_matrix(stock_ret,diagonal='kde') Out[56]: In [57]: stock_ret.corr() Out[57]: AAPL IBM MSFT YHOO AAPL 1 0.403815 0.411938 0.371237 IBM 0.403815 1 0.496384 0.380836 MSFT 0.411938 0.496384 1 0.389721 YHOO 0.371237 0.380836 0.389721 1
コード全体はこちら。
# -*- coding: utf-8 -*- import pandas.io.data as web import numpy as np import seaborn as sns import pandas as pd import pandas.io.data as web import datetime start = datetime.datetime(2000, 1, 1) end = datetime.datetime(2014, 12, 31) #データ取得 all_data = {} for ticker in ['AAPL', 'IBM', 'MSFT', 'YHOO']: all_data[ticker] = web.DataReader(ticker,'yahoo',start,end) #データ結合(concatでもOK) #stock_price=all_data['AAPL'].ix[:,['Adj Close']] #for ticker in ['IBM', 'MSFT', 'YHOO']: # stock_price = pd.concat((stock_price,all_data[ticker].ix[:,['Adj Close']]),axis=1) #データ結合 stock_price=all_data['AAPL'].ix[:,['Adj Close']] for ticker in ['IBM', 'MSFT', 'YHOO']: stock_price = pd.merge(stock_price,all_data[ticker].ix[:,['Adj Close']], left_index=True, right_index=True) #列名変更 stock_price.columns=['AAPL', 'IBM', 'MSFT', 'YHOO'] stock_price.plot() #累積リターン stock_cum_ret=stock_price.ix[:stock_price.shape[0]]/stock_price.ix[0]-1 stock_cum_ret.plot() #リターンデータに変換 stock_ret=stock_price.pct_change() stock_ret.describe() stock_ret.plot() pd.scatter_matrix(stock_ret,diagonal='kde') stock_ret.corr()