ゆるふわめも

東京か京都にいます。

時系列データ解析のメモ+pythonで株価の取得

GWが始まる前に簡単に覚えておきたい.

※かきかけです

時系列データとは

  • 時系列: 決められた間隔にしたがって観測されるデータ列
  • 点過程: 適当なタイミングで生起するデータを観測したもの(観測した値と、観測した時間に意味があるデータ)
    • 例:カウント点過程:時間内にて生起した点の数の統計的性質を観測したもの

よく出る確率分布・密度関数

待ち行列を学習するときによく見たものが多い.

  • 正規分布
  • ポアソン分布
  • 二項分布

など.

ポアソン分布

単位時間あたりにあるお店に

{ \displaystyle
 \lambda = \frac{K}{T}
}

の数だけお客さんがくるとして,それぞれの客は互いに独立に店にくる時間を選ぶとすれば, t = (y, y+x] の時間内にくるお客さんがk人である確率は

f:id:misos:20170504013709p:plain

とできる. ここで T→∞, K→∞としていくケースを考えるとポアソン分布

f:id:misos:20170504013721p:plain

となる(平均 λx を持つポアソン分布).

goodness of fit test

データに上記のような確率分布を当てはめて, その当てはまり具合を検証する.

pythonにて株価を取得

pandas_datareaderのインストール

pip install pandas_datareader 
conda install pandas-datareader # anaconda 環境の場合はこっち

としてインストールされる.

この状態でpandas (0.19.2), pandas-datareader (0.3.0.post0)がインストールされていれば、以下のコードは動きます.

データの取得

必要最小限のもののみ. 株価以外の細かいデータの取得はドキュメントを参照してください.

ドキュメント: Remote Data Access — pandas-datareader 0.1 documentation

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from datetime import datetime
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from pandas_datareader import data

_from, _to = datetime(2012,1,1), datetime(2017,1,1)
stock = data.DataReader("F", 'yahoo', _from, _to)

print(stock)

とすれば

Open High    Low Close   Volume  Adj Close
Date                        
2012-01-03  11.00   11.25   10.99   11.13   45709900    8.993629
2012-01-04  11.15   11.53   11.07   11.30   79725200    9.130998
2012-01-05  11.33   11.63   11.24   11.59   67877500    9.365333
2012-01-06  11.74   11.80   11.52   11.71   59840700    9.462299
2012-01-09  11.83   11.95   11.70   11.80   53981500    9.535024
2012-01-10  12.00   12.05   11.63   11.80   121750600   9.535024
2012-01-11  11.74   12.18   11.65   12.07   63806000    9.753198
2012-01-12  12.16   12.18   11.89   12.14   48687700    9.809762
2012-01-13  12.01   12.08   11.84   12.04   46366700    9.728957
2012-01-17  12.20   12.26   11.96   12.02   44398400    9.712796

と取得できるはず. このデータを用いてデータ解析の練習をする.

データのプロット

_open, _close = stock['Open'], stock['Close']
plt.plot(_open, label="open")
plt.plot(_close, label="close")
plt.legend()

f:id:misos:20170504005246p:plain

対数収益率の計算

対数差分をとることで、実データの分散を小さくしてデータを捉えることができるようになります.

logdiff = np.log(_open[1:].values) - np.log(_open[:-1].values)
plt.plot(logdiff, label="log diff")
plt.legend()

f:id:misos:20170504010352p:plain

統計量の計算・分析

平均・分散・相関

平均、分散は省略. 他の会社(yahoo, google)との相関をプロットしてみてみます. データ取得のたびに何回も上のようなコードを書くのは面倒なので、関数を定義しています.

def _get_timeseries_data(company_name, column_name, target='F', 
                        start=datetime(2016,1,1), end=datetime(2017,1,1)):
    target_data = data.DataReader(target, company_name, start, end)
    return target_data[column_name]

yahoo = _get_timeseries_data('yahoo', 'Open')
google = _get_timeseries_data('google', 'Open')
plt.scatter(yahoo, google, marker='x')

f:id:misos:20170504011613p:plain

ヒストリカルボラティリティー

何かと思ったら標準偏差でした.

np.std(yahoo), np.std(google)

(0.662619218725916, 0.66224033569369867)

検定

shapiro-wilk検定

scipy.stats.shapiroに便利な関数が定義されていました. 正規分布への適合具合をテストします.

The Shapiro-Wilk test tests the null hypothesis that the data was drawn from a normal distribution.

from scipy import stats
stats.shapiro(yahoo)

Ljung-Box検定

PyPR Documentにて関数が定義されていたのでインストールして利用します. データに自己相関が含まれているかどうかを検証します.

pip install pypr

でインストールしたものはLjung-Boxがないためエラーになる…?

単位根検定・定常性検定

時系列データがランダムウォークにしたがっているかを検証する検定. 単位根検定での検定統計量は正規分布に従わないことに注意.

  • KPSS 検定
  • McCabe 検定
  • Dickey-Fuller 検定
  • Phillips-Perron 検定

モデル

AR(Auto Regressive)

MA(Moving Average)

直前の状態が次の状態に大きく影響する時系列データに対して有効なモデル.

ARMA(AutoRegressive Moving Average)

ARIMA(AutoRegressive Integrated Moving Average)

SARIMA(Seasonal AutoRegressive Integrated Moving Average)

Skew-GARCH(multivariate Skew-GARCH)

参考文献

経済・ファイナンスデータの計量時系列分析 (統計ライブラリー)

経済・ファイナンスデータの計量時系列分析 (統計ライブラリー)