株価リターンは正規分布に従わない?歪度・尖度で「暴落しやすさ」を数値化してみた

基礎知識・戦略

先月、正規分布と株価リターンの記事を書いたら、コメント欄で「じゃあ実際どれくらい正規分布からズレてるんですか?」と聞かれて、うまく答えられずに冷や汗をかきました。。。ドル円のフラッシュクラッシュみたいな、正規分布の理屈じゃ説明がつかないくらい極端な動きを僕自身も何度も食らっているのに、それをちゃんと数値で説明できていなかったんですよね。というわけで、今回は「歪度」と「尖度」という2つの指標を調べてみました。

歪度(Skewness)とは何か

歪度は分布の「左右の非対称さ」を表す指標です。数式で書くとこんな感じになります。

歪度 = E[(X - μ)^3] / σ^3

歪度がゼロなら左右対称(正規分布はここ)、マイナスなら「左に長い裾を引く」分布、プラスなら「右に長い裾を引く」分布になります。株価リターンはだいたいマイナスの歪度を持つことが多いと言われていて、これはつまり「上昇はコツコツ・ゆっくり」なのに対して「下落は一気に・急激に」起きやすいという、僕らが肌感覚で知っている「上りはエスカレーター、下りはエレベーター」を数値化したものなんです。

尖度(Kurtosis)とは何か

尖度は分布の「裾の厚さ(ファットテール)」を表す指標です。

尖度 = E[(X - μ)^4] / σ^4

正規分布の尖度は3です(scipyでは「超過尖度」として正規分布を0とする定義を使うことが多いので注意)。株価やドル円のリターンは、この尖度が正規分布よりかなり高くなることがほとんどで、これは「滅多に起きないはずの大暴落・大暴騰が、理論上の想定よりずっと頻繁に起きる」ということを意味します。VaR(バリュー・アット・リスク)などのリスク指標が正規分布を前提にしていると、この「思ったより頻繁に起きる極端な動き」を過小評価してしまう危険があるわけです。

Pythonで実際に計算してみる

import yfinance as yf
import numpy as np
from scipy import stats

# ドル円の日次データを取得
df = yf.download("JPY=X", period="5y")
returns = df["Close"].pct_change().dropna()

skewness = stats.skew(returns)
kurtosis = stats.kurtosis(returns)  # 超過尖度(正規分布=0基準)

print(f"歪度: {skewness:.3f}")
print(f"超過尖度: {kurtosis:.3f}")

# 正規分布との比較(Jarque-Bera検定)
jb_stat, jb_pvalue = stats.jarque_bera(returns)
print(f"Jarque-Bera検定 p値: {jb_pvalue:.5f}")
# p値が非常に小さければ「正規分布ではない」と統計的に言える

実際に手元のドル円データで計算してみると、超過尖度がプラスの値(正規分布より裾が厚い)になり、Jarque-Bera検定のp値もほぼゼロになりました。つまり「ドル円のリターンは正規分布ではない」と統計的にはっきり言えるということです。何となく知っていたつもりのことが、数字で裏付けられると妙に納得感がありますね。

投資への応用:何がわかるのか

ファットテールがあるということは、正規分布ベースのリスク管理(例えば「標準偏差の3倍を超える動きはめったに起きない」という前提)を鵜呑みにすると、想定外の損失を食らうリスクが高いということです。実務的には、損切りラインを正規分布の想定よりやや余裕を持たせる、ポジションサイズを控えめにする、といった保守的な対応につながります。以前書いたモンテカルロシミュレーションの記事とも関連しますが、シミュレーションに使う分布そのものが正規分布に寄りすぎていると、リスクを過小評価したシミュレーション結果になってしまう点も注意が必要だと感じました。

まとめ

「株価は正規分布に従わない」という話は本やブログでよく見かけていましたが、歪度・尖度という具体的な数字で自分のデータを確認したのは今回が初めてで、頭でわかっていたつもりと実際に手を動かして見えるものの違いを実感しました。個人的には次に、この尖度の高さを踏まえた上でストップロス幅を最適化するバックテストをやってみたいと思っています。

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