データの「ばらつき」を 1 つの数で要約する指標が、分散(variance)と標準偏差(standard deviation)です。本記事では定義を整理し、pandas での計算と、株式リターンに用いるときの注意点を確認します。

目次

  1. 分散と標準偏差の定義
  2. 母集団と標本
  3. Python で計算する
  4. ボラティリティとしての標準偏差
  5. 標準偏差の意味を直感で押さえる

分散と標準偏差の定義

データ x1,x2,,xnx_1, x_2, \dots, x_n と平均 xˉ\bar{x} に対して、分散 は次のように定義します。

σ2=1ni=1n(xixˉ)2\sigma^2 = \frac{1}{n} \sum_{i=1}^{n} (x_i - \bar{x})^2

各データが平均からどれだけ離れているかを 2 乗して平均した値です。標準偏差 は分散の平方根です。

σ=σ2\sigma = \sqrt{\sigma^2}

2 乗のままだと単位が「リターンの 2 乗」となり直感に合わないため、平方根を取って元のスケールに戻したものが標準偏差です。

母集団と標本

統計の本では、nn で割るか n1n-1 で割るかの違いが説明されます。

呼び名分母用途
母分散nnデータ全体がそのまま母集団であるとき
標本分散(不偏分散)n1n-1データが母集団からの標本であるとき

pandas の var / stdデフォルトで n1n-1(ddof=1)です。NumPy の np.var / np.stdデフォルトで nn(ddof=0)です。値が微妙に違うときは、まずこの設定を確認するのが早道です。

Python で計算する

サンプルとして 5 日分の単純リターンを使います。

import numpy as np
import 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 日と仮定)。

σ年率=σ日次×252\sigma_{\text{年率}} = \sigma_{\text{日次}} \times \sqrt{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(母分散)がデフォルト
  • 株式の文脈ではリターンの標準偏差をボラティリティと呼ぶ
  • 年率換算は 252\sqrt{252} を掛ける慣例