import pandas_datareader.data as web
start="1949/5/16"
end="2017/7/25"#適当に入れ替えてください。
N225 = web.DataReader("NIKKEI225", 'fred',start,end)
N225.head(1)
NIKKEI225 | |
---|---|
DATE | |
1949-05-16 | 176.21 |
N225.tail(1)
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)とすることでデータの最初の行のみを表示できる。
%matplotlib inline
import matplotlib.pyplot as plt
N225.plot(color='darkblue')
plt.ylabel('N225 index')
<matplotlib.text.Text at 0x7f4f85f75e80>
%matplotlib inline
import matplotlib.pyplot as plt
N225.plot(color='darkblue')
plt.ylabel('N225 index')
<matplotlib.text.Text at 0x7f14f52815f8>
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)
Open | High | Low | Close | Volume | |
---|---|---|---|---|---|
Date | |||||
2001-08-27 | 1.33 | 1.38 | 1.3 | 1.35 | 43240400 |
print(price.tail(1))
Open High Low Close Volume Date 2017-07-24 150.58 152.44 149.9 152.09 21493160
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')
<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日分のデータを用いている。
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
<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[,]は数値のみでインデックスと列を指定する。
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
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
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()を指定しないとその期間の平均値となることに注意が必要である。
price.resample('A').Close.plot(color='magenta')
plt.ylabel('apple')
<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を用して、日経平均株価の価格変動性を求めてみよう。
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日移動平均を取得してみよう
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()
<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日分のデータを用いて移動ボラティリティを計算し、それをグラフ表示してみよう。
ボラティリティは一定ではなく、上下動を繰り返すが、時として大きくジャンプしてしばらくそこに留まり、時間か経過すると以前の状態に戻ってくることが見て取れる。
この現象をボラティリティのクラスタリングと呼びます。
(pd.Series.rolling(np.log(price.Close).diff().dropna(),window=25).std()*np.sqrt(250)).plot()
plt.ylabel('standrd deviation 250 days aapl')
<matplotlib.text.Text at 0x7f14f12c8cf8>