日経平均株価指数

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]:
Open High Low Close Volume Adj Close
Date
2014-01-06 16147.54 16164.01 15864.44 15908.88 192700 15908.88
2014-01-07 15835.41 15935.37 15784.25 15814.37 165900 15814.37
2014-01-08 15943.68 16121.45 15906.57 16121.45 206700 16121.45
2014-01-09 16002.88 16004.56 15838.44 15880.33 217400 15880.33
2014-01-10 15785.15 15922.14 15754.70 15912.06 237500 15912.06

各カラムの統計情報を表示します。データの個数と、カラムごとの最大値・最小値、分散や四分位数がわかります。


In [5]:
df.describe()


Out[5]:
Open High Low Close Volume Adj Close
count 230.000000 230.000000 230.000000 230.000000 230.000000 230.000000
mean 15275.362739 15353.316609 15190.949391 15271.522739 135449.565217 15271.522739
std 794.332251 797.329515 797.021745 801.664690 50851.790596 801.664690
min 13887.230000 14008.290000 13885.110000 13910.160000 0.000000 13910.160000
25% 14702.770000 14759.472500 14589.415000 14685.297500 112725.000000 14685.297500
50% 15186.980000 15268.630000 15125.145000 15216.090000 131150.000000 15216.090000
75% 15655.167500 15729.562500 15582.180000 15655.207500 160300.000000 15655.207500
max 17520.540000 17520.540000 17372.710000 17490.830000 335600.000000 17490.830000

取引開始時点の価格を時系列でグラフにします。


In [6]:
df['Open'].plot()


Out[6]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f75641061d0>

取引量も時系列でグラフにします。


In [7]:
df['Volume'].plot()


Out[7]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f75640db3c8>

0が含まれているようなので、それを取り除いてグラフを作成し直します。


In [8]:
df[df['Volume'] > 0]['Volume'].plot()


Out[8]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f755dde7978>

取引量が0の日を確認しておきます。


In [9]:
df[df['Volume'] == 0]


Out[9]:
Open High Low Close Volume Adj Close
Date
2014-01-13 15912.06 15912.06 15912.06 15912.06 0 15912.06
2014-01-20 15724.14 15727.26 15574.23 15641.68 0 15641.68
2014-03-18 14491.00 14533.00 14400.00 14411.27 0 14411.27
2014-03-19 14496.00 14664.00 14302.00 14463.00 0 14463.00
2014-04-29 14288.23 14288.23 14288.23 14288.23 0 14288.23
2014-05-06 14457.51 14457.51 14457.51 14457.51 0 14457.51
2014-07-21 15215.71 15215.71 15215.71 15215.71 0 15215.71
2014-09-15 15948.29 15948.29 15948.29 15948.29 0 15948.29
2014-10-13 15300.55 15300.55 15300.55 15300.55 0 15300.55
2014-10-14 14936.51 14936.51 14936.51 14936.51 0 14936.51
2014-11-24 17357.51 17357.51 17357.51 17357.51 0 17357.51
2014-11-27 17310.49 17346.85 17212.48 17248.50 0 17248.50

月ごとに集計

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]:
<matplotlib.text.Text at 0x7f755dc9b208>

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]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f755dd432b0>

始値と終値の差分を計算し、変化量をプロットします。時系列とヒストグラムの両方の図を作成します。

ヒストグラムの区切りを手動で調整する場合は、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]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f755dae9e10>

同じ要領で、最安値と最高値の差分を時系列とヒストグラムで表示してみます。


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]:
<matplotlib.text.Text at 0x7f755d808ba8>

変化量の少ない日と多い日を確認しておきます。


In [15]:
df[df['minmax'] > 0].sort('minmax').head(5)


Out[15]:
Open High Low Close Volume Adj Close diff minmax
Date
2014-09-01 15454.59 15478.77 15440.99 15476.60 74800 15476.60 22.01 37.78
2014-08-19 15451.94 15476.05 15429.11 15449.79 94200 15449.79 -2.15 46.94
2014-08-15 15317.15 15328.34 15276.99 15318.34 88700 15318.34 1.19 51.35
2014-07-23 15367.16 15376.20 15317.37 15328.56 100100 15328.56 -38.60 58.83
2014-08-20 15485.93 15492.88 15433.72 15454.45 92700 15454.45 -31.48 59.16

In [16]:
df.sort('minmax', ascending=False).head(5)


Out[16]:
Open High Low Close Volume Adj Close diff minmax
Date
2014-10-31 15817.14 16533.91 15817.14 16413.76 268500 16413.76 596.62 716.77
2014-11-17 17381.38 17409.32 16907.43 16973.80 192800 16973.80 -407.58 501.89
2014-02-14 14538.20 14678.71 14243.17 14313.03 204200 14313.03 -225.17 435.54
2014-03-27 14305.67 14659.85 14227.81 14622.89 179000 14622.89 317.22 432.04
2014-02-18 14514.47 14900.24 14469.49 14843.24 206500 14843.24 328.77 430.75

変化量が少ない日は取引量も少ない気がしますので、グラフを並べてみます。


In [17]:
df[(df['minmax'] > 0) & (df['Volume'] > 0)][['minmax', 'Volume']].plot(subplots=True, figsize=(16, 6))


Out[17]:
array([<matplotlib.axes._subplots.AxesSubplot object at 0x7f755d8e44a8>,
       <matplotlib.axes._subplots.AxesSubplot object at 0x7f755d347940>], dtype=object)

似ている部分はあるものの一致はしません。グラフはおおよその関係を読み取るのに留め、なんらかの相関関係を考えるためには統計量を計算しましょう。

動作環境

version_information 拡張を有効にしてあります。このノートブックの動作環境は以下のものです。


In [18]:
%version_information numpy, pandas, matplotlib


Out[18]:
SoftwareVersion
Python3.4.2 64bit [GCC 4.9.1]
IPython2.3.0
OSLinux 3.14.20 20.44.amzn1.x86_64 x86_64 with debian jessie sid
numpy1.9.1
pandas0.15.0
matplotlib1.4.2
Sat Nov 29 14:52:14 2014 UTC