こんにちは、たくろー(@takuro_data )です!
Pythonで、金融時系列データを分析するため、対数価格・収益率・対数収益率に価格データを加工したほうが便利な場合があります。
価格の動きの傾向を長期でみるときには対数価格が用いられたり、正規分布だと解析解を得やすいので学術的に収益率より対数収益率が用いられたりしますが、ここではPythonでドル円の対数価格・収益率・対数収益率を算出する方法とグラフから特徴を直感的に把握することが目的です。
計算式
対数価格、収益率、対数収益率、価格の差の計算式は以下の通りです。添字\(t\)は時点、( )の中はプログラムコードに使う変数名です。
- 価格(\(p\)):\(P\)
- 対数価格(\(lnp\)):\(logP\)
- 収益率(\(r\)):\((P_{t+1} – P_{t}) / P_{t}\)
- 対数収益率(\(lndp\)):\(log(P_{t+1}) – log(P_{t})\)
- 価格の差(\(dp\)):\(P_{t+1} – P_{t}\)
ドル円の対数価格・収益率・対数収益率
ドル円のデータをpandas-datareaderを用いてダウンロードします。
import pandas_datareader.data as pdr
import datetime
start = datetime.datetime(1971,1,4)
end = datetime.datetime(2019,8,30)
JPY_USD = pdr.DataReader('DEXJPUS', 'fred', start, end)
JPY_USD = JPY_USD.resample('M').last() #日次データから月次データへ変換
JPY_USD.columns=['p'] #項目名をpに変更
数値計算モジュールNumpy(Numerical Python)を用いて、対数計算をします。
import numpy as np
JPY_USD['ln'] = np.log(JPY_USD) #対数価格
JPY_USD['r'] = JPY_USD['p'].pct_change().dropna() #収益率
JPY_USD['lndp'] = JPY_USD['ln'].diff().dropna() #対数収益率
JPY_USD['dp'] = JPY_USD['p'].diff().dropna() #価格差
pct_changeメソッドは、\((A-B)/B\)の変化率を算出し、diffメソッドは\(A-B\)の差分を算出します。
算出したデータ末尾5行を表示します。
JPY_USD.tail()

収益率と対数収益率は、ほぼ同じ値であることがわかります。対数収益率は収益率の近似値となります。
価格、対数価格、収益率、対数収益率をグラフ表示します。
%matplotlib inline
import matplotlib.pyplot as plt
fig=plt.figure(figsize=(12,8))
ax=plt.subplot(2,2,1)
JPY_USD['p'].plot(color='darkblue',ax=ax)
plt.ylabel('JPY/USD')
ax2=plt.subplot(2,2,2)
JPY_USD['ln'].plot(color='darkred',ax=ax2)
plt.ylabel('ln_ JPY/USD')
ax3=plt.subplot(2,2,3)
JPY_USD['r'].plot(color='darkblue',ax=ax3)
plt.ylabel('r_ JPY/USD')
ax4=plt.subplot(2,2,4)
JPY_USD['lndp'].plot(color='darkred',ax=ax4)
plt.ylabel('lndp_ JPY/USD')

収益率と対数収益率の推移に大きな違いは見られないが、対数価格の推移は価格の推移と比べると1989年以降の変化が大きく見える。これは対数表示にすることで、変化率がどの価格帯でも同じスケールになったことからです。
さいごに
今回は、ドル円の対数価格、収益率、対数収益率を算出し、図示しました。
次回は、matplotlibを使ってデータの可視化を学びます。