イベントとボラティリティ

イベントの発生によってボラティリティがどのようになるかを調べることとする。イベントにも様々な種類がある。ここでは定期的に発表される経済指標発表イベントを考えることにする。

すべての経済指標発表のスケジュールを入力するのも大変だ。今回は簡易的に月曜日0時0分から金曜日23時55分まで、5分ごとのボラティリティを調べることにした。

経済指標は特定の曜日の特定の時間に発表されることが多い。もしその時間のボラティリティが他と違うならば、そこにイベント発生の影響が考えられる。

イベント発生時にボラティリティは拡大

足の種類は5分足である。ボラティリティを計る指標としてTrue Rangeを使っている。各年の平均を取って、それで除している。

グラフではちょっと分かりにくいが、特定の曜日の特定の時間にボラティリティが拡大している様子が伺える。特に、金曜日の夜にボラティリティが大きく拡大している。これは原則として毎月第1金曜日22時30分(日本時間。夏時間では21時30分)に発表される米雇用統計の影響と考えられる。

また、日付が変わる前後の時間にボラティリティが低下する傾向も見られる。

サンプルプログラム

○以下のコマンドを「IPython console」にコピー&ペーストして「Enter」キーを2回押す。

import forex_system as fs
import matplotlib.pyplot as plt
import numpy as np
from datetime import datetime

fs.remove_temp_folder()

timeframe = 5
n = 1440
x = np.empty(n)
y = np.empty(n)
plt.figure(figsize=(6, 20))
cnt = 0
for symbol in ['AUDUSD', 'EURUSD', 'GBPUSD', 'USDJPY', 'RANDOM']:
    cnt += 1
    plt.subplot(5, 1, cnt)
    for year in [2012, 2013, 2014, 2015, 2016]:
        start = datetime.strptime(str(year) + '.01.01 00:00',
                                  '%Y.%m.%d %H:%M')
        end = datetime.strptime(str(year) + '.12.31 23:59',
                                '%Y.%m.%d %H:%M')
        ret = fs.i_trange(symbol, timeframe, 0)[start:end]
        mean = np.mean(ret)
        for i in range(5):
            for j in range(24):
                for k in range(12):
                    x[i*288+j*12+k] = i * 288 + j * 12 + k
                    y[i*288+j*12+k] = np.mean(
                            ret[(fs.time_day_of_week(ret.index)==i+1) &
                                (fs.time_hour(ret.index)==j) &
                                (fs.time_minute(ret.index)==k*5)]) / mean
        plt.plot(x, y, label=str(year))
    plt.title('Event and Volatility (' + symbol + ')')
    plt.xlabel('Day of Week')
    plt.ylabel('True Range (Mean=1.0)')
    plt.xlim(0, 1440)
    plt.ylim(0, 5)
    plt.xticks([144, 432, 720, 1008, 1296],
               ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'])
    plt.legend(loc='upper left')
    plt.axvline(x=288, color='black', linestyle=':')
    plt.axvline(x=576, color='black', linestyle=':')
    plt.axvline(x=864, color='black', linestyle=':')
    plt.axvline(x=1152, color='black', linestyle=':')
    plt.axhline(y=1.0, color='black', linestyle=':')
    plt.tight_layout()
plt.savefig('event_and_volatility.png', dpi=150)
plt.show()

fs.remove_temp_folder()
(2017/02/24更新)

コメント

非公開コメント