ブレイクアウトとボラティリティ

ブレイクアウトが発生したとき、ボラティリティがどうなるかを検証してみる。ボラティリティを計る指標としてTrue Rangeを用いた。先ず全体のTrue Rangeの平均を求める。次にブレイクアウトが発生したときのTrue Rangeの平均を求める。最後に後者を前者で除して、その比率を求めた。使用した足の種類は5分足である。

ブレイクアウト時にボラティリティは拡大

検証結果によると、ブレイクアウトが発生したとき、ボラティリティは拡大する傾向があるように見える。

すべての通貨、すべての年において、計算期間が長くなるにつれてブレイクアウトが発生したときのボラティリティが拡大する傾向にあることが分かる。

なお、ランダムウォークのボラティリティがすべての計算期間で1.0よりやや大きいのが腑に落ちない。想像するに、全体のTrue Rangeはほとんど0に近い場合もある。このため、平均は小さくなる。だが、ブレイクアウトが発生したときのTrue Rangeでは必ずある程度の変動があるはずである。このため、平均は全体より大きくなる。こういったことにより、比率が1.0よりやや大きくなったのではないだろうか。

サンプルプログラム

○以下のコマンドを「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 = 24
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]
        for i in range(n):
            minute = (i + 1) * 60
            period = fs.convert_minute2period(minute, timeframe)
            highest = fs.i_highest(symbol, timeframe, period, 0)[start:end]
            lowest = fs.i_lowest(symbol, timeframe, period, 0)[start:end]
            x[i] = i + 1
            y[i] = np.mean(ret[(highest==0) | (lowest==0)]) / np.mean(ret)
        plt.plot(x, y, label=str(year))
    plt.title('Breakout and Volatility (' + symbol + ')')
    plt.xlabel('Hour')
    plt.ylabel('True Range (mean=1.0)')
    plt.xlim(1, 24)
    plt.ylim(0.8, 2.8)
    plt.legend(loc='upper left')
    plt.axhline(y=1.0, color='black', linestyle=':')
    plt.tight_layout()
plt.savefig('breakout_and_volatility.png', dpi=150)
plt.show()
(2017/02/17更新)