import pandas_datareader.data as web
start="1949/5/16"
end="2017/7/25"#適当に入れ替えてください。
N225 = web.DataReader("NIKKEI225", 'fred',start,end)
N225.head(1)
N225.tail(1)
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)とすることでデータの最初の行のみを表示できる。
%matplotlib inline
import matplotlib.pyplot as plt
N225.plot(color='darkblue')
plt.ylabel('N225 index')
%matplotlib inline
import matplotlib.pyplot as plt
N225.plot(color='darkblue')
plt.ylabel('N225 index')
plt.show()を追加することにより出力の仕方が変わりました。
matplotlibのモジュールを使うときにはJupyter(Python) Notebookのそれぞれのページに次のマジックコマンドを設定する必要がある。
Pythonでは頭に%が付いたコマンドをマジックコマンド呼ぶ
otlib inline 描画の準備をしている。
N225.plot N225のチャートを描いている。これはpandasのplotを用いていることに注意。 colorはグラフの線の色を指定する。
price = web.DataReader("aapl", 'google',"1990/1/4",end)#yahooのサービスの停止により変更
price.head(1)
print(price.tail(1))
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')
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日分のデータを用いている。
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')
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[,]は数値のみでインデックスと列を指定する。
print(price.resample('M').first().tail())
print(price.resample('M').last().tail())
print(price.resample('M',loffset='1d').last().tail())
次の例は日足のデータを年次のデータに変換してチャートを描いている。.fast(),.last()を指定しないとその期間の平均値となることに注意が必要である。
price.resample('A').Close.plot(color='magenta')
plt.ylabel('apple')
データは変化率(pct_ change)、差分(diff)、累積合計(cumsum)などの関数を用いて、分析前のオリジナルのデータを、そして、分析により出力されたデータを必要
がれば適切に加工しなければならない。
データの分析は静的な分析と動的な分析に分けることができる。 静的 な分析は記述統計のようにデータの期間を固定して、統計量を求める分析手法である。
一方、動的な分析とは同じように統計量を求めるのであるが、全体の期間の中にそれよりも短い期間を設け、その期間をある一定量ずらしていく分析手法、ローリング分析ともよばれる。
pandasのシリーズとデータフレームのもつ記述統計に関するメソッドには
count(計数)
quantiele(4分位)
sum(合計)
meam(平均)
median(中央値)
var(分散)
std(標準偏差)
skew(歪度)
kurt(尖度)
cumsum(累積合計)
diff(差分)
pct_change(変化率)
などがある。ここではdiffとstdを用して、日経平均株価の価格変動性を求めてみよう。
import numpy as np
dp=np.log(price.Close).diff()
vol=dp.std()*np.sqrt(250)
print(vol,len(price))
import numpy as np 対数とルートの計算にnumpyのlogとsqrtと用いる
dp=np.log(price.Close).diff() 終値の対数の差を計算している
vol=dp.std()*np.sqrt(250)
終値の対数の差は標準偏差を取り、それを250のルートを取ることで年率換算している。
pandasのSeries.rollingを用いて日経平均株価の終値の250日移動平均を取得してみよう
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()
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日分のデータを用いて移動ボラティリティを計算し、それをグラフ表示してみよう。
ボラティリティは一定ではなく、上下動を繰り返すが、時として大きくジャンプしてしばらくそこに留まり、時間か経過すると以前の状態に戻ってくることが見て取れる。
この現象をボラティリティのクラスタリングと呼びます。
(pd.Series.rolling(np.log(price.Close).diff().dropna(),window=25).std()*np.sqrt(250)).plot()
plt.ylabel('standrd deviation 250 days aapl')