前回の記事#07では、信託報酬0.1%の差が30年で約40万円の差になることをPythonで検証しました。コストは「確定的なマイナス」でした。では、リターンの「不確実さ」——すなわちリスクは、どう数値化すればいいのでしょうか?
「リスクが高い」「リスクを取る」——投資の世界ではよく使われる言葉ですが、その正体を数学的に説明できる人は少ないのではないでしょうか。「なんとなく怖いもの」のままでは、暴落時に正しい判断ができません。
筆者は製造業の開発現場で、DX推進やデータ分析に携わるエンジニアです。E資格(日本ディープラーニング協会)の取得を通じて線形代数を学び直した際、「ノルム(ベクトルの長さ)」という概念が、投資のリスク計量とほぼ同じ構造であることに気づきました。(記事#01から読み始めるのがおすすめです。)
この記事では、投資の「リスク」を線形代数のノルムと対比しながら、なぜ分散投資でリスクが下がるのかを数学的に可視化します。
結論:投資のリスク(標準偏差)は、リターン列をベクトルと見たときの「ノルム」に対応する。複数資産を組み合わせるとベクトルの合成でノルムが小さくなる——これが分散投資の数学的な正体である。
動作環境
- Python 3.11 / numpy 1.26 / matplotlib 3.8
- Google Colab でもローカル環境でも動作します
- 所要時間:約20分(コードのコピペ+実行+条件変更)
- インストール:
pip install numpy matplotlib
免責事項
本記事は投資助言を目的としたものではなく、技術・分析手法の紹介です。記事中の数値は教育目的の仮定値であり、特定の金融商品の売買を推奨するものではありません。投資判断はご自身の責任で行ってください。
投資の「リスク」を数値化する——標準偏差の意味
日常会話では「リスク=損する可能性」という意味で使われますが、投資理論では定義が違います。リスクとは「リターンのばらつき(標準偏差)」です。上振れも下振れも含めた「予測の不確実さ」を数値化したもの。
たとえば、年間リターンの平均が7%、標準偏差が20%の資産があるとします。これは「だいたい7%前後のリターンが期待できるが、実際には-13%〜+27%(1σ範囲)くらいにばらつく」ということを意味します。
| 資産クラス | 年間リターン平均(参考値) | 標準偏差(参考値) | 意味 |
|---|---|---|---|
| 国内債券 | 約1〜2% | 約2〜3% | ほぼブレない |
| 先進国債券 | 約3〜4% | 約8〜10% | 為替の影響あり |
| 国内株式 | 約5〜7% | 約18〜20% | それなりにブレる |
| 先進国株式 | 約7〜9% | 約18〜22% | よくブレる |
| 新興国株式 | 約8〜10% | 約25〜30% | 大きくブレる |
※ 上記は過去データに基づく概算の参考値であり、将来を保証するものではありません。
「自分が保有している投資信託はどの行に当てはまるのか」を確認するには、各商品の月次レポート(運用報告書)を見るのが確実です。たとえばeMAXIS Slim 全世界株式(オール・カントリー)のような全世界株式型ファンドであれば「先進国株式」と「新興国株式」の中間あたり、eMAXIS Slim 米国株式(S&P500)のような先進国株式型なら「先進国株式」の行に近いリスク・リターンになります。商品名を出さずに表だけ見ても抽象的に感じるかもしれませんが、お手元の商品の月次レポートに記載されている標準偏差の数字と、上の表の「標準偏差」列を見比べると、自分のポートフォリオが取っているリスク水準が直感的に把握できます。
この表が示す重要な関係が、リスク(標準偏差)とリターンは概ね比例するという事実です。
高いリターンを期待するなら、高いリスク(ばらつき)も受け入れる必要がある。これをリスク・リターンのトレードオフと呼びます。
エンジニア的に言い換えると
標準偏差は測定データの「ばらつき」です。製品の品質検査で、ある寸法の平均が10.00mmで標準偏差が0.01mmなら「高精度」、0.5mmなら「ばらつきが大きい」と判断しますよね。投資のリスクも同じです。リターンという「測定値」のばらつきが大きい資産ほど「リスクが高い」。品質管理の3σルール(99.7%が平均±3σに収まる)も、そのまま投資リスクの理解に使えます。
線形代数の「ノルム」と投資リスクの対応関係
ここからが本記事の核心です。リスク(標準偏差)を、線形代数のノルム(ベクトルの長さ)として理解する視点を紹介します。
ノルムとは何か
ノルム(norm)とは、ベクトルの「大きさ」を測る関数です。最も基本的なL2ノルム(ユークリッドノルム)は、中学校で習うピタゴラスの定理の拡張版です。
2次元ベクトル v = (v₁, v₂) のL2ノルムは:
‖v‖₂ = √(v₁² + v₂²)
n次元に拡張すると:
‖v‖₂ = √(v₁² + v₂² + ... + vₙ²)
標準偏差とノルムの数学的な対応
ここで、ある資産のN期間のリターンを r = (r₁, r₂, …, rₙ)、その平均を r̄ とすると、標準偏差 σ は:
σ = √( (1/N) × Σ(rᵢ - r̄)² )
「平均からの偏差」ベクトル d = (r₁ – r̄, r₂ – r̄, …, rₙ – r̄) を考えると:
σ = ‖d‖₂ / √N
つまり、標準偏差は「偏差ベクトルのL2ノルムを√Nで正規化したもの」にほかなりません。
リスクが大きい=偏差ベクトルが長い=ノルムが大きい。この対応関係が、ポートフォリオ理論を幾何学的に理解する鍵になります。
ポイント:ノルム ≒ リスクの直感
- ノルムが小さいベクトル=原点の近くにある=ばらつきが小さい=低リスク
- ノルムが大きいベクトル=原点から遠い=ばらつきが大きい=高リスク
- この「ベクトルの長さ」の直感が、次のセクションで「分散投資でリスクが下がる理由」を理解する基盤になります
なぜ分散投資でリスクが下がるのか——ベクトル合成の幾何学
いよいよ核心です。2つの資産A, Bに50%ずつ投資するポートフォリオを考えます。各資産の偏差ベクトルを dₐ, dᵦ とすると、ポートフォリオの偏差ベクトルは:
dₚ = 0.5 × dₐ + 0.5 × dᵦ(dₚ はポートフォリオの偏差ベクトル)
ここで重要なのは、ベクトルの合成ではノルムが単純に足し算にならないことです。
2つのベクトルが同じ方向(相関係数 = 1)なら、ノルムは単純に足し算になります。しかし、直交(相関係数 = 0)や逆方向(相関係数 = -1)なら、合成ベクトルのノルムは各ベクトルのノルムの和より小さくなります。
これを数式で書くと、ポートフォリオの分散(リスクの2乗)は:
σ²_portfolio = wₐ² × σₐ² + wᵦ² × σᵦ² + 2 × wₐ × wᵦ × σₐ × σᵦ × ρ
ここで ρ は2資産の相関係数(-1 ≤ ρ ≤ 1)です。
- ρ = 1(完全正相関):リスク削減効果なし。2つの資産が完全に同じ動き
- ρ = 0(無相関):リスクが約30%削減される(50:50配分の場合)
- ρ = -1(完全逆相関):理論上リスクをゼロにできる(ただし現実の市場でρ = -1のペアはほぼ存在しません。実務では0.0〜0.5程度の低相関を目指すのが現実的です)
つまり、分散投資の効果は「相関係数が1未満であること」に依存するのです。相関が低い資産を組み合わせるほど、ベクトルの合成でノルム(=リスク)が小さくなります。
エンジニア的に言い換えると
筆者は本業のモーター制御最適化で、Optunaを使って制御パラメータ(PID制御の Kp / Ki / Kd など)を自動探索することがあります。このとき経験的に強く意識するのが、パラメータ間の相関です。各パラメータが独立に動かせれば探索空間は球状に広がりますが、KpとKiが強く相関していると探索空間が「細長い楕円」に変形してしまい、最適解への到達効率が大きく落ちます。
これはポートフォリオの分散投資とまったく同じ構造です。相関の低い変数を組み合わせると全体のばらつき(=リスク)が効率的に下がる——制御パラメータ空間でもポートフォリオ空間でも、数学的に同じ原理が動いています。「ベクトルの合成でノルムが縮む」という幾何学的な直感が、業務の最適化と投資の両方で通用するのです。
参考:代表的な資産クラスの過去相関係数
「相関が低い資産を組み合わせる」と言われても、具体的にどの資産ペアの相関が低いのか、イメージしにくいかもしれません。以下に、一般的に知られている代表的な資産クラス間の過去相関係数の参考値をまとめました。
| 資産ペア | 相関係数(参考値) | 分散効果 |
|---|---|---|
| 国内株式 × 先進国株式 | 約 0.6〜0.8 | やや限定的(同じ株式同士) |
| 国内株式 × 国内債券 | 約 -0.1〜0.2 | 高い(株と債券は逆に動きやすい) |
| 先進国株式 × 先進国債券 | 約 0.0〜0.3 | 高い |
| 株式(全般) × 金(ゴールド) | 約 -0.1〜0.2 | 高い(有事の金買い) |
| 国内株式 × REIT(不動産) | 約 0.3〜0.6 | 中程度 |
| 先進国株式 × 新興国株式 | 約 0.7〜0.9 | 限定的(グローバル化で連動しやすい) |
※ 上記は過去の一般的な傾向に基づく概算の参考値です。計測期間や市場環境によって大きく変動するため、将来の相関を保証するものではありません。リーマンショック等の暴落局面では、多くの資産の相関が一時的に上昇する傾向が知られています。
この表から読み取れる実践的なポイントは、「同じ株式同士」よりも「株式と債券」「株式と金」の組み合わせの方が分散効果が大きいということです。セクション3-3の数式で見たように、相関係数が小さい(ゼロや負に近い)ほどポートフォリオのリスクが効率的に下がります。
Pythonで可視化:相関係数がポートフォリオリスクに与える影響
ここまでの理論を、Pythonで可視化してみましょう。相関係数が変わると、ポートフォリオのリスク・リターン曲線がどう変わるかを描きます。
import numpy as np
import matplotlib.pyplot as plt
def portfolio_risk_return(
mu_a: float,
mu_b: float,
sigma_a: float,
sigma_b: float,
rho: float,
n_points: int = 100,
) -> tuple[np.ndarray, np.ndarray, np.ndarray]:
"""2資産ポートフォリオのリスク・リターン曲線を計算
Args:
mu_a: 資産Aの期待リターン
mu_b: 資産Bの期待リターン
sigma_a: 資産Aの標準偏差(リスク)
sigma_b: 資産Bの標準偏差(リスク)
rho: 相関係数(-1 ≤ ρ ≤ 1)
n_points: 配分比率の分割数
Returns:
weights_a: 資産Aの配分比率
risks: ポートフォリオのリスク(標準偏差)
returns: ポートフォリオの期待リターン
"""
weights_a: np.ndarray = np.linspace(0, 1, n_points)
weights_b: np.ndarray = 1 - weights_a
# ポートフォリオの期待リターン(加重平均)
returns: np.ndarray = weights_a * mu_a + weights_b * mu_b
# ポートフォリオの分散(ベクトル合成の公式)
variance: np.ndarray = (
(weights_a * sigma_a) ** 2
+ (weights_b * sigma_b) ** 2
+ 2 * weights_a * weights_b * sigma_a * sigma_b * rho
)
risks: np.ndarray = np.sqrt(variance)
return weights_a, risks, returns
# --- 2資産の設定(仮定値)---
# 資産A: 国内債券的な低リスク・低リターン
# 資産B: 先進国株式的な高リスク・高リターン
mu_a: float = 0.02 # 期待リターン 2%
mu_b: float = 0.08 # 期待リターン 8%
sigma_a: float = 0.03 # リスク 3%
sigma_b: float = 0.20 # リスク 20%
# --- 相関係数を変えて比較 ---
fig, ax = plt.subplots(figsize=(12, 8))
correlations: list[tuple[float, str, str]] = [
(1.0, "#e53e3e", "ρ=1.0 (Perfect positive)"),
(0.5, "#e5913e", "ρ=0.5 (Moderate positive)"),
(0.0, "#3182ce", "ρ=0.0 (Uncorrelated)"),
(-0.5, "#38a169", "ρ=-0.5 (Moderate negative)"),
(-1.0, "#805ad5", "ρ=-1.0 (Perfect negative)"),
]
for rho, color, label in correlations:
_, risks, returns = portfolio_risk_return(
mu_a, mu_b, sigma_a, sigma_b, rho
)
ax.plot(
risks * 100, returns * 100,
color=color, linewidth=2.5, label=label,
)
# 個別資産をプロット
ax.scatter(
[sigma_a * 100, sigma_b * 100],
[mu_a * 100, mu_b * 100],
s=150, zorder=5, color=["#2d3748", "#2d3748"],
edgecolors="white", linewidth=2,
)
ax.annotate("Asset A\n(Bond-like)", (sigma_a * 100 + 0.3, mu_a * 100), fontsize=11)
ax.annotate("Asset B\n(Stock-like)", (sigma_b * 100 + 0.3, mu_b * 100), fontsize=11)
ax.set_xlabel("Risk (Standard Deviation) [%]", fontsize=13)
ax.set_ylabel("Expected Return [%]", fontsize=13)
ax.set_title("Portfolio Risk-Return Curve by Correlation", fontsize=15)
ax.legend(fontsize=11, loc="lower right")
ax.grid(True, alpha=0.3)
ax.set_xlim(0, 22)
ax.set_ylim(1, 9)
plt.tight_layout()
plt.savefig("risk_return_correlation.png", dpi=150)
plt.show()
このグラフが伝えていることは明快です。
- ρ = 1(赤線):AとBを結ぶ直線。分散投資の効果はゼロ。リスクは加重平均そのまま
- ρ = 0(青線):曲線が左に膨らむ。同じリターンでも、リスクが下がっている
- ρ = -1(紫線):曲線が大きく左に膨らみ、リスクゼロの点が存在する
曲線が左に膨らむほど「お得」——同じリターンを、より低いリスクで得られるということです。そして、膨らみの大きさは相関係数で決まる。これがポートフォリオ理論の本質です。
偏差ベクトルで「見る」分散投資——ノルムが縮む瞬間
最後に、ノルム(ベクトルの長さ)が分散投資でどう変わるかを、2次元の図で直感的に可視化します。
import numpy as np
import matplotlib.pyplot as plt
def plot_vector_composition(rho: float, title_suffix: str) -> None:
"""偏差ベクトルの合成を2次元で可視化
Args:
rho: 相関係数
title_suffix: グラフタイトルの補足
"""
fig, ax = plt.subplots(figsize=(8, 8))
# 資産Aの偏差ベクトル(リスクに対応)
sigma_a: float = 1.0 # 正規化
vec_a: np.ndarray = np.array([sigma_a, 0])
# 資産Bの偏差ベクトル(相関係数に応じて角度を決定)
sigma_b: float = 1.2
# cos(θ) = ρ → θ = arccos(ρ)
theta: float = np.arccos(rho)
vec_b: np.ndarray = np.array([sigma_b * np.cos(theta), sigma_b * np.sin(theta)])
# ポートフォリオの偏差ベクトル(50:50配分)
vec_p: np.ndarray = 0.5 * vec_a + 0.5 * vec_b
# 各ベクトルのノルム
norm_a: float = np.linalg.norm(vec_a)
norm_b: float = np.linalg.norm(vec_b)
norm_p: float = np.linalg.norm(vec_p)
# ベクトルを描画
origin = np.array([0, 0])
ax.annotate("", xy=vec_a, xytext=origin,
arrowprops=dict(arrowstyle="->", color="#e53e3e", lw=2.5))
ax.annotate("", xy=vec_b, xytext=origin,
arrowprops=dict(arrowstyle="->", color="#3182ce", lw=2.5))
ax.annotate("", xy=vec_p, xytext=origin,
arrowprops=dict(arrowstyle="->", color="#38a169", lw=3.0))
# ラベル
ax.text(vec_a[0] + 0.05, vec_a[1] - 0.1,
f"Asset A\n‖d_A‖={norm_a:.2f}", color="#e53e3e", fontsize=11)
ax.text(vec_b[0] + 0.05, vec_b[1] + 0.05,
f"Asset B\n‖d_B‖={norm_b:.2f}", color="#3182ce", fontsize=11)
ax.text(vec_p[0] + 0.05, vec_p[1] + 0.05,
f"Portfolio (50:50)\n‖d_P‖={norm_p:.2f}", color="#38a169",
fontsize=11, fontweight="bold")
# 加重平均ノルム(分散効果なしの場合)
naive_norm: float = 0.5 * norm_a + 0.5 * norm_b
reduction: float = (1 - norm_p / naive_norm) * 100
ax.set_title(
f"Vector Composition: {title_suffix}\n"
f"Risk reduction: {reduction:.1f}% vs simple average",
fontsize=13,
)
ax.set_xlim(-0.3, 1.5)
ax.set_ylim(-0.3, 1.5)
ax.set_aspect("equal")
ax.grid(True, alpha=0.3)
ax.axhline(y=0, color="gray", linewidth=0.5)
ax.axvline(x=0, color="gray", linewidth=0.5)
plt.tight_layout()
plt.savefig(f"vector_composition_rho{rho:.1f}.png", dpi=150)
plt.show()
# 3パターンで比較
plot_vector_composition(0.8, "ρ=0.8 (High correlation)")
plot_vector_composition(0.0, "ρ=0.0 (Uncorrelated)")
plot_vector_composition(-0.5, "ρ=-0.5 (Negative correlation)")
3つの図を見比べてください。
- ρ = 0.8:2つのベクトルがほぼ同じ方向。合成ベクトル(緑)は元のベクトルとあまり変わらない。リスク削減効果は小さい
- ρ = 0.0:2つのベクトルが直交。合成ベクトルが明らかに短くなる。リスクが約9%削減
- ρ = -0.5:2つのベクトルが反対方向寄り。合成ベクトルがさらに短くなる。リスクが約30%以上削減
ベクトルが「打ち消し合う」ほど、合成ベクトルのノルム(=リスク)が小さくなる。これがノルムの幾何学で「見る」分散投資の正体です。
モーター制御の最適化で「投資の数学」が見えた話
筆者がE資格の勉強をしていたとき、最初に挫折しかけたのが線形代数でした。ノルム、内積、固有値——大学で習ったはずなのに、意味が腹落ちしていなかったのです。推薦教材の線形代数の章で約2週間格闘し、何度も手計算をやり直しました。教科書のノルムの定義を何度読んでも、それが現実の何に対応するのかが見えてこなかったのです。
転機になったのは、本業のモーター制御最適化の場面でした。筆者の業務では、制御パラメータをOptunaで自動探索することがあります。このとき扱っていたのが、「目標値と実測値の差(残差)を、ベクトルとして見たときの大きさを最小化する」という処理でした。
ふと気づいたのです——これはE資格の教科書に書いてあるL2ノルムの定義そのものであり、品質管理で毎日見ている「測定値と目標値のずれ(偏差)の標準偏差」とも同じ構造だと。3つの異なる文脈(業務の最適化/資格試験の数式/品質データの統計)が、同じ「ノルム」というインターフェースで繋がった瞬間でした。
その視点で投資理論の教科書を読み直すと、ポートフォリオのリスク計算がまさにベクトルの合成そのものだとわかりました。「なぜ分散投資でリスクが下がるのか」が、数式ではなくパラメータ空間の図形として腹落ちした瞬間です。Optunaの探索空間で「相関の高いパラメータがあると効率が落ちる」という肌感覚が、そのまま「相関の高い資産だけ持つとリスクが減らない」という投資の原則と重なりました。
この経験から学んだのは、「異なる分野の知識が同じ数学構造で繋がる」ということ。制御工学の残差ノルム、品質管理の標準偏差、E資格のL2ノルム、投資のリスク——見かけは違っても、数学的には同じことを測っています。DXエンジニアが投資を学ぶ最大のアドバンテージは、この「構造の再利用」ができることかもしれません。
エンジニア的に言い換えると:数学は「共通API」
- 品質管理:σ(標準偏差)= 製品寸法のばらつき
- 機械学習:‖w‖(ノルム)= パラメータの大きさ → 正則化で制御
- 投資理論:σ(標準偏差)= リターンのばらつき → 分散投資で制御
同じ数学的インターフェース(標準偏差 ≒ ノルム)を使って、異なるドメインの「ばらつき」を統一的に扱える。数学は分野をまたぐ共通APIです。
まとめ:リスクとノルムの3つの対応
投資のリスクを線形代数のノルムと対比して理解した結果、以下のことがわかりました。
- 投資のリスク(標準偏差)は、偏差ベクトルのL2ノルムに対応する。リスクが大きい=ノルムが大きい=ベクトルが長い。この直感を持つと、リスクの大小を「長さの比較」として捉えられる
- 分散投資のリスク削減効果は、ベクトルの合成の幾何学で説明できる。相関が低い資産を組み合わせると、合成ベクトルのノルムが各ベクトルのノルムの和より小さくなる。相関係数が1未満であれば、必ず分散効果が得られる
- 品質管理・機械学習・投資理論は、同じ数学構造(ノルム/標準偏差)で繋がっている。エンジニアがすでに持っている「ばらつきの直感」は、投資リスクの理解にそのまま転用できる
今日からできる3つのアクション
アクション1:自分のポートフォリオのリスク(標準偏差)を把握する
保有している投資信託やETFの月次報告書を見てみてください。「標準偏差」や「リスク」という項目があるはずです。数字を見て「自分はどのくらいのばらつきを受け入れているのか」を確認しましょう。
アクション2:保有資産の相関係数を調べてみる
もし複数の資産を持っているなら、それらの相関係数を調べてみてください。「株式と債券」「国内株式と先進国株式」「株式と金(ゴールド)」——相関が低い組み合わせほど、分散効果が大きくなります。myINDEX等の無料ツールで主要資産クラスの相関係数を確認できます。
アクション3:この記事のコードで2資産の配分比率を変えてみる
Pythonコードのmu_a, mu_b, sigma_a, sigma_bを自分が気になる資産の数値に変更してリスク・リターン曲線を描いてみてください。「自分にとって最もリスクが低くなる配分比率」が視覚的にわかります。
次回予告:NISA・iDeCoをエンジニア的に設計する
次回(記事#09)では、NISA・iDeCoという「税制優遇の仕組み」を、エンジニアのシステム設計視点で最適化します。
- つみたてNISA / 成長投資枠 / iDeCoの使い分けを「アーキテクチャ選定」として整理
- 節税効果を複利シミュレーションで定量化
- エンジニアのライフステージに合わせた配分設計
記事#03〜#08で投資の数理的な基盤を固めてきました。次回は、それを実際の制度設計に落とし込む実践的な内容です。基礎編もいよいよ終盤に入ります。
シリーズ全体像:投資×DX 3段階モデル
- 基礎編 #01〜#10:インデックス投資 × DX思想(標準化・データドリブン・自動化)
- 応用編 #11〜#20:高配当株 × データパイプライン(Python自動スクリーニング)
- 発展編 #21〜#30:成長株CAN-SLIM × アーキテクチャ設計力
▶ 記事#01からスタート | 記事#02 DX3原則 | 記事#03 複利Python | 記事#04 インデックスvs個別株 | 記事#05 DCAvs一括 | 記事#06 モンテカルロ | 記事#07 信託報酬 | 記事#08 本記事 | 記事#09 NISA・iDeCo
投資の具体的な始め方は記事#09「NISA・iDeCoの最適活用をエンジニア的に設計する」で詳しく解説予定です。
免責事項
本記事は投資助言を目的としたものではなく、技術・分析手法の紹介です。記事中の数値は教育目的の仮定値であり、将来のリターンを保証するものではありません。特定の金融商品の推奨・非推奨を意図するものでもありません。投資判断はご自身の責任で行ってください。

コメント