平均と分散のその先
平均もボラティリティも同じ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 numbers1回の暴落がすべてを変えうる歪度と尖度はごく少数の最も極端な値で決まるため、平均やボラティリティよりずっと不安定です。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点