※本記事には広告・アフィリエイトリンクが含まれます。収益はサイト運営・検証費用に充てています。
結論から言うと:
- yfinanceのdownload()に銘柄リストを渡すだけで複数銘柄の株価を一括取得できる仕組みです
- 株価の絶対値はバラバラなため、基準日を100とした正規化(normalized)を行うと銘柄間のパフォーマンス比較がしやすくなる
- 相関係数のヒートマップを見ると、分散投資効果を定量的に把握できる
複数銘柄を比較する基本コード
import yfinance as yf
import pandas as pd
# 複数銘柄を一括取得
tickers = ["7203.T", "9984.T", "6758.T", "8306.T"] # トヨタ、ソフトバンクG、ソニー、三菱UFJ
df = yf.download(tickers, period="1y")
# 終値のみ取り出す
close = df['Close']
print(close.tail(3))
正規化して比較(基準日=100)
各銘柄の初日終値を100として正規化すると、スタート地点が揃うため騰落率の比較がしやすくなります。
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
# 正規化(基準日=100)
normalized = close / close.iloc[0] * 100
fig, ax = plt.subplots(figsize=(14, 6))
for col in normalized.columns:
ax.plot(normalized.index, normalized[col], label=col)
ax.axhline(y=100, color='gray', linestyle='--', alpha=0.5)
ax.set_title('複数銘柄の株価比較(正規化・基準日=100)')
ax.legend()
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('normalized.png')
print('保存: normalized.png')
相関係数を計算
銘柄間の相関係数を計算します。1に近いほど同じ動きをし、0に近いほど無相関、-1に近いほど逆の動きをする仕組みです。
# 日次リターンで相関を計算
returns = close.pct_change().dropna()
corr = returns.corr()
print(corr.round(2))
ヒートマップで可視化
import seaborn as sns
fig, ax = plt.subplots(figsize=(8, 6))
sns.heatmap(
corr,
annot=True,
fmt='.2f',
cmap='RdYlGn',
vmin=-1, vmax=1,
ax=ax
)
ax.set_title('銘柄間の相関係数ヒートマップ')
plt.tight_layout()
plt.savefig('heatmap.png')
print('保存: heatmap.png')
分散投資効果のシミュレーション
相関が低い銘柄を組み合わせると、ポートフォリオ全体のボラティリティが下がる仕組みです。以下は均等配分(各25%)の場合のポートフォリオリターンの計算例です。
# 均等配分のポートフォリオ
weights = [0.25, 0.25, 0.25, 0.25]
portfolio_returns = returns.dot(weights)
cum_portfolio = (1 + portfolio_returns).cumprod()
print(f"ポートフォリオ最終リターン: {cum_portfolio.iloc[-1]-1:.2%}")
print(f"ポートフォリオ年率ボラティリティ: {portfolio_returns.std() * (252**0.5):.2%}")
筆者の検証メモ
yfinance 0.2.x以降、複数銘柄をdownloadするとカラムがMultiIndexになる場合がある。df[‘Close’]で終値が取れない場合はdf.xs(‘Close’, axis=1, level=0)を使うとフラット化できる仕組みです。seabornはpip3 install seabornで別途インストールが必要。
【投資免責事項】本記事で紹介するコードおよび分析結果は情報提供を目的としたものであり、特定の銘柄への投資を推奨するものではありません。投資判断はご自身の責任で行ってください。

