見出し画像

【Python】【相場】先物指数や株価指数等を取得して描画し、相関を確認する

ドル、ビットコイン(BTC)、イーサリアム(ETH)、ジャンク債、金、銅、原油、半導体、Russel 2000指数、SKEW指数、VIX指数、Transportation Average Index、米国10年国債とSP500の株価推移をグラフに描画し、それらとSP500の相関を確認したいと思います。

なお、最低限のポイントのみの説明にするため、Pythonライブラリ、モジュール等のインストール方法については割愛させて頂きます。お使いのPC環境等に合わせてインストールしてもらえればと思います。



1.SP500と各種指数を取得する

SP500と各種指数を取得するために、pandas-datareaderとyfinanceを使用します。stooqおよびyfinanceより取得する日付範囲と取得するコードを指定して株価情報を取得します。 https://stooq.com/

株価取得開始日:start = datetime.date.today() - datetime.timedelta(days=180)(今日から180日前までのを取得)
株価取得終了日:end = datetime.date.today()(今日の日付を取得)

各種ライブラリをインポートします。

import pandas_datareader.data as web
import yfinance as yf
import datetime
import pandas as pd

import matplotlib.pyplot as plt
from matplotlib import gridspec
import japanize_matplotlib
%matplotlib inline

SP500と各種指数のティッカーコードをリストに格納します。

# 確認対象銘柄

# stooqより取得
codelists_stooq = [
    '^SPX', # S&P 500
]

# yahoofinanceより取得
codelists_yf = [
    'HG=F', # copper(銅)
    'GC=F', # Gold(金)
    'CL=F', # Oil(原油)
    'SOXX', # 半導体
    '^DJT', # Transportation Average Index(DJTA)
    '^RUT', # Russel 2000
    '^VIX', # VIX index
    '^SKEW', # SKEW index
    'HYG', # ジャンクボンド
    '^TNX', # アメリカ10年国債
    'DX=F', # ドルインデックス
    'BTC-USD', # BTC
    'ETH-USD', # ETH
    
]

'^SPX':S&P500の株価指数
'DX=F':ドル
'BTC-USD':ビットコインの価格を米ドルで表したもの。BTC-USDはビットコインの米ドルに対する価格
'ETH-USD':イーサリアムの価格を米ドルで表したものです。ETH-USDはイーサリアムの米ドルに対する価格
'HYG':ジャンク債
'GC=F':金(Gold)の先物価格
'HG=F':銅(Copper)の先物価格
'CL=F':原油(Crude Oil)の先物価格
'SOXX':半導体指数
'^RUT':Russell 2000 Index(ラッセル2000指数)アメリカの中小型企業の株式のパフォーマンスを追跡する指数
'^SKEW':CBOE SKEW Index(CBOEスキュー指数)市場参加者の長期的なリスクに関する見通しを提供する指数。高いスキュー値は、市場の大きな下落のリスクが増加していることを示唆
'^VIX':CBOE Volatility Index(CBOEボラティリティ指数)オプション市場のボラティリティを測定する指数であり、市場の恐怖心や不安のレベルを示す
'^DJT':Dow Jones Transportation Average(ダウ・ジョーンズ・トランスポーテーション・アベレージ)アメリカの運輸・輸送業界の株式のパフォーマンスを追跡する指数
'^TNX':米国10年国債利回り

現在の日時を最終日とし、180日前の日時を開始日として、stooqとyfinanceからSP500と各種指数を取得します。そして、stooqとyfinanceから取得したデータを結合します。

# 開始・終了日の設定
start = datetime.date.today() - datetime.timedelta(days=180)
end = datetime.date.today()

# データ取得(stooq)
_df_stooq = web.DataReader(codelists_stooq, 'stooq', start, end)['Close']

# 日付を昇順に並び替える
_df_stooq.sort_index(inplace=True)

# データ取得(yahoo finance)
_df_yahoo = yf.download(codelists_yf, start, end)['Adj Close']

# _df_stooqと_df_yahooを結合する
df = pd.DataFrame()
df = pd.merge(_df_stooq, _df_yahoo, on='Date', how='left')

カラム名を変更します。

# カラム名変更
df.rename(columns={

    '^SPX':'S&P 500',
    'BTC-USD':'BTC',
    'CL=F':'原油',
    'DX=F':'ドル',
    'ETH-USD':'ETH',
    'GC=F':'金',
    'HG=F':'銅',
    'HYG':'ジャンクボンド',
    'SOXX':'半導体',
    '^DJT':'Dow30',
    '^RUT':'Rs2000',
    '^SKEW':'SKEW',
    '^TNX':'金利10Y',
    '^VIX':'VIX',
               
},inplace=True)


データを描画します。

##取得したデータを一覧表示するおまけ機能###
df.plot(figsize=(14,10),linewidth=2,alpha=0.5,subplots=True,layout=(7,3),grid=False)


次に、plotlyを使ってグラフに表示していきます。plotlyについては、以前に描画方法と見た目に関わる設定について投稿しているので参考にしてもらえればと思います。

●plotlyでグラフを描画

https://note.com/scilabcafe/n/n33ab918f9cda

https://note.com/scilabcafe/n/nf49892c4ae11

import plotly.graph_objects as go  # グラフ表示関連ライブラリ
import plotly.io as pio  # 入出力関連ライブラリ
pio.renderers.default = 'iframe'

# subplot
from plotly.subplots import make_subplots


# グラフの実体となる trace オブジェクトを生成
trace_1 = go.Scatter(x=df.index, y=df['S&P 500'], mode='lines', line=dict(color='red', width=2), name='SP500')
trace_2 = go.Scatter(x=df.index, y=df['ドル'], mode='lines', line=dict(color='red', width=2), name='ドル')
trace_3 = go.Scatter(x=df.index, y=df['BTC'], mode='lines', line=dict(color='red', width=2), name='BTC')        
trace_4 = go.Scatter(x=df.index, y=df['ETH'], mode='lines', line=dict(color='red', width=2), name='ETH')
trace_5 = go.Scatter(x=df.index, y=df['ジャンクボンド'], mode='lines', line=dict(color='red', width=2), name='ジャンクボンド')
trace_6 = go.Scatter(x=df.index, y=df['金'], mode='lines', line=dict(color='red', width=2), name='金')
trace_7 = go.Scatter(x=df.index, y=df['銅'], mode='lines', line=dict(color='red', width=2), name='銅')
trace_8 = go.Scatter(x=df.index, y=df['原油'], mode='lines', line=dict(color='red', width=2), name='原油')
trace_9 = go.Scatter(x=df.index, y=df['半導体'], mode='lines', line=dict(color='red', width=2), name='半導体')
trace_10 = go.Scatter(x=df.index, y=df['Rs2000'], mode='lines', line=dict(color='red', width=2), name='Rs2000')
trace_11 = go.Scatter(x=df.index, y=df['SKEW'], mode='lines', line=dict(color='red', width=2), name='SKEW')
trace_12 = go.Scatter(x=df.index, y=df['VIX'], mode='lines', line=dict(color='red', width=2), name='VIX')
trace_13 = go.Scatter(x=df.index, y=df['Dow30'], mode='lines', line=dict(color='red', width=2), name='Dow30')
trace_14 = go.Scatter(x=df.index, y=df['金利10Y'], mode='lines', line=dict(color='red', width=2), name='金利10Y')


rows=4
cols=4

subplots_fig = make_subplots(
    rows=rows,
    cols=cols,
    start_cell='top-left',
    subplot_titles=[
        'SP500',
        'ドル',
        'BTC',
        'ETH',
        'ジャンクボンド',
        '金',
        '銅',
        '原油',
        '半導体',
        'Rs2000',
        'SKEW',
        'VIX',
        'Transportation Average Index',
        '米国10年国債',
    ],
    horizontal_spacing=0.08,
    vertical_spacing=0.12,
)


# 描画領域である figure オブジェクトの作成                  
subplots_fig.add_trace(trace_1, row=1, col=1)
subplots_fig.add_trace(trace_2, row=1, col=2)
subplots_fig.add_trace(trace_3, row=1, col=3)
subplots_fig.add_trace(trace_4, row=1, col=4)

subplots_fig.add_trace(trace_5, row=2, col=1)
subplots_fig.add_trace(trace_6, row=2, col=2)
subplots_fig.add_trace(trace_7, row=2, col=3)
subplots_fig.add_trace(trace_8, row=2, col=4)

subplots_fig.add_trace(trace_9, row=3, col=1)
subplots_fig.add_trace(trace_10, row=3, col=2)
subplots_fig.add_trace(trace_11, row=3, col=3)
subplots_fig.add_trace(trace_12, row=3, col=4)

subplots_fig.add_trace(trace_13, row=4, col=1)
subplots_fig.add_trace(trace_14, row=4, col=2)

# レイアウトの更新
subplots_fig.update_layout(
    
    # 凡例は表示
    showlegend=False,
    
    # 幅と高さの設定
    width=1200,height=900,
    
    title='米国の主要インデックスと各種指数',
    plot_bgcolor='white', # 背景色を白に設定
    
),


for row in range(1,rows+1):
    for col in range(1, cols+1):
        
        # linecolorを設定して、ラインをミラーリング(mirror=True)して枠にする
        subplots_fig.update_xaxes(linecolor='black', linewidth=1, mirror=True, row=row, col=col)
        subplots_fig.update_yaxes(linecolor='black', linewidth=1, mirror=True, row=row, col=col)
        
        # ticks='inside':目盛り内側, tickcolor:目盛りの色, tickwidth:目盛りの幅、ticklen:目盛りの長さ
        subplots_fig.update_xaxes(ticks='inside', tickcolor='black', tickwidth=1, ticklen=5, row=row, col=col)
        subplots_fig.update_yaxes(ticks='inside', tickcolor='black', tickwidth=1, ticklen=5, row=row, col=col)
        
        # gridcolor:グリッドの色, gridwidth:グリッドの幅、griddash='dot':破線
        subplots_fig.update_xaxes(gridcolor='lightgrey', gridwidth=1, griddash='dot', row=row, col=col)
        subplots_fig.update_yaxes(gridcolor='lightgrey', gridwidth=1, griddash='dot', row=row, col=col)

        # 軸の文字サイズ変更
        subplots_fig.update_xaxes(tickfont=dict(size=12, color='grey'), row=row, col=col)
        subplots_fig.update_yaxes(tickfont=dict(size=14, color='grey'), row=row, col=col)
        
# show()メソッドでグラフを描画
subplots_fig.show()

2.各指数間の相関を確認する

df.corr() # 相関関係

次に、相関係数の関係をヒートマップで可視化します。

import seaborn as sns

plt.figure(figsize=(10,8))
cor = df.corr()
sns.heatmap(cor, cmap= sns.color_palette('coolwarm', 10), annot=True,fmt='.2f', vmin = -1, vmax = 1)


各指数間の相関について一目で確認することができました。

今回は、先物指数や株価指数等を取得して可視化すると共に、各指数間の相関を確認しました。今後は、直近のパフォーマンスとの関係などについても調査していきたいと思います。



この記事が気に入ったらサポートをしてみませんか?