酒飲みによる機械学習日記

〜ただの酒好きが、なんとなく流行っている機械学習について語っていきます、たまに金融ネタも〜

正規分布とTOPIX指数の収益率分布を見比べてみる

金融資産の収益率のモデル分布を正規分布にするという話はよくある話です。

多くの現代理論(金融工学やポートフォリオ理論)ではこの仮定が置かれています。そして、この仮定の下で、現代理論は大きく発展しました。

  • ランダムウォーク
  • ブラックショールズ式

などなど...

しかしながら実際には、単峰性であることは同じですが、収益率の分布は正規分布とは少し異なります。

  • 裾が厚い
    • 大きな値動きは、正規分布で想定されるよりも多い
  • 平均周りの山が高い
    • 小さな値動きは、正規分布で想定されるよりも多い

大きく動くときには、みんなその流れに乗ってきたり、暴落なんて良い例ですよね...

小さくしか動かない時は、みんな一斉に休暇を取ったり...

このような行動はアノマリーを生み出している一因でもあります。

実際にヒストグラムにして比較してみると...

  • 青色:正規分布
  • 赤色:TOPIX指数の収益率

f:id:nts-524:20181009162253p:plain

グラフについて詳しく

ヒストグラムの1つ1つの棒の定義域を上手く調節することができなかったので、y軸を別々にすることで調整しました。

matplotlibでやり方を知っている方がいれば、教えてもらえると嬉しいです🙇‍♂️

ソースコード全文

# =-=-=-=-=-=-=-=-=-=-=-=- module -=-=-=-=-=-=-=-=-=-=-=-= #
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd

sns.set_style('whitegrid')

# =-=-=-=-=-=-=-=-=-=-=-=- main -=-=-=-=-=-=-=-=-=-=-=-= #
def main():
    # Load data
    d = pd.read_csv('../data/topix.csv')
    d['date'] = pd.to_datetime(d['date'])
    d = d[d['close'] > 0]
    d['return'] = [0] + list(np.log(d['close'].values[1:]) - np.log(d['close'].values[:-1]))
    d_ret = d['return'].values
    m = np.mean(d_ret)
    sd = np.std(d_ret)
    # Generate random values
    d_norm = np.random.randn(len(d_ret))*sd + m

    # Visualize result
    d_ret = d_ret.flatten() * 100
    d_norm = d_norm.flatten() * 100
    print('# ret : {}'.format(d_ret.shape))
    print('# norm: {}'.format(d_norm.shape))
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax2 = ax.twinx()
    ax.hist(d_norm, bins=100, alpha=0.3, color='blue')
    ax2.hist(d_ret, bins=100, alpha=0.3, color='red')
    ax.set_xlabel('Return [%]')
    ax.set_ylabel('NORMAL')
    ax2.set_ylabel('RETURN')
    ax.grid(True)
    ax2.grid(False)
    plt.savefig('hist.png')
    plt.close()

if __name__ == '__main__':
    main()