株式市場のデータ解析

株のデータを解析して、未来の株価が分かったら大金持ちになれるかも知れません。 それはさておき、Pythonと周辺ライブラリを使うと、株価データのような、時系列データの解析も比較的簡単に行う事ができます。

次のような課題について考えて行くことにしましょう。

1.) 株価の時間による変化を見てみる。
2.) 日ごとの変動を可視化する。
3.) 移動平均を計算する
4.) 複数の株価の終値の相関を計算する
4.) 複数の株価の変動の関係を見る
5.) 特定の株のリスクを計算する
6.) シミュレーションを使った未来の予測

株価データの基本

pandasを使って株価のデータを扱う基本を学んで行きましょう。

In [2]:
# 必要なライブラリをimportします
import pandas as pd
from pandas import Series,DataFrame
import numpy as np

# 可視化のためのセットです。
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('whitegrid')
%matplotlib inline

# Yahooからデータを読み込めるようにします
from pandas.io.data import DataReader

# Pythonで日付と時刻を扱うためのモジュールです
from datetime import datetime

# Python2を使っている場合は必要です
from __future__ import division

Let's use Yahoo and pandas to grab some data for some tech stocks.

In [3]:
# 所謂ハイテク企業の株価を扱ってみます。
tech_list = ['AAPL','GOOG','MSFT','AMZN']

# 直近1年間のデータを使ってみましょう。
end = datetime.now()
start = datetime(end.year - 1,end.month,end.day)

# それぞれの企業ごとに、Yahooのサイトからデータを取得します
for stock in tech_list:   
    # それぞれの名前でDataFrameを作ります。
    globals()[stock] = DataReader(stock,'yahoo',start,end)
    

globals()は文字列をそのままPythonのコードにするためで、tech_listに並んでいる文字列がそのままDataFrameになります。

まずは、感覚を掴むために、Appleの株価をみていきましょう。

In [4]:
# データの概観を掴むことができます。
AAPL.describe()
Out[4]:
Open High Low Close Volume Adj Close
count 252.000000 252.000000 252.000000 252.000000 2.520000e+02 252.000000
mean 120.175754 121.244524 118.863095 120.040000 5.179373e+07 119.061554
std 7.688009 7.465655 7.917412 7.683550 2.117728e+07 7.387135
min 94.870003 107.029999 92.000000 103.120003 1.302370e+07 102.680478
25% 113.174999 114.357500 111.967501 113.372502 3.735410e+07 112.953997
50% 120.795002 121.584999 119.349998 120.299999 4.707700e+07 119.658136
75% 127.142502 127.907497 125.982502 126.912502 5.952868e+07 125.492359
max 134.460007 134.539993 131.399994 133.000000 1.622063e+08 131.380384
In [5]:
AAPL.info()
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 252 entries, 2015-01-02 to 2015-12-31
Data columns (total 6 columns):
Open         252 non-null float64
High         252 non-null float64
Low          252 non-null float64
Close        252 non-null float64
Volume       252 non-null int64
Adj Close    252 non-null float64
dtypes: float64(5), int64(1)
memory usage: 13.8 KB

出来高と終値をプロットしてみましょう。

In [6]:
# 終値の時系列をプロットしてみます。
AAPL['Adj Close'].plot(legend=True,figsize=(10,4))
Out[6]:
<matplotlib.axes._subplots.AxesSubplot at 0x109739828>
In [7]:
# 今度は出来高(1日に取引が成立した株の数)をプロットします。
AAPL['Volume'].plot(legend=True,figsize=(10,4))
Out[7]:
<matplotlib.axes._subplots.AxesSubplot at 0x10bc0e550>

単純な折れ線グラフではなく、移動平均線(moving average)と呼ばれるグラフを描いてみましょう。


In [8]:
# pandasはもともと金融情報を扱うために作られていたので、色々な機能があります。

# 間隔ごとに移動平均を描いてみます。
ma_day = [10,20,50]

for ma in ma_day:
    column_name = "MA {}".format(str(ma))
    AAPL[column_name]=pd.rolling_mean(AAPL['Adj Close'],ma)

描画してみます。

In [9]:
AAPL[['Adj Close','MA 10','MA 20','MA 50']].plot(subplots=False,figsize=(10,4))
Out[9]:
<matplotlib.axes._subplots.AxesSubplot at 0x10ba953c8>

Section 2 - 株価と日ごとの変動

株式投資のリスクを管理するために、日ごとの変動について計算してみます。

In [10]:
# pct_changeを使うと、変化の割合を計算できます。
AAPL['Daily Return'] = AAPL['Adj Close'].pct_change()
# 変化率をプロットしてみましょう。
AAPL['Daily Return'].plot(figsize=(10,4),legend=True,linestyle='--',marker='o')
Out[10]:
<matplotlib.axes._subplots.AxesSubplot at 0x10bf3e2e8>

前日比(%)のヒストグラムを描いてみましょう。Seabornを使えば、KDEプロットも一緒に描けます。

In [11]:
# NaNを取り除くコードを書いておく必要があります。
sns.distplot(AAPL['Daily Return'].dropna(),bins=100,color='purple')

# こんなコードでもOK
# AAPL['Daily Return'].hist(bins=100)
Out[11]:
<matplotlib.axes._subplots.AxesSubplot at 0x1098af0f0>

ハイテク4社の株価を1つのDataFrameにまとめてみましょう。

In [12]:
# 簡単なコードで実現出来ます。
closing_df = DataReader(['AAPL','GOOG','MSFT','AMZN'],'yahoo',start,end)['Adj Close']
In [13]:
# 確認しておきましょう。
closing_df.head()
Out[13]:
AAPL AMZN GOOG MSFT
Date
2015-01-02 107.498407 308.519989 524.812404 45.520756
2015-01-05 104.470005 302.190002 513.872306 45.102155
2015-01-06 104.479839 295.290009 501.962262 44.440176
2015-01-07 105.944875 298.420013 501.102268 45.004803
2015-01-08 110.015518 300.459991 502.682255 46.328761

アップル社でやったように、終値の日ごとの変化を計算します。

In [14]:
# 別のDataFrameにしておきます。
tech_rets = closing_df.pct_change()

終値の変化を会社ごとに比較できるようになりました。

In [15]:
# Google同士なら、完全に相関します。
sns.jointplot('GOOG','GOOG',tech_rets,kind='scatter',color='seagreen')
Out[15]:
<seaborn.axisgrid.JointGrid at 0x10c5c49e8>

相関があるかどうか、別の会社同士を比べてみましょう。

In [16]:
# GoogleとMicrosoftを比べてみます。
sns.jointplot('GOOG','MSFT',tech_rets,kind='scatter')
Out[16]:
<seaborn.axisgrid.JointGrid at 0x10cdc9208>

2つの会社の株価の変化率は相当関係があることがわかります。pearsonrは相関係数(正確には、ピアソン積率相関係数)ですが、0.52と正に相関していることを示しています。

url - https://ja.wikipedia.org/wiki/%E7%9B%B8%E9%96%A2%E4%BF%82%E6%95%B0

相関係数について、感覚的な理解を助けてくれる図を紹介しておきます。

In [21]:
from IPython.display import SVG
SVG(url='http://upload.wikimedia.org/wikipedia/commons/d/d4/Correlation_examples2.svg')
Out[21]:
R SVG Plot R SVG Plot with tooltips! (mode=1) image/svg+xml R SVG Plot 1 0.8 0.4 0