※本記事のコードや情報は執筆時点の仕様に基づいています。投資は自己責任であり、必ずデモ環境や少額資金でテストした上で運用してください。
相関係数とは何か
「A株が上がるときにB株も上がる」「円高になると輸出株が下がる」という関係性を数値化したものが相関係数(Correlation Coefficient)です。
相関係数は-1から+1の間の値を取ります。
| 相関係数の値 | 意味 | 例 |
|---|---|---|
| +1に近い | 強い正の相関(一緒に動く) | 同業種の2銘柄 |
| 0に近い | 相関なし(無関係) | 異なる業種・地域 |
| -1に近い | 強い負の相関(逆に動く) | 株価と債券(一般的に) |
分散投資と相関係数の関係
分散投資が効果を発揮するのは、相関の低い資産を組み合わせたときです。相関が+1に近い銘柄ばかりを持っていても、一方が下落すれば全部下落するため分散効果がありません。
目安として相関係数0.7以上の銘柄同士は「ほぼ同じ動きをする」と考え、ポートフォリオに重複して持つ意味が薄れます。
Pythonで相関マトリクスを作る
import yfinance as yf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
import seaborn as sns
matplotlib.rcParams['font.family'] = 'Meiryo'
# ==============================
# 設定エリア
# ==============================
PORTFOLIO = {
"7203.T": "トヨタ",
"9984.T": "SBG",
"6758.T": "ソニー",
"8306.T": "三菱UFJ",
"9432.T": "NTT",
"^N225": "日経平均",
}
PERIOD = "1y"
# ==============================
# 終値データ取得
# ==============================
symbols = list(PORTFOLIO.keys())
names = list(PORTFOLIO.values())
price_data = {}
for sym in symbols:
df = yf.Ticker(sym).history(period=PERIOD)
price_data[sym] = df["Close"]
prices = pd.DataFrame(price_data).dropna()
# 日次リターンに変換
returns = np.log(prices / prices.shift(1)).dropna()
returns.columns = names # 表示名に変更
# ==============================
# 相関マトリクスの計算
# ==============================
corr_matrix = returns.corr()
print("相関マトリクス:")
print(corr_matrix.round(2).to_string())
# ==============================
# ヒートマップで可視化
# ==============================
fig, ax = plt.subplots(figsize=(8, 6))
sns.heatmap(
corr_matrix,
annot=True, # セル内に数値を表示
fmt=".2f",
cmap="RdYlGn", # 赤(負の相関)→黄→緑(正の相関)
vmin=-1, vmax=1,
ax=ax
)
ax.set_title("銘柄間の相関マトリクス(日次リターン)")
plt.tight_layout()
plt.savefig("correlation_heatmap.png", dpi=150)
plt.show()
print("ヒートマップを保存しました: correlation_heatmap.png")
必要なライブラリのインストール
seabornが未インストールの場合は以下を実行してください。
pip install seaborn
まとめ
- 相関係数は-1〜+1で2銘柄の関係性を数値化する
- 分散投資は「相関の低い銘柄を組み合わせる」ことで効果が出る
- 相関0.7以上の銘柄は実質的な分散効果が薄い
- ヒートマップを使うと複数銘柄の相関を一目で把握できる
