pandasを使用して2つの銘柄の日次リターンの時系列相関を求める
ここでは「1803 清水建設」と「8698 マネックスグループ」の時系列相関を求める。
移動平均やヒストリカルボラティリティを求めるのと殆ど同じ方法で求められる。
pandas.DataFrame.rollingを使用して、その結果にcorr関数を作用させるだけ。
rolling_corr = daily_pct_change['1803'].rolling( window=20 ).corr( daily_pct_change['8698'] ).dropna()
データ取得から可視化までのコードは次。
rolling_corr関数は将来deprecatedされる予定のようだ。
#coding:utf-8 import pandas as pd import numpy as np import datetime as dt import pandas_datareader.data as pdd ######## Define Method ######## def getMultiStockData(tickerList, date_from, date_to): def getStockData(ticker): stockData = pdd.DataReader(ticker, 'yahoo', date_from, date_to) return stockData datas = map(getStockData, tickerList) return pd.concat(datas, keys=tickerList, names=['Ticker', 'Date']) ######### 処理 ######### # 期間設定 date_from = dt.date(2016, 1, 1) date_to = dt.date(2016, 12, 16) # 株価取得 tickerList = ['1803', '8698'] multiStockData = getMultiStockData(tickerList, date_from, date_to) ######### 終値取得と日次リターン ######### # 終値を取得 adjClosingPrice = multiStockData[['Adj Close']] adjClosingPrice = adjClosingPrice.reset_index() # pandas.DataFrameをpivotingして終値データをticker毎に纏める adjClosingPriceTable = adjClosingPrice.pivot( index='Date', columns='Ticker', values='Adj Close' ) # 日次リターンを求める daily_pct_change = adjClosingPriceTable.pct_change() # 日次リターンの計算 daily_pct_change.fillna(0, inplace=True) # Nanを0で埋める # 日次リターンの相関を求める # rolling_corr = pd.rolling_corr( # daily_pct_change['1803'], # daily_pct_change['8698'], # window=250 # ).dropna() rolling_corr = daily_pct_change['1803'].rolling( window=20 ).corr( daily_pct_change['8698'] ).dropna() rolling_corr.plot()