データのダウンロード

In [23]:
import pandas_datareader.data as web
start="1949/5/16"
end="2017/7/25"#適当に入れ替えてください。
N225 = web.DataReader("NIKKEI225", 'fred',start,end)
N225.head(1)
Out[23]:
NIKKEI225
DATE
1949-05-16 176.21
In [24]:
N225.tail(1)
Out[24]:
NIKKEI225
DATE
2017-07-24 19975.67

endを省略すると、直近までのデータがダウンロードされる。

プログラムコードの解説

import pandas_datareader.data as pdr

pandas_datareader.dataをインポートしその接頭語をpdrとする。

DataReader(stock_code,source,start,end)

stock_codeは株式コード、sourceにはデータの取得先である。

startにダウンロードしたい基幹の始まりの日付、endには終わりの日付を入力する。

start="1949/5/16",end="2017/2/21"と入力しておく。

stock_codeは"NIKKEI225"である。

データの出所はfredである。    

N225 = pdr.DataReader("NIKKEI225",'fred',start,end)

得られたデータをn225に保存

pandasにはhead()というデータの表示機能がある。デフォルトでは最初の5行を表示する

がhead(1)とすることでデータの最初の行のみを表示できる。

In [3]:
%matplotlib inline
import matplotlib.pyplot as plt
N225.plot(color='darkblue')
plt.ylabel('N225 index')
Out[3]:
<matplotlib.text.Text at 0x7f4f85f75e80>
In [8]:
%matplotlib inline
import matplotlib.pyplot as plt
N225.plot(color='darkblue')
plt.ylabel('N225 index')
Out[8]:
<matplotlib.text.Text at 0x7f14f52815f8>

plt.show()を追加することにより出力の仕方が変わりました。

プログラムコードの解説

matplotlibのモジュールを使うときにはJupyter(Python) Notebookのそれぞれのページに次のマジックコマンドを設定する必要がある。

Pythonでは頭に%が付いたコマンドをマジックコマンド呼ぶ

otlib inline 描画の準備をしている。

N225.plot N225のチャートを描いている。これはpandasのplotを用いていることに注意。 colorはグラフの線の色を指定する。

In [10]:
price = web.DataReader("aapl", 'google',"1990/1/4",end)#yahooのサービスの停止により変更
price.head(1)
Out[10]:
Open High Low Close Volume
Date
2001-08-27 1.33 1.38 1.3 1.35 43240400
In [11]:
print(price.tail(1))
              Open    High    Low   Close    Volume
Date                                               
2017-07-24  150.58  152.44  149.9  152.09  21493160

データベースの加工

In [13]:
import pandas as pd
fx = web.DataReader('DEXJPUS',"fred",start,end)
port=pd.concat([price.Close,fx],axis=1).dropna()
n=port.Close.pct_change().dropna()
f=port.DEXJPUS.pct_change().dropna()
f.rolling(window=20).corr(n).plot(color="yellow")
plt.ylabel('correlation')
Out[13]:
<matplotlib.text.Text at 0x7f14f505fac8>

プログラムコードの解説

fx = pdr.DataReader('DEXJPUS',"fred",start) DEXJPUSはfredのドル/円のレートを指定するコードである。

port=pd.concat([price.Close,fx],axis=1).dropna() concatの()内の[x,y]で結合するデータを指定している。

axis=1は列の結合を指定している。

dropna()は結合したデータのどちらかの要素、または列に空の部分があればその行を削除する。

n=port.Close.pct_change().dropna()

f=port.DEXJPUS.pct_change().dropna()

pct_change()は価格を変化率に変換している。

f.rolling(window=20).corr(n).plot(color="yellow") ファイルから移動相関を計算し、それをグラフに表示している。 windowは期間を示している。

この場合は日足を用いているので20日分のデータを用いている。

データの切り取り(ixプロパティの利用)

In [14]:
price = web.DataReader("aapl", 'google','1990/1/1',end)#yahooのサービスの停止により変更
price1=price.loc["1990/1/1":]#ixの停止によりlocに変更
price1.Close.plot(color='green')
price2=price["2015"].iloc[0:2]#ixの停止によりilocに変更
print(price2)
plt.ylabel('apple')
              Open    High     Low   Close    Volume
Date                                                
2015-01-02  111.39  111.44  107.35  109.33  53204626
2015-01-05  108.29  108.65  105.41  106.25  64285491
Out[14]:
<matplotlib.text.Text at 0x7f14f15b8e80>

プログラムコードの解説

price=price.ix["1990/1/1":] "1990/1/1"以降のデータを参照

price=price.ix[:"1990/1/1"] "1990/1/1"以前のデータを参照

price2=price.ix["2015",0:2]

行を’2015’、列を0:2と指定することで2015年の始値と高値の左2つの列のデータを取得

price.Close.plot(color='green') priceには4本値が含まれているので、.Closeとすることで終値を選択している。

ix,iloc,locについて iloc[,],loc[,]は数値のみでインデックスと列を指定する。

再サンプリング、サンプリング期間の変更

In [15]:
print(price.resample('M').first().tail())
              Open    High     Low   Close    Volume
Date                                                
2017-03-31  137.89  140.15  137.60  139.79  36414585
2017-04-30  143.71  144.12  143.05  143.70  19985714
2017-05-31  145.10  147.20  144.96  146.58  33602943
2017-06-30  153.17  153.33  152.22  153.18  16404088
2017-07-31  144.88  145.30  143.10  143.50  14277848
In [16]:
print(price.resample('M').last().tail())
              Open    High     Low   Close    Volume
Date                                                
2017-03-31  143.72  144.27  143.01  143.66  19661651
2017-04-30  144.09  144.30  143.27  143.65  20860358
2017-05-31  153.97  154.17  152.38  152.76  24451164
2017-06-30  144.45  144.96  143.78  144.02  23024107
2017-07-31  150.58  152.44  149.90  152.09  21493160
In [17]:
print(price.resample('M',loffset='1d').last().tail())
              Open    High     Low   Close    Volume
Date                                                
2017-04-01  143.72  144.27  143.01  143.66  19661651
2017-05-01  144.09  144.30  143.27  143.65  20860358
2017-06-01  153.97  154.17  152.38  152.76  24451164
2017-07-01  144.45  144.96  143.78  144.02  23024107
2017-08-01  150.58  152.44  149.90  152.09  21493160

次の例は日足のデータを年次のデータに変換してチャートを描いている。.fast(),.last()を指定しないとその期間の平均値となることに注意が必要である。

In [18]:
price.resample('A').Close.plot(color='magenta')
plt.ylabel('apple')
Out[18]:
<matplotlib.text.Text at 0x7f14f14ff8d0>

データの加工、分析

 データは変化率(pct_ change)、差分(diff)、累積合計(cumsum)などの関数を用いて、分析前のオリジナルのデータを、そして、分析により出力されたデータを必要

がれば適切に加工しなければならない。  

データの分析は静的な分析と動的な分析に分けることができる。 静的 な分析は記述統計のようにデータの期間を固定して、統計量を求める分析手法である。

一方、動的な分析とは同じように統計量を求めるのであるが、全体の期間の中にそれよりも短い期間を設け、その期間をある一定量ずらしていく分析手法、ローリング分析ともよばれる。

記述統計

pandasのシリーズとデータフレームのもつ記述統計に関するメソッドには

count(計数)

quantiele(4分位)

sum(合計)

meam(平均)

median(中央値)

var(分散)

std(標準偏差)

skew(歪度)

kurt(尖度)

cumsum(累積合計)

diff(差分)

pct_change(変化率)

などがある。ここではdiffとstdを用して、日経平均株価の価格変動性を求めてみよう。

In [19]:
import numpy as np
dp=np.log(price.Close).diff()
vol=dp.std()*np.sqrt(250)
print(vol,len(price))
0.356654218883 4000

プログラムコードの解説

import numpy as np 対数とルートの計算にnumpyのlogとsqrtと用いる

dp=np.log(price.Close).diff() 終値の対数の差を計算している

vol=dp.std()*np.sqrt(250)

終値の対数の差は標準偏差を取り、それを250のルートを取ることで年率換算している。

動的な分析

pandasのSeries.rollingを用いて日経平均株価の終値の250日移動平均を取得してみよう

In [20]:
import pandas as pd
ma=pd.Series.rolling(price.Close,window=250).mean()
price.Close.plot(label='aapl Close',style='--')
ma.plot(label='250days ma')
plt.ylabel('aapl')
plt.legend()
Out[20]:
<matplotlib.legend.Legend at 0x7f15200965c0>

プログラムコードの解説

import pandas as pd

ma=pd.Series.rolling(price.Close,window=250).mean()

pandasをモジュールの接頭語をpdとしてインポート

price.Closeで終値を指定

250は移動平均を指定

 移動平均の他に、指定された期間の:  

Series.rolling().max()(移動最大値)  

Series.rolling().min()(移動最小値)  

Series.rolling().median()(移動中央値)  

Series.rolling().std()(移動標準偏差) などが利用できる

 次に、移動標準偏差(rolling().std())を用いて250日分のデータを用いて移動ボラティリティを計算し、それをグラフ表示してみよう。

ボラティリティは一定ではなく、上下動を繰り返すが、時として大きくジャンプしてしばらくそこに留まり、時間か経過すると以前の状態に戻ってくることが見て取れる。

この現象をボラティリティのクラスタリングと呼びます。

In [21]:
(pd.Series.rolling(np.log(price.Close).diff().dropna(),window=25).std()*np.sqrt(250)).plot()
plt.ylabel('standrd deviation 250 days aapl')
Out[21]:
<matplotlib.text.Text at 0x7f14f12c8cf8>
In [ ]: