Python - pandas で日経平均株価指数を plot する - Qiita を参考に作成したノートブック。
モジュールをインポートします。 matplotlib
はインライン設定されているものとします。
In [1]:
import datetime
import numpy as np
import pandas.io.data as web
import matplotlib.pyplot as plt
株価指数を取得する期間を設定します。ここでは2014年の1/1〜11/30としています。
In [2]:
start = datetime.date(2014, 1, 1)
end = datetime.date(2014, 11, 30)
Yahoo! Finance から日経平均株価指数を取得します。 その他のデータソースは Remote Data Access — pandas 0.15.1 documentation を見てください。
In [3]:
df = web.DataReader('^N225', 'yahoo', start, end)
データフレームの先頭5件を表示します。
In [4]:
df.head(5)
Out[4]:
各カラムの統計情報を表示します。データの個数と、カラムごとの最大値・最小値、分散や四分位数がわかります。
In [5]:
df.describe()
Out[5]:
取引開始時点の価格を時系列でグラフにします。
In [6]:
df['Open'].plot()
Out[6]:
取引量も時系列でグラフにします。
In [7]:
df['Volume'].plot()
Out[7]:
0が含まれているようなので、それを取り除いてグラフを作成し直します。
In [8]:
df[df['Volume'] > 0]['Volume'].plot()
Out[8]:
取引量が0の日を確認しておきます。
In [9]:
df[df['Volume'] == 0]
Out[9]:
Time Series / Date functionality に記載されている resample
を使い、日別のデータを月ごとに集計します。
グラフは複数のグラフを同時に表示してみます。
In [10]:
fig, axes = plt.subplots(ncols=2, figsize=(16, 4))
df['Open'].resample('M', how='mean').plot(ax=axes[0], color='c')
axes[0].set_title('Monthly Mean Price')
df['Volume'].resample('M', how='sum').plot(ax=axes[1], color='m')
axes[1].set_title('Monthly Transaction Volume')
Out[10]:
resample
に与える文字を変えることで、週ごとや四半期ごと、年ごとにも集計できます。
冒頭の参考記事にあるように、その日の最高値と最低値をプロットします。figsize
オプションを与えることで大きさを調整できます。
In [11]:
plt.fill_between(df.index, df['Low'], df['High'], color='b', alpha=0.2)
df['Open'].plot(figsize=(16, 4))
Out[11]:
始値と終値の差分を計算し、変化量をプロットします。時系列とヒストグラムの両方の図を作成します。
ヒストグラムの区切りを手動で調整する場合は、python - Pandas : histogram with fixed width - Stack Overflow を参考にして bins
を設定します。違う値で区切りたい場合は引数を調整してください。
In [12]:
df['diff'] = df['Close'] - df['Open']
fig, axes = plt.subplots(ncols=3, figsize=(16, 4))
df['diff'].plot(ax=axes[0])
df['diff'].hist(ax=axes[1], color='g')
df['diff'].hist(ax=axes[2], color='g', bins=[-600, -500, -400, -300, -200, -100, 0, 100, 200, 300, 400, 500, 600])
Out[12]:
同じ要領で、最安値と最高値の差分を時系列とヒストグラムで表示してみます。
In [13]:
df['minmax'] = df['High'] - df['Low']
In [14]:
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(16, 6))
plt.subplots_adjust(wspace=0.5, hspace=0.8)
df['minmax'].plot(ax=axes[0, 0])
axes[0, 0].set_title('Differential between High and Low')
df['minmax'].resample('M', how='mean').plot(ax=axes[1, 0], color='r')
axes[1, 0].set_title('Monthly Differential')
df['minmax'].hist(ax=axes[0, 1], color='g')
axes[0, 1].set_title('Histgram between High and Low')
df['minmax'].hist(ax=axes[1, 1], color='g', bins=np.arange(0, 801, 50))
axes[1, 1].set_title('Histgram between High and Low (fixed width)')
Out[14]:
変化量の少ない日と多い日を確認しておきます。
In [15]:
df[df['minmax'] > 0].sort('minmax').head(5)
Out[15]:
In [16]:
df.sort('minmax', ascending=False).head(5)
Out[16]:
変化量が少ない日は取引量も少ない気がしますので、グラフを並べてみます。
In [17]:
df[(df['minmax'] > 0) & (df['Volume'] > 0)][['minmax', 'Volume']].plot(subplots=True, figsize=(16, 6))
Out[17]:
似ている部分はあるものの一致はしません。グラフはおおよその関係を読み取るのに留め、なんらかの相関関係を考えるためには統計量を計算しましょう。
version_information 拡張を有効にしてあります。このノートブックの動作環境は以下のものです。
In [18]:
%version_information numpy, pandas, matplotlib
Out[18]: