σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
uantCraft Academyロードマップ
Ctrl K
AO
+1.2k 人の学習者
ログイン参加する ↗
ロードマップ
AO
+1.2k 人の学習者
ログイン
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
Python ロードマップ›モジュール 3 · 確率とモンテカルロ・シミュレーション›トピック 3.2·~40 分中級

歪度と尖度

ロードマップ上の位置モジュール 3/11 · トピック 2/12
3.2 歪度と尖度
—ラボスコア— / 100合計XP—連続日数—

平均と分散のその先

平均もボラティリティも同じ2つのリターン系列が、保有してみるとまったく違うことがあります。一方はゆっくり上昇し、ときどき1日で6%下がります。もう一方は対称で穏やかです。平均と分散は分布の最初の2つのモーメントです。k次中心モーメントは (x - mean) ** k の平均です。3次と4次が形を表し、歪度はどちらの裾が長いか、尖度は裾がどれだけ厚いかを示します。

m_k = mean((x - mean)^k) skewness = m3 / m2^1.5 excess kurtosis = m4 / m2^2 - 3
import numpy as np

def central_moment(x, k):
    return float(np.mean((x - x.mean()) ** k))

# Calm days of about +1%, and one crash of -6%
returns = np.array([0.010, 0.012, 0.008, 0.011, 0.009, 0.010, 0.012, -0.060, 0.010, 0.009])

print(round(central_moment(returns, 2), 8))     # 0.00044389   the variance with ddof=0
print(round(central_moment(returns, 3), 10))    # -2.47823e-05   odd powers keep the sign: the crash dominates
print(round(central_moment(returns, 4), 12))    # 1.587946e-06   even powers are always positive

歪度:どちらの裾が長いか

3乗は各偏差の符号を保ち、大きな偏差を大きく効かせるので、3次モーメントは最も極端な値に支配されます。m2 ** 1.5 で割ると単位が消え、歪度になります。対称な分布では0、長い裾が左にある(まれな大損失)と負、右にある(まれな大利益)と正です。株価指数は通常、歪度が負です。ゆっくり上がり、急に下がるからです。正規分布の10万個の標本の歪度はおよそ0です。

m2 = central_moment(returns, 2)
m3 = central_moment(returns, 3)
print(round(m3 / m2 ** 1.5, 3))     # -2.65   strongly negative: one big loss among calm gains

mirror = -returns                    # flip every return: the long tail moves to the right
print(round(central_moment(mirror, 3) / central_moment(mirror, 2) ** 1.5, 3))   # 2.65

尖度:裾の厚さ

4乗は極端な値を非常に大きく効かせるので、m4 / m2 ** 2 は裾が厚いほど大きくなります。正規分布では3になるため、超過尖度 m4 / m2 ** 2 - 3 を使います。正規分布で0、裾が厚いと正(極端な日が釣鐘の予想より頻繁に起きる)、裾が薄いと負(最も薄い、同じ高さの2つの山では -2)です。ほとんどの資産の日次リターンは超過尖度がはっきり正で、5以上になることもあります。どちらの統計量もリターンの尺度変更や平行移動では変わらず、形だけを表します。

m4 = central_moment(returns, 4)
print(round(m4 / m2 ** 2 - 3, 3))   # 5.059   fat tails: one crash dominates the fourth moment

calm = np.array([-0.02, -0.01, -0.005, 0.0, 0.005, 0.01, 0.02, -0.015, 0.015, 0.0])
c2, c3, c4 = (central_moment(calm, k) for k in (2, 3, 4))
print(round(c3 / c2 ** 1.5, 3), round(c4 / c2 ** 2 - 3, 3))   # 0.0 -1.033   symmetric, slightly thin tails
# Shape does not depend on scale or shift: multiply the returns by 3 and add 1
rescaled = returns * 3 + 1
print(round(central_moment(rescaled, 3) / central_moment(rescaled, 2) ** 1.5, 3))   # -2.65
print(round(central_moment(rescaled, 4) / central_moment(rescaled, 2) ** 2 - 3, 3))  # 5.059   the same two numbers
1回の暴落がすべてを変えうる歪度と尖度はごく少数の最も極端な値で決まるため、平均やボラティリティよりずっと不安定です。1日足したり除いたりするだけで跳ね上がります。十分なデータ(少なくとも数百日)で計算し、数字を信じる前にヒストグラムも見ましょう。
  • k次中心モーメントは mean((x - mean) ** k)。2・3・4次が分散・歪度・尖度を与える
  • 歪度 m3 / m2 ** 1.5:負は左の裾が長い(まれな大損失)。超過尖度 m4 / m2 ** 2 - 3 は正規分布で0
  • 超過尖度が正なら裾が厚い。どちらも少数の極端な日に左右されるので、多くのデータが要る

次はファットテールと正規性検定です。リターンが釣鐘型に従うかを形式的に調べます。

ラボ:採点される内容

  • central_moment で基本の部品を計算する25点
  • skewness でどちらの裾が長いかを測る25点
  • excess_kurtosis で裾の厚さを測る25点
  • shape_label で分布の形に名前を付ける25点
エクスプローラー · lab-55-1
▾ lab-55-1
…
bash · ブラウザ内
learner@quantcraft:~/lab-55-1$
Pythonは未読み込みPythonLn 1, Col 1Spaces: 4UTF-8

このトピックをリセットしますか?

lab-55-1 の内容はすべてスターターファイルに戻り、ターミナルも消去されます。現在の解答は失われ、元に戻せません。

リセットされるもの
  • main.py → スターターコード
  • ターミナル履歴とテスト出力
  • 未提出の変更
保持されるもの
  • ラボの最高スコア
  • XPと連続日数
  • 講義の進捗とメモ

コードを実行するにはログインしてください。

レクチャーはすべて無料で読めます。コードの実行、テスト、ラボの提出にはアカウントの作成かログインが必要です。

  • ブラウザ内IDEとbashターミナル。インストール不要
  • 即時採点、XP、ロードマップでの現在地
アカウントを作成ログイン
または
GitHubで続ける