AIとファイナンス

AIとファイナンスの架け橋、それがこのブログの目指すところです。兼業投資家向けに、Pythonを駆使して株やFXの分析を「自分で」行えるようになるための情報を提供します。ニューラルネットワークを活用した市場予測から、実証済みの金融理論まで、全てのコードを公開し、誰もが活用できるように!是非色々なコードで遊んでみてください!

【分析】米国の各セクターの相関関係【米国株】

こんにちは!前回の記事では米国で上場している会社のセクターには11種類あってそれぞれ対応するETFが2社ある、というお話をしました!今回はPythonを使ってセクターそれぞれの相関関係を調べてみましょう。相関関係を追うと例えばあるセクターの平均株価が下がったときに別のセクターが上がったりすることがあるのか?など市場の理解を深める手助けになります。早速コードを見ていきますがいつも通り最下部にコードへのリンクを貼っていますので皆さま是非試してください。

yfinanceを使ってセクターごとのデータをダウンロード

では、Pythonyfinanceライブラリを使用して、セクターごとの過去5年間のデータをダウンロードする方法について説明します。yfinanceは、Yahoo Financeから金融データを簡単に取得できる非常に便利なツールです。

import yfinance as yf
import pandas as pd

etfs = {
    "Information Technology": "XLK",
    "Financials": "XLF",
    "Communication Services": "XLC",
    "Health Care": "XLV",
    "Consumer Discretionary": "XLY",
    "Consumer Staples": "XLP",
    "Industrial": "XLI",  
    "Real Estate": "XLRE",  
    "Energy": "XLE",
    "Utilities": "XLU",
    "Materials": "XLB"
}

# 各ETFの過去5年間のデータをダウンロードして辞書に格納
data = {}
for name, symbol in etfs.items():
    data[name] = yf.download(symbol, start="2014-01-01", end="2024-01-01")

ボラティリティの計算と視覚化
ボラティリティを計算するために、各セクターの日次リターンの標準偏差を求め、年率換算します(株式市場が年間約252日営業していると仮定)。

import numpy as np
import matplotlib.pyplot as plt

# 各セクターのボラティリティを計算
volatility = {name: np.log(df['Close'] / df['Close'].shift(1)).std() * np.sqrt(252) for name, df in data.items()}

# ボラティリティのバープロット
plt.figure(figsize=(10, 6))
plt.bar(volatility.keys(), volatility.values())
plt.ylabel('Volatility')
plt.title('Volatility of the sectors')
plt.xticks(rotation=45)
plt.show()

各セクターボラティリティ

このようにみるとエネルギーセクターはアップダウンが激しく、逆に一番安定しているのは一般消費財セクターということがわかります。エネルギーセクターは原油などの原材料の価格変動リスクにもろにさらされることもあって値動きが激しいのでしょうか?

取引量の視覚化
また今回は取引量の可視化も以下のコードを使って行いました。

# 各セクターの取引量の平均を計算
volume_avg = {name: df['Volume'].mean() for name, df in data.items()}

# 取引量の平均のバープロット
plt.figure(figsize=(10, 6))
plt.bar(volume_avg.keys(), volume_avg.values(), color='orange')
plt.ylabel('Average volume of Trades')
plt.title('Trading volume of the sectors')
plt.xticks(rotation=45)
plt.show()

各セクターの取引量

相関関係の計算

相関関係のヒートマップを作成するためには、まず各セクターの日次リターンを計算し、それらの間の相関係数を計算します。そして、seabornライブラリを使用して、相関係数のヒートマップを描画します。相関係数は-1から1までの値を取り、1は完全な正の相関、-1は完全な負の相関を意味します。

import seaborn as sns

# 各セクターの日次リターンを計算
returns = pd.DataFrame()
for name, df in data.items():
    returns[name] = df['Close'].pct_change()

# 日次リターンの相関係数を計算
corr = returns.corr()

# 相関係数のヒートマップを描画
plt.figure(figsize=(10, 8))
sns.heatmap(corr, annot=True, cmap='coolwarm', center=0)
plt.title('Sector Correlation Heatmap')
plt.show()

各セクターの日次リターンの相関関係

基本的には全て株式、同じ資産クラスなので上がるときは一緒、落ちる時も一緒ということがなんとなく見えてきます。引き続き価格の相関関係を出すコードを見てましょう。

# 各セクターの終値を格納するDataFrameを初期化
prices = pd.DataFrame()

# 各セクターETF終値データをDataFrameに追加
for name, df in data.items():
    prices[name] = df['Close']

# 終値相関係数を計算
price_corr = prices.corr()

# 相関係数のヒートマップを描画
plt.figure(figsize=(10, 8))
sns.heatmap(price_corr, annot=True, cmap='coolwarm', center=0)
plt.title('Price Correlation Heatmap')
plt.show()

各セクターのETF価格の相関関係

これは面白いことにエネルギーセクターがそのほかのものと比べて負の相関があることがわかります。先ほどの一般消費財と一番負の大きな相関を見せていますね。そのままの意味で行くとエネルギーセクターのETF価格が落ちる時は一般消費財の価格が上がり、その逆もまた然り、ということですね。(今回は配当金をリターンに入れれていないのでそこまで含めるとまた結果は変動するものと思われます。)

いずれにせよ、価格の相関関係を分析することにより、特定のセクターが市場の他の部分とどのように相互作用しているかを把握することができました。。高い相関関係が見られるセクターは、市場の特定のトレンドやイベントに対して類似した反応を示す可能性があることがわかりますね。このような分析は、ポートフォリオの多様化戦略を考える上で非常に重要であり、市場の様々な変動に対するリスクを管理するのに役立ちます。

今回もここまで読んでいただきありがとうございました。

colab.research.google.com