株式リターンを統計的に扱うとき、最初に登場する分布が正規分布(normal distribution)と対数正規分布(log-normal distribution)です。本記事では、両者の関係と、現実のリターン分布との違いを整理します。
目次
- 正規分布
- 対数正規分布
- 株価とリターンの関係
- Python で生成・可視化する
- 現実のリターン分布
- 正規性を確認する手段
正規分布
平均 、分散 の正規分布の確率密度関数(PDF)は次のとおりです。
形状の特徴は次のとおりです。
- 平均を中心に左右対称
- 平均 ± 1σ に約 68%、± 2σ に約 95%、± 3σ に約 99.7% が入る
- 裾は急速に薄くなる(極端な値が出にくい)
統計の多くの手法(t 検定、回帰分析の誤差仮定など)は、正規分布を前提に組み立てられています。
対数正規分布
ある変数 が正規分布に従うとき、 は対数正規分布に従います。式で書くと次のとおりです。
対数正規分布の特徴は次のとおりです。
- 値は常に正()
- 右に裾を引いた左右非対称の形
- 値を対数変換すると正規分布に戻る
株価そのものは負にならないため、価格モデルとして対数正規分布を仮定することがあります。一方で、リターン(対数差)は正規分布で近似する流派が一般的です。
株価とリターンの関係
整理すると、よく使われる仮定は次のとおりです。
| 量 | 仮定される分布 |
|---|---|
| 株価 | 対数正規分布 |
| 対数リターン | 正規分布 |
| 単純リターン | 近似的に正規(短期・小変動なら) |
対数リターンの加算性(#5-9「リターンの種類 — 単純リターンと対数リターン」)と、対数正規分布の数学的扱いやすさが、これらの仮定が選ばれる理由です。
Python で生成・可視化する
NumPy で 2 つの分布から乱数を生成し、ヒストグラムを比べます。
import numpy as npimport matplotlib.pyplot as plt
rng = np.random.default_rng(0)n = 5000
# 正規分布: 平均 0、標準偏差 0.02normal_samples = rng.normal(loc=0.0, scale=0.02, size=n)
# 対数正規分布: 対応する正規の平均 0、標準偏差 0.02lognormal_samples = rng.lognormal(mean=0.0, sigma=0.02, size=n)
fig, axes = plt.subplots(1, 2, figsize=(10, 4))axes[0].hist(normal_samples, bins=50)axes[0].set_title("Normal (returns)")axes[1].hist(lognormal_samples, bins=50)axes[1].set_title("Log-normal (price ratio)")plt.tight_layout()plt.show()正規分布は左右対称、対数正規分布は右に裾を引いた形になります。
現実のリターン分布
実データの株式リターンは、正規分布と比べて次のような違いを示すことが知られています。
- 裾が厚い(fat tail): 大きな上昇・下落が、正規分布よりも頻繁に起こる
- 負に歪む(left skew): 暴落が大幅、回復はゆっくりという非対称
- ボラティリティクラスタリング: 大きな変動の翌日にも大きな変動が起きやすい
これらは、リスク管理(VaR、ストレステスト)で正規分布をそのまま当てはめると 損失を過小評価する 原因になります。
正規性を確認する手段
データが正規分布に近いかを確認する方法は複数あります。
| 手段 | 概要 |
|---|---|
| ヒストグラム | 視覚的に左右対称か・裾の厚みを確認 |
| QQ プロット | 理論分位点との対応を直線で評価 |
| Shapiro-Wilk 検定 | 統計的検定、件数が少ないときに有効 |
| Jarque-Bera 検定 | 歪度・尖度から評価、件数が多いときに有効 |
QQ プロットは scipy で簡単に描けます。
import numpy as npimport scipy.stats as statsimport matplotlib.pyplot as plt
# ここでは正規分布のサンプルを使う(現実のリターンに置き換えると比較が見える)samples = np.random.default_rng(1).normal(loc=0, scale=1, size=500)
fig, ax = plt.subplots(figsize=(5, 5))stats.probplot(samples, dist="norm", plot=ax)ax.set_title("QQ plot vs normal")plt.tight_layout()plt.show()理論線から両端で大きく乖離しているなら、裾が厚いサインです。
注意点
- 正規分布の仮定は便利だが、現実のリターンには厳密に当てはまらない
- リスク管理や検定で「正規だから ± 2σ で 95%」と機械的に当てはめないこと
- 対数リターンに対しても、極端な相場局面では正規からのずれが大きくなる
生成AI へのプロンプト例
正規分布と実データを重ねて描画するスクリプトの例です。
日次リターンの pandas Series を受け取り、ヒストグラムと平均・標準偏差から推定した正規分布の PDF を重ねて表示する関数plot_return_dist(returns) を書いてください。
要件:- matplotlib を使う- ヒストグラムは density=True で描く- 推定パラメータをタイトルに表示- pandas 2.2 系の API を使う- docstring を日本語で書くまとめ
- 正規分布は対称、対数正規分布は右に裾を引いた非対称
- 株価は対数正規、対数リターンは正規で近似されることが多い
- 現実のリターンは裾が厚く、左に歪み、ボラティリティクラスタリングを示す
- 正規性は QQ プロットや検定で評価できる