データの「ばらつき」を 1 つの数で要約する指標が、分散(variance)と標準偏差(standard deviation)です。本記事では定義を整理し、pandas での計算と、株式リターンに用いるときの注意点を確認します。
目次
- 分散と標準偏差の定義
- 母集団と標本
- Python で計算する
- ボラティリティとしての標準偏差
- 標準偏差の意味を直感で押さえる
分散と標準偏差の定義
データ と平均 に対して、分散 は次のように定義します。
各データが平均からどれだけ離れているかを 2 乗して平均した値です。標準偏差 は分散の平方根です。
2 乗のままだと単位が「リターンの 2 乗」となり直感に合わないため、平方根を取って元のスケールに戻したものが標準偏差です。
母集団と標本
統計の本では、 で割るか で割るかの違いが説明されます。
| 呼び名 | 分母 | 用途 |
|---|---|---|
| 母分散 | データ全体がそのまま母集団であるとき | |
| 標本分散(不偏分散) | データが母集団からの標本であるとき |
pandas の var / std は デフォルトで (ddof=1)です。NumPy の np.var / np.std は デフォルトで (ddof=0)です。値が微妙に違うときは、まずこの設定を確認するのが早道です。
Python で計算する
サンプルとして 5 日分の単純リターンを使います。
import numpy as npimport pandas as pd
returns = pd.Series([0.010, -0.005, 0.020, 0.000, -0.015])
# pandas は ddof=1 がデフォルト(不偏分散)var_unbiased = returns.var()std_unbiased = returns.std()
# ddof=0 を指定すると母分散になるvar_population = returns.var(ddof=0)std_population = returns.std(ddof=0)
print(f"不偏分散 : {var_unbiased:.6f}")print(f"標準偏差 : {std_unbiased:.6f}")print(f"母分散 : {var_population:.6f}")print(f"母標準偏差: {std_population:.6f}")実行結果のイメージです。
不偏分散 : 0.000206標準偏差 : 0.014353母分散 : 0.000165母標準偏差: 0.012845ボラティリティとしての標準偏差
株式の文脈では、リターンの標準偏差を ボラティリティ(volatility、価格変動の大きさ) と呼びます。
- 日次リターンの標準偏差 → 日次ボラティリティ
- 月次リターンの標準偏差 → 月次ボラティリティ
- 年次のボラティリティに換算したものを「年率ボラティリティ」と呼ぶことが多い
年率ボラティリティへの換算は、次の式が慣例です(営業日 252 日と仮定)。
平方根が現れるのは、独立したリターンが時間方向に積み上がるとき、分散は時間に比例し、標準偏差はその平方根に比例するためです。
# 日次リターン(対数)から年率ボラティリティへlog_returns = np.log(1 + returns)daily_vol = log_returns.std()annual_vol = daily_vol * np.sqrt(252)
print(f"日次ボラ: {daily_vol:.6f}")print(f"年率ボラ: {annual_vol:.6f}")標準偏差の意味を直感で押さえる
正規分布に近いデータでは、次の経験則がよく使われます。
| 範囲 | 含まれる割合 |
|---|---|
| 平均 ± 1σ | 約 68% |
| 平均 ± 2σ | 約 95% |
| 平均 ± 3σ | 約 99.7% |
ただし、株式リターンは 正規分布に従わない ことが多く、上の経験則は厳密にはあてはまりません。#5-4「正規分布と対数正規分布」 で扱います。
注意点
- 平均が極端に外れているデータでは、平均からの距離が膨らみ、ばらつきも大きく出ます
- ボラティリティ計算は 対数リターン が慣例です(#5-9「リターンの種類 — 単純リターンと対数リターン」)
- 異なる期間(日次・週次・月次)の標準偏差を直接比べるのは避け、年率換算で揃えます
- 過去の標準偏差は将来を保証しません
生成AI へのプロンプト例
ローリングでボラティリティを計算する例です。
日次リターンの pandas Series を受け取り、ローリング年率ボラティリティを返す関数rolling_annual_vol(returns, window=20) を書いてください。
要件:- 入力は対数リターンを想定- 結果は年率(営業日 252 日)- 計算には ddof=1 を使う- 関数の docstring を日本語で書く- pandas 2.2 系の API を使うまとめ
- 分散は平均からの 2 乗距離の平均、標準偏差はその平方根
- pandas は
ddof=1(不偏)、NumPy はddof=0(母分散)がデフォルト - 株式の文脈ではリターンの標準偏差をボラティリティと呼ぶ
- 年率換算は を掛ける慣例