今日も窓辺でプログラム

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

日経平均の日中の値動きと高い相関のある他国の指数は存在するのか?

この記事について

以前までの記事で、「日経平均株価の終値が、その日の始値に比べて上がる(UP)のか、下がる(DOWN)のか、ほぼ変わらない(SAME)のか」をTensorFlowを使って予測しようとするシリーズを投稿していました。
日経平均が日中どのくらい変動するかをTensorFlowで予測する (今までのまとめ) - 今日も窓辺でプログラム

いろいろ試しても精度がいまいちよくなかったので、その原因を探ってみよう、という記事です。

具体的には、過去数年分の株価指標と、今まで予測しようとしていた日経平均の日中の値動きの相関がどの程度かを確かめてみます。

データの準備

まずは、分析する対象のデータを準備します。前回までの記事で使用したのと同じ株価指標を2010年1月~2016年9月分まで用意します。具体的には以下の指標です*1

  • Nikkei 225, Japan
  • Hang Seng, Hong Kong
  • All Ords, Australia
  • DAX, German
  • Dow, US
  • S&P 500, US
  • Shanghai Composite Index (China)
  • BOVESPA, Brazil

今回はYahoo! Finance(英語)から時系列データをダウンロードします。たとえば、日経平均ならこちらからダウンロードできます。

対象データをpandasのPanelにロードする

後に示すようなコードで、2010年以降の株価指数のデータをpandasのPanel(3次元を扱うためのデータ構造)にロードします。itemsを株価指数、major_axisを日付、minor_axisが始値・終値などのデータの種類になるようにコードを書いています。

pandasのPanelはDataFrameに比べるとメジャーじゃないかと思いますので、馴染みのない方向けにこの記事で解説しています。
pandasで使われるデータ構造 ~1次元、2次元、3次元のデータの扱い方~ - 今日も窓辺でプログラム

コードはこちらです。動作確認はJupyter Notebookで行っています。

import pandas as pd
import numpy as np

# 対象の株価指標
# 日経平均だと./data/N225.csvというファイル名でデータを保存してあります
INDEX_LIST = ["N225",   # Nikkei 225, Japan
               "HSI",   # Hang Seng, Hong Kong
               "AORD",  # All Ords, Australia
               "GDAXI", # DAX, German
               "DJI",   # Dow, US
               "GSPC",  # S&P 500, US
               "SSEC",  # Shanghai Composite Index (China)
               "BVSP"]  # BOVESPA, Brazil

# 対象期間
start_date = "2010-01-01"
end_date = "2016-09-30"

# 対象データ
CSV_HEADER = ["Open", "High", "Low", "Close", "Volume", "Adjusted Close"]

# items, major_axis, minor_axisの3つの軸を設定する
wp = pd.Panel(items=INDEX_LIST, major_axis=pd.date_range(start=start_date, end=end_date), minor_axis=CSV_HEADER)

# 株価指数ごとにCSVを読み込んで、対象期間のデータを取り出す
for index in INDEX_LIST:
    df = pd.read_csv("./data/" + index + ".csv", index_col="Date", parse_dates="Date")
    df = df[(start_date <= df.index) & (df.index <= end_date)]
    wp[index] = df

これで、対象データが1つのPanelに収まりました。wpはこんな感じの形になっています。

<class 'pandas.core.panel.Panel'>
Dimensions: 8 (items) x 2465 (major_axis) x 6 (minor_axis)
Items axis: N225 to BVSP
Major_axis axis: 2010-01-01 00:00:00 to 2016-09-30 00:00:00
Minor_axis axis: Open to Adjusted Close

追加で2つの値を計算

前回までも使っていた、当日の日中の値動き(Diff)と、前日終値から当日始値までの値動き(Jump)も計算しておきます。

# 当日の値動き(Diff)と前日終値から当日始値の差(Jump)を計算する
for index in INDEX_LIST:
    wp[index]["Diff"] = wp[index]["Close"] / wp[index]["Open"] - 1
    wp[index]["Jump"] = wp[index]["Open"] / wp[index]["Close"].shift() - 1

日経平均の日中の値動きとの相関係数

予想したい値であった、日経平均の日中の値動き (= wp["N225"]["Diff"])が他の株価指数の様々な値とどの程度相関があるのか見てみます。
日本市場は1日のうちで一番早いので、ある日の株価指数と、その翌日の日経平均の日中の値動きの相関を見る形になります。

こんな感じでしょうか。

# 日経平均の日中の値動きを取りだしておく
# 翌日の値動きを予測するので-1方向にshiftしておく
for index in INDEX_LIST:
    wp[index]["N225_Diff"] = wp["N225"]["Diff"].shift(-1)

# 各指数の様々な値と日経平均の日中値動きの相関係数を表示
for index in INDEX_LIST:
    print("*** " + index + " ***")
    print(wp[index].corr().iloc[:, -1][:-1])
    print()

結果はこうなります。

*** N225 ***
Open             -0.027829
High             -0.028646
Low              -0.028967
Close            -0.030558
Volume           -0.025373
Adjusted Close   -0.030558
Diff             -0.070867
Jump              0.028359
Name: N225_Diff, dtype: float64

*** HSI ***
Open              0.009439
High              0.008957
Low               0.004688
Close             0.006267
Volume            0.028572
Adjusted Close    0.006267
Diff             -0.032896
Jump              0.023529
Name: N225_Diff, dtype: float64

*** AORD ***
Open             -0.010481
High             -0.008735
Low              -0.008133
Close            -0.009402
Volume           -0.005641
Adjusted Close   -0.009402
Diff              0.008072
Jump              0.043126
Name: N225_Diff, dtype: float64

*** GDAXI ***
Open             -0.009706
High             -0.007120
Low              -0.005843
Close            -0.004028
Volume           -0.033409
Adjusted Close   -0.004028
Diff              0.116796
Jump             -0.054043
Name: N225_Diff, dtype: float64

*** DJI ***
Open             -0.006457
High             -0.005188
Low              -0.002855
Close            -0.003466
Volume           -0.031319
Adjusted Close   -0.003466
Diff              0.061109
Jump             -0.052528
Name: N225_Diff, dtype: float64

*** GSPC ***
Open             -0.011321
High             -0.010553
Low              -0.008310
Close            -0.008910
Volume           -0.046211
Adjusted Close   -0.008910
Diff              0.056142
Jump             -0.009714
Name: N225_Diff, dtype: float64

*** SSEC ***
Open             -0.047992
High             -0.048302
Low              -0.049204
Close            -0.049740
Volume           -0.025292
Adjusted Close   -0.049740
Diff             -0.024130
Jump             -0.010612
Name: N225_Diff, dtype: float64

*** BVSP ***
Open              0.001790
High              0.002939
Low               0.008569
Close             0.007116
Volume           -0.010727
Adjusted Close    0.007116
Diff              0.050660
Jump              0.020433
Name: N225_Diff, dtype: float64

どの株価指数のどの値を見てもほとんどが相関係数0.1未満という結果で、全然相関がないことがわかりました。

同じ分析を日経平均の終値 (= wp["N225"]["Close"])に対して行うとそれなりに相関がある値が多いのですが、日中の値動きは全然だめだったんですね。
なんとなくこの分析をする機会のないまま予測をしようと頑張っていましたが、もう少し早い段階でこの分析をしておくべきでした。。。

このままこのシリーズを続けてもこの様子では進展しそうがないので、次の株シリーズは今までとは違うアプローチで何かできたらなと考えています。
ひとつアイデアは持っているので、そちらの実装が終わって何か見せられるものがあったら、また記事を書いてご紹介しようかと思っています。


関連記事

日経平均をテクニカル指標を使って分析してみました。
www.madopro.net

*1:有名な指標で入っていないものもありますが、それらは今使っているAPI経由でデータがとってこれないなどの大人の事情があるからです