WHAT' CHA GONNA DO FOR ME?

Python、統計、機械学習、R、ファイナンスとか

pandasで株価を取得

pandasの公式ドキュメント(Remote Data Access — pandas 0.15.2 documentation)によると、今のところ下記からデータをダウンロードすることが可能らしい。これは本当に便利。

今回は、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>

f:id:lofas:20150215222401p:plain

予想通り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>

f:id:lofas:20150215222410p:plain

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

f:id:lofas:20150215223106p:plain

f:id:lofas:20150215223114p:plain

コード全体はこちら。

# -*- 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()