Pythonでドル円変化率のヒストグラムと要約統計量

こんにちは、タクロウです!

金融時系列の変化率を可視化するのに、ヒストグラムを描くことが多いです。ドル円のヒストグラムを作成し、要約統計量を算出し、正規分布と比較しましょう。

データ準備

2009年9月から2019年8月までの10年間のドル円のデータをpandas-datareaderを用いてダウンロードして、変化率を算出します。

import pandas_datareader.data as pdr
import datetime
start = datetime.datetime(2009,9,1)
end = datetime.datetime(2019,8,30)
JPUS = pdr.DataReader('DEXJPUS', 'fred', start, end)
JPUS.columns=['p'] #項目名をpに変更
JPUSr = JPY_USD['p'].pct_change().dropna() #変化率

matplotlibモジュールを使って、価格と変化率の日次推移グラフを表示します。

%matplotlib inline
import matplotlib.pyplot as plt
fig, ax=plt.subplots(2,1,figsize=(8,8))
ax[0].plot(JPUS)
ax[1].plot(JPUSr)

2008年9月のリーマン・ブラザーズの破綻後、ギリシャの財政破綻や2011年3月11日の東大日本大震災で円高が進み、その後、2012年11月の政権交代から日銀金融緩和などアベノミクス相場で円安が進んだ期間のデータです。

ヒストグラム作成と要約統計量算出

2009年9月から2019年8月までの10年間のドル円の日次の変化率2,608個のデータから、ヒストグラムを作成します。

JPUSr.hist(bins=50)

ドル円の変化率の平均と標準偏差を用いて正規分布を重ね合わせてみます。

from scipy.stats import norm
import numpy as np
x=np.linspace(float(JPUSr.min()),float(JPUSr.max()),100)
pdf=norm.pdf(x,JPUSr.mean(),JPUSr.std())

JPUSr.hist(bins=100, density=True, color='lightgray')
plt.plot(x,pdf)
MEMO
  • linspace(max, min, n):等差数列を作成する関数で、最大値(max)と最初値(min)をn等分
  • norm.pdf(x, mean, std):正規分布の確率分布を作成する関数で、平均(mean)、標準偏差(std)で変数xの正規分布の確率分布を出力

図から、ドル円の変化率は正規分布に比べて中央付近の尖りが強く、すそ野が厚いことがわかります。要約統計量を算出して、正規分布との違いをみてみます。

print("count: %d"%JPUSr.count())
print("mean: %2.5f"%JPUSr.mean())
print("std: %2.5f"%JPUSr.std())
print("skew: %2.5f"%JPUSr.skew())
print("kurt: %2.5f"%JPUSr.kurt())

日次変化率のデータ数(count)は2,608個、平均(mean)は0.007%(年率換算1.7%)、標準偏差(std)は0.5%(年率換算9.1%)、歪度(skew)は0.18、尖度(kurt)は3.96です。

歪度は、分布のひずみを表す尺度で、正の歪度は分布の山が左によっていることを表します。歪度は0.18ので若干分布の山が左によっていることがわかります。

尖度は、分布のすそ野の厚さ、中心の山のとがり具合を表す尺度で、正規分布の尖度3(Fisherの定義)より大きい場合、分布の山が尖っており、すそ野が厚いことを表します。

さいごに

今回は、ドル円の1日変化率をヒストグラムで可視化し、要約統計量を算出し、正規分布よりすそ野が厚いことわかりました。

実際のデータは正規分布をしていないことのほうが多いかと思います。しかし、PythonやRのコマンド1つで分析ができるので、データの分布を気にせず、正規分布を前提としている理論を、適用している場合も多いかと思います。

分析手法を適用する前に、ヒストグラムを描いて分布の形状をみてみることをおすすめします。

次回は、移動平均について学びます。

Pythonのpandasでドル円の移動平均を算出