【データ分析】相関行列でポートフォリオの「本当の分散度」を点検する

スポンサーリンク
相関行列でポートフォリオの「本当の分散度」を点検する データ分析
スポンサーリンク

「10銘柄も持っているから分散はできている」と思っていたのに、下落相場で全部そろって下がった……。そんな経験はないでしょうか。銘柄の数が多くても、値動きが似ている銘柄ばかりなら、実質的には同じものをたくさん持っているのと変わりません。

この記事は、ある程度の銘柄数を保有している個人投資家の方に向けて、相関行列を使って自分のポートフォリオの「本当の分散度」を点検する方法をまとめたものです。相関係数の意味から、Excel と Python での計算手順、ヒートマップの読み方、そして見落としがちな注意点まで順に説明します。

私はIT系企業のサラリーマンで、データ分析が得意分野です。以前、2024年のREITの値動きについて1年分のデータで相関行列をとってみたことがあります。てっきり「オフィス系はオフィス系同士で似た動きをするだろう」と思っていたのですが、結果はセクター単位の相関が弱まっていました。オフィス系でも、日本ビルファンドとジャパンリアルエステイトは互いに相関が高い一方、他のオフィス系REITとの相関は高くなかったのです。「セクターで分ければ分散できる」という思い込みは、数字で確かめないと危ない、と実感した次第です。

スポンサーリンク

相関係数とは何か:-1〜1の意味と「相関≠因果」

相関係数は、2つのデータがどれくらい同じ方向に動くかを -1 から 1 の数字で表したものです。株式の場合は「2銘柄のリターンがどれだけ連動しているか」を見る指標になります。

相関係数 意味 分散効果
1 に近い ほぼ同じ方向・同じタイミングで動く ほとんどない
0 前後 連動性がほとんど見られない 大きい
-1 に近い 逆方向に動く 非常に大きい(値動きを打ち消し合う)

分散効果のイメージを、仮の数字で確かめてみます。値動きの大きさ(リスク=標準偏差)がどちらも年20%の銘柄AとBに、半分ずつ投資したとします。ポートフォリオ全体のリスクは、2銘柄の相関係数によって次のように変わります。

AとBの相関係数(仮定) ポートフォリオのリスク
1.0 20.0%(まったく下がらない)
0.5 約17.3%
0.0 約14.1%
-1.0 0%(理論上)

相関が1なら、2銘柄に分けてもリスクは1銘柄のときと同じです。相関が低いほど、同じ銘柄数でもリスクが下がる。これが「本当の分散度」を相関で点検する理由です。

ひとつ注意したいのは、相関は因果関係を示さないという点です。2銘柄の相関が高くても「Aが上がったからBが上がった」とは言えません。金利や為替、景気といった共通の要因に、それぞれが反応しているだけかもしれません。相関行列はあくまで「似た動きをしているか」を知るための道具で、理由は別途、事業内容やIRを読んで考える必要があります。

なぜ「株価」ではなく「日次リターン」で計算するのか

相関を計算するとき、株価そのものを並べて CORREL をかけたくなりますが、これはおすすめしません。株価をそのまま使うと、まったく無関係な2銘柄でも、両方が右肩上がりというだけで相関が高く出てしまうからです。長期的なトレンド(水準の変化)が相関の数字を支配してしまい、「日々の値動きが連動しているか」という知りたいことが見えなくなります。

そこで、前日からの変化率である日次リターンを使います。

日次リターン =(当日の終値 − 前日の終値)÷ 前日の終値

仮に前日終値が1,000円、当日終値が1,020円なら、日次リターンは2%です。変化率にすることで株価の水準の違い(1,000円の銘柄と10,000円の銘柄)も揃い、比較しやすくなります。

なお、配当の権利落ちや株式分割がある日は、調整前の株価だと見かけ上大きく下がったように見えます。データを取得する際は、分割などを考慮した調整後終値を使うと安心です。

Excel と Python で相関行列を作る手順

Excel の場合

  1. A列に日付、B列以降に各銘柄の終値を並べる(1銘柄1列、1行目は銘柄名)。日付は全銘柄で揃え、欠けている日の行は削除する。
  2. 別シートに日次リターンを計算する。たとえば2行目のデータから始まる場合、3行目に =B3/B2-1 と入力し、全体にコピーする。
  3. 2銘柄の相関は =CORREL(B3:B250, C3:C250) のように、リターンの範囲を2つ指定して求める。
  4. 銘柄数が多いときは、分析ツール(アドイン)の「相関」を使うと、選択した範囲から相関行列を一度に出力できる。

CORREL を手で組む場合、行列は対角線(自分自身との相関=1)を挟んで対称になるので、半分だけ埋めれば十分です。

Python(pandas)の場合

銘柄数が10を超えてくると、Python のほうが圧倒的に楽です。終値を「日付×銘柄」の表にした CSV があれば、数行で済みます。

import pandas as pd

prices = pd.read_csv("prices.csv", index_col="date", parse_dates=True)
returns = prices.pct_change().dropna()   # 日次リターン
corr = returns.corr()                    # 相関行列
print(corr.round(2))

pct_change() が前日比の変化率を計算し、dropna() で先頭行など欠損のある行を落とします。corr() は、既定でピアソンの相関係数による相関行列を返してくれます。

米国ETFと日本株のように取引所の休日が異なるものを混ぜると、片方だけ値がない日が出ます。どの日を残すかで結果が少し変わるので、日付の揃え方は意識しておきましょう。

ヒートマップで「似た者同士」を見つける

相関行列は数字の表なので、銘柄が増えると読むのが大変です。色をつけたヒートマップにすると、一目で「似た者同士」の固まりが見えてきます。

import seaborn as sns
import matplotlib.pyplot as plt

sns.heatmap(corr, annot=True, fmt=".2f", cmap="coolwarm", vmin=-1, vmax=1)
plt.show()

Excel なら、相関行列のセル範囲に「条件付き書式」の「カラースケール」を設定するだけで同じような見た目になります。

見るときのチェックポイントは次のとおりです。

  • 濃い赤(高相関)の固まりはどこか:その固まりは実質「ひとつの賭け」とみなす。そこに資金が集中していないか確認する。
  • セクターと固まりは一致しているか:同じセクターなのに相関が低い、違うセクターなのに相関が高い、という組み合わせは要チェック。私のREITの例のように、思い込みとずれることがある。
  • 相関の低い銘柄はあるか:全体が赤っぽいなら、銘柄数のわりに分散が効いていない可能性がある。
  • 目安は自分で決める:「0.7以上は同じグループ扱い」など、自分なりの基準を決めておくと判断がぶれにくい。数値の基準に絶対的な正解はないので、あくまで点検用のルールとして使う。

実際のデータで作った例も見ておきます。主要な資産クラスを東証上場のETFで代用し、直近1年の日次リターンから相関行列を作ってヒートマップにしました。

TOPIX・日経平均・S&P500(円建て)・J-REIT・日本国債・米国長期国債・金の直近1年の日次リターンの相関係数を示したヒートマップ。最も高いのはTOPIXと日経平均の0.87、最も低いのはS&P500(円建て)と日本国債の-0.05。
主要資産の日次リターンの相関係数(直近1年) データ:2026年10月末時点 出典:J-Quants・Yahoo!ファイナンスの東証上場ETF価格をもとに作成

TOPIXと日経平均はほぼ同じ動きで、円建てのS&P500も日本株とかなり高い相関があります。「日本株と米国株の両方を持っているから分散できている」と思っていても、円建てで見ると同じ向きに動きやすいということです。一方、日本国債・米国長期国債は株式との相関が低く、J-REITや金は中程度にとどまります。分散の効き目を確かめたいときは、このように自分の保有資産で一度ヒートマップを作ってみるのがおすすめです。

注意点:相関は期間によって変わる

相関行列で一番気をつけたいのは、相関係数は計算する期間によって変わるということです。ある1年で相関が低かった2銘柄が、次の1年も低いとは限りません。私がとったREITのデータも2024年の1年分なので、別の年でとれば違う結果になる可能性は十分あります。

特に、相場全体が大きく崩れる局面では、普段は別々に動く銘柄までそろって売られ、相関が上がりやすいと言われています。平常時の相関だけを見て「分散できている」と安心するのは危ない、ということですね。やれやれ、肝心なときに分散が効きにくいとは。

対策としては、次のような点検の仕方が考えられます。

  • 直近1年だけでなく、3か月・3年など複数の期間で計算して比べる
  • 大きな下落があった期間だけを切り出して計算してみる
  • 2銘柄の相関の推移を「移動相関」で見る(pandas なら returns["A"].rolling(60).corr(returns["B"]) で60営業日ごとの相関を計算できる)
  • データ数が少なすぎる期間(数週間など)の相関は、ぶれが大きいので参考程度にとどめる

まとめ

銘柄数が多いことと、分散が効いていることは別物です。相関行列をとると、保有銘柄のどこが「似た者同士」で、どこに実質的な集中があるかが数字で見えてきます。

  • 相関係数は -1〜1。1に近いほど分散効果は小さい。相関は因果ではない
  • 計算には株価ではなく日次リターンを使う
  • Excel なら CORREL か分析ツール、Python なら pct_change() と corr()
  • ヒートマップで高相関の固まりを探し、資金の集中を確認する
  • 相関は期間で変わるので、複数期間で定期的に点検する

私自身、REITで相関行列をとってみて、セクター分けだけでは分散の実態がわからないと痛感しました。年に一度でも、保有銘柄の相関を点検してみることをおすすめしたい次第です。

あわせて読みたい

本記事は情報提供を目的としたもので、特定の銘柄の売買を推奨するものではありません。投資判断はご自身の責任でお願いします。

タイトルとURLをコピーしました