今日も窓辺でプログラム

外資系企業勤めのエンジニアが勉強した内容をまとめておくブログ

日経平均と相関のある経済指数は何か?(2)

前回のまとめ

前回の記事の続きです。
日経平均と相関のある経済指数は何か?(1) - 今日も窓辺でプログラム

datalab/FinancialTimeSeriesTensorFlow.ipynb at master · corrieelston/datalab · GitHub で紹介されている、世界の経済指数を使って株価を予想するための下準備を、元記事の内容を日経平均に置き換えて試していました。
前回は世界のマーケットの終値がどの程度相関があるのかを、正規化した終値の散布図行列を描画して確認しました。しかし、終値をただ正規化しただけでは予測をするためのモデル作りには役立たないということです。*1
では、どうすると実際の予測にも役立つデータの相関がみられるのか、記事の続きを読み進めていきたいと思います。

対数リターン

記事によると、実用上は以下で定義される対数リターンという値を用いると良いようです。
 {\displaystyle
\ln \left(\frac{V_t}{V_{t-1}}\right)
}
 V_t はある指数の時刻t時点での値です。

初めて聞いた単語なのですが、対数リターンでググると分散投資とか金融数学とかいうページや大学の講義スライドが引っかかるので、投資の世界では有名な考え方なんですかね?

ある講義資料(http://www.ier.hit-u.ac.jp/~iwaisako/class/Efinance2008/Efinance02_08dist.pdf)には、対数リターンを使用するメリットが3つ挙げられています。

(1) 有限責任の原則との整合性: 正規性を仮定しても株価は負の値を取らない.
(2) 多期間のリターンを足し算で計算できる.
(3) ブラック=ショールズ等で用いられる対数正規モデルとの整合性

http://www.ier.hit-u.ac.jp/~iwaisako/class/Efinance2008/Efinance02_08dist.pdf

(1)と(3)はなんのこっちゃ、という感じですが、(2)に関しては、株の利益は利益率を掛け算で計算しますが、対数をとると足し算に落とせて計算が楽になる、ということでしょう。

他にも、こんな感じのサイトを参考にしました。

対数リターンの計算

実は、対数リターンを計算するコードは前回の記事に既に掲載してあります。

if logreturn:
    closing_data[index] = np.log(closing_data[index] / closing_data[index].shift())

この部分がその計算に相当し、この計算は次のように呼び出せます。

s = StockData()
s.download()
s.get_closing_data(normalize=True, logreturn=True)

プロットしてみる

前回と同様、この値をプロットしてあげると次のようになります。
f:id:kanohk:20160714011730p:plain
ちょっとごちゃごちゃしていますが、どの指数も同じようなスケール感で、0が中心になっているいい感じのデータのようです。*2
さらに、自己相関のプロットはこう。
f:id:kanohk:20160714012005p:plain
何も見えないですね。自己相関なしです。ある一つの対数リターンに関しては、過去から未来を予測できない、ということですね。そこで必要になるのが先ほどの世界各地のマーケットの対数リターンの値です。
では、前回と同様、世界の指数がどの程度相関があるのかを散布図行列を描画して確認してみます。
f:id:kanohk:20160714012715p:plain

相関係数を求める

USの指数の間で強い相関がみられる以外は、あまり強い相関は見られないように見えます。大丈夫でしょうか…。
具体的に、日経平均とほかの指数との相関係数を計算してみます。

tmp = pd.DataFrame()
tmp['N225'] = closing_data['N225']
for index in INDEX_LIST[1:]:
    tmp[index] = closing_data[index].shift()
tmp.corr().iloc[:, 0]

日本市場は空くのが早いので、他の市場の前の日の終値を使うために.shift()しています。結果はこちら。
N225 1.000000
HSI 0.095173
AORD 0.052734
STI 0.107281
GDAXI 0.296779
FTSE 0.302845
DJI 0.404565
GSPC 0.410104
IXIC 0.393093
BVSP 0.171357

アメリカの指数とは大体0.4程度、ドイツやイギリスの欧州マーケットとも0.3程度の相関があることがわかりました。ほかのマーケットは、それ以下です。
さらに前日、2日前の終値は日経平均にどのように影響しているのか見てみます。

tmp = pd.DataFrame()
tmp['N225'] = closing_data['N225']
for index in INDEX_LIST[1:]:
    tmp[index] = closing_data[index].shift(2)
tmp.corr().iloc[:, 0]

N225 1.000000
HSI 0.029270
AORD 0.033609
STI 0.023345
GDAXI 0.026881
FTSE -0.012519
DJI 0.022715
GSPC 0.025767
IXIC 0.030933
BVSP 0.072178
こちらは、ダメですね。どのマーケットも、ほとんど相関がみられません。

まとめ

  • アメリカの指数は日経平均とやや相関がある
  • ドイツ・イギリスの指数も、アメリカほどではないが相関がある
  • 他のマーケット、および2日前の指数情報とはあまり相関がない
  • 対数リターンを使うと、計算が楽になってうれしい

元の記事では、この後は実際に株価の予測を行っています。せっかくなので、次回の記事でその部分も追っていきたいと思います。

次回記事:
日経平均の終値が前日より上がるか下がるかをTensorFlowで予測する(1) - 今日も窓辺でプログラム

*1:なぜ役に立たないのかはわからないです。なんで?

*2:"のよう"といってるのは、自分にそう判断するだけの知識がないから元記事の受け売りです。今後ちゃんと勉強します。。