直前のROCと現在のROC

少し紛らわしいが、1本前の足のROC現在の足のROCにどのような影響を与えるかを調べてみる。

足は5分足を使っている。現在の足のROCの計算期間は1本(5分)である。また、1本前の足のROCの計算期間は12本(60分)である。

直前のROCと現在のROCは負の比例

x軸、y軸ともにROCは標準化している。

1本前の足のROCと現在の足のROCは負の比例という関係にあるように見える。ただ若干、イレギュラーな部分もある。

サンプルプログラム

○以下のプログラムをSpyderの「IPythonコンソール」にコピー&ペーストして「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
minute = 60
n = 6

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')
        roc0 = fs.i_roc(symbol, timeframe, 1, 0)[start:end]
        mean0 = np.mean(roc0)
        std0 = np.std(roc0)
        roc0 = (roc0 - mean0) / std0
        for i in range(n):
            x[i] = i - 2.5
            period = fs.convert_minute2period(minute, timeframe)
            roc1  = fs.i_roc(symbol, timeframe, period, 1)[start:end]
            mean1 = np.mean(roc1)
            std1 = np.std(roc1)
            roc1 = (roc1 - mean1) / std1
            y[i] = np.mean(roc0[(roc1>=x[i]-0.5) & (roc1<x[i]+0.5)])
        plt.plot(x, y, label=str(year))
    plt.title('ROC1 and ROC0 (' + symbol + ')')
    plt.xlabel('ROC1')
    plt.ylabel('ROC0')
    plt.xlim(-2.5, 2.5)
    plt.ylim(-0.15, 0.15)
    plt.legend(loc='upper right')
    plt.axhline(y=0.0, color='black', linestyle=':')
    plt.tight_layout()
plt.savefig('roc1_and_roc0.png', dpi=150)
plt.show()

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

直前のROC計算期間と現在のROC

少し紛らわしいが、1本前の足のROCの計算期間現在の足のROCにどのような影響を与えるかを調べてみる。また、1本前の足のROCがプラスの場合とマイナスの場合とで分けて検証する。

足は5分足を使っている。現在の足のROCの計算期間は1本(5分)である。

計算期間が長くなるとROCは0に収束

x軸の計算期間の単位は分である。y軸のROCは標準化している。

1本前の足のROCがプラスの場合、1本前の足のROCの計算期間が長くなるにつれ、現在の足のROCはマイナスだが0に近づいていく傾向があるように見える。

1本前の足のROCがマイナスの場合、1本前の足のROCの計算期間が長くなるにつれ、現在の足のROCはプラスだが0に近づいていく傾向があるように見える。

各計算期間は互いに影響

だが、実際には各計算期間は互いに影響し合っている。例えば現在の足の終値が1本前の足の終値より高いとする。では2本前の足の終値と比べるとどうか。もし情報がないとすれば2本前の足の終値の期待値は1本前の足の終値と同じだろう。とすれば現在の足の終値は2本前の足の終値より高いだろう。

したがって、1本前の足のROCは計算期間に関わらず、プラスかマイナスかということでは同じ方向である可能性が高くなる。であるから、どちらかといえば相補的で、特定の計算期間のみの影響はグラフにあるよりは若干小さいものとなるだろう。

サンプルプログラム

○以下のプログラムをSpyderの「IPythonコンソール」にコピー&ペーストして「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 = 12

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')
        roc0 = fs.i_roc(symbol, timeframe, 1, 0)[start:end]
        mean0 = np.mean(roc0)
        std0 = np.std(roc0)
        roc0 = (roc0 - mean0) / std0
        for i in range(n):
            x[i] = (i + 1) * 5
            period = fs.convert_minute2period(x[i], timeframe)
            roc1  = fs.i_roc(symbol, timeframe, period, 1)[start:end]
            mean1 = np.mean(roc1)
            std1 = np.std(roc1)
            roc1 = (roc1 - mean1) / std1
            y[i] = np.mean(roc0[roc1>=0.0])
        plt.plot(x, y, label=str(year))
    plt.title('ROC1 Period and ROC0 (' + symbol + ', Plus)')
    plt.xlabel('ROC1 Period')
    plt.ylabel('ROC0')
    plt.xlim(5, 60)
    plt.ylim(-0.04, 0.04)
    plt.legend(loc='upper right')
    plt.axhline(y=0.0, color='black', linestyle=':')
    plt.tight_layout()
plt.savefig('roc1_period_and_roc0_plus.png', dpi=150)
plt.show()

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')
        roc0 = fs.i_roc(symbol, timeframe, 1, 0)[start:end]
        mean0 = np.mean(roc0)
        std0 = np.std(roc0)
        roc0 = (roc0 - mean0) / std0
        for i in range(n):
            x[i] = (i + 1) * 5
            period = fs.convert_minute2period(x[i], timeframe)
            roc1  = fs.i_roc(symbol, timeframe, period, 1)[start:end]
            mean1 = np.mean(roc1)
            std1 = np.std(roc1)
            roc1 = (roc1 - mean1) / std1
            y[i] = np.mean(roc0[roc1<0.0])
        plt.plot(x, y, label=str(year))
    plt.title('ROC1 Period and ROC0 (' + symbol + ', Minus)')
    plt.xlabel('ROC1 Period')
    plt.ylabel('ROC0')
    plt.xlim(5, 60)
    plt.ylim(-0.04, 0.04)
    plt.legend(loc='lower right')
    plt.axhline(y=0.0, color='black', linestyle=':')
    plt.tight_layout()
plt.savefig('roc1_period_and_roc0_minus.png', dpi=150)
plt.show()

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

ラウンドナンバーとボラティリティ

価格がラウンドナンバーを上抜き、または下抜きしたとき、ボラティリティがどうなるかを検証してみる。

100pipsの単位が更新されたとき、ラウンドナンバーを上抜き、または下抜きしたと見なすこととする。例えばUSDJPYなら100円未満から100円以上になったときに上抜きと見なすといった具合である。

ボラティリティを計る指標としてはTrue Rangeを用いた。先ず10pipsの単位で10pipsごとにラインを10本設け、それを上抜き、または下抜きした場合のTrue Rangeを求める。次にその平均を取ってベンチマークとする。そして、それぞれのTrue Rangeを平均で除した。つまりベンチマーク=1.0である。

10pipsの単位が0のライン、すなわちラウンドナンバーが他のラインと差があるかどうかを見てみる。使用した足の種類は5分足である。

ラウンドナンバーでボラティリティはやや拡大

検証結果によると、価格がラウンドナンバーを上抜き、または下抜きしたとき、ボラティリティはやや拡大する傾向があるように見える(Decimalが0.0のところ)。

ボラティリティはやや拡大しているとはいうものの、それほど明瞭ではない。ラウンドナンバーはしばらく更新されていないといった条件がないと、大した意味を持たないのかもしれない。USDJPYはいくらか明瞭な感じがする。

サンプルプログラム

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

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

def get_one(data):
    temp = data.copy()
    temp = np.floor(temp)
    ret = temp % 10
    ret = ret.astype(int)
    return ret

def get_hundredth(data):
    temp = data.copy()
    temp *= 100
    temp = np.floor(temp)
    ret = temp % 10
    ret = ret.astype(int)
    return ret

fs.remove_temp_folder()

timeframe = 5
n = 10
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]
        high0 = fs.i_high(symbol, timeframe, 0)[start:end]
        high1 = fs.i_high(symbol, timeframe, 1)[start:end]
        low0 = fs.i_low(symbol, timeframe, 0)[start:end]
        low1 = fs.i_low(symbol, timeframe, 1)[start:end]
        for i in range(n):
            if symbol == 'USDJPY' or symbol == 'RANDOM':
                n_h0 = get_one(high0+0.1*i)
                n_h1 = get_one(high1+0.1*i)
                n_l0 = get_one(low0+0.1*i)
                n_l1 = get_one(low1+0.1*i)
            else:
                n_h0 = get_hundredth(high0+0.001*i)
                n_h1 = get_hundredth(high1+0.001*i)
                n_l0 = get_hundredth(low0+0.001*i)
                n_l1 = get_hundredth(low1+0.001*i)
            x[i] = 0.1 * i
            y[i] = np.mean(ret[(n_h0!=n_h1) | (n_l0!=n_l1)])
        benchmark = np.mean(y)
        y /= benchmark
        plt.plot(x, y, label=str(year))
    plt.title('Round Number and Volatility (' + symbol + ')')
    plt.xlabel('Decimal (100pips=1.0)')
    plt.ylabel('True Range (Benchmark=1.0)')
    plt.xlim(0.0, 0.9)
    plt.ylim(0.8, 1.2)
    plt.legend()
    plt.axhline(y=1.0, color='black', linestyle=':')
    plt.tight_layout()
plt.savefig('round_number_and_volatility.png', dpi=150)
plt.show()

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

直前のTR拡縮と現在のTR拡縮の関係

直前のTR拡縮と現在のTR拡縮は負の比例関係

直前のTR(トゥルー・レンジ)の拡縮と現在のTRの拡縮がどのような関係にあるか調べてみた。足の種類は5分足である。TRの拡縮は標準化している。

グラフを見ると、直前のTRの拡縮と現在のTRの拡縮とは負の比例関係にあることが分かる。

サンプルプログラム

TRは正の値しか取らないためか、拡縮を標準化すると分布に偏りがある。そこで、先ずTRを対数変換し、それから拡縮を標準化している。

○以下のコマンドを「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 = 6
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')
        atr = fs.i_atr(symbol, timeframe, 1, 0)
        atr[atr==0] = np.nan
        atr = atr.dropna()
        atr = np.log(atr)
        change = atr - atr.shift(1)
        mean = np.mean(change[start:end])
        std = np.std(change[start:end])
        change = (change - mean) / std
        change0 = change[start:end]
        change1 = change.shift(1)[start:end]
        for i in range(n):
            x[i] = i - 2.5
            y[i] = np.mean(change0[(change1.shift(1) >= x[i] - 0.5) &
             (change1.shift(1) < x[i] + 0.5)])
        plt.plot(x, y, label=str(year))
    plt.title('Previous TR Change and Current TR Change (' + symbol + ')')
    plt.xlabel('Previous TR Change')
    plt.ylabel('Current TR Change')
    plt.xlim(-2.5, 2.5)
    plt.ylim(-0.2, 0.2)
    plt.legend(loc='upper right')
    plt.axvline(x=0, color='black', linestyle=':')
    plt.axhline(y=0, color='black', linestyle=':')
    plt.tight_layout()
plt.savefig('previous_tr_change_and_current_tr_change.png', dpi=150)
plt.show()

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

直前のTRと現在のTRの関係

直前のTRと現在のTRは比例関係

直前のTR(トゥルー・レンジ)と現在のTRがどのような関係にあるか調べてみた。足の種類は5分足である。TRは標準化している。

グラフを見ると、直前のTRと現在のTRとは比例関係にあることが分かる。

サンプルプログラム

TRは正の値しか取らないためか、そのまま標準化すると正のほうに偏る。そこで、先ず対数変換し、それから標準化している。

○以下のコマンドを「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 = 6
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_atr(symbol, timeframe, 1, 0)[start:end]
        ret[ret==0] = np.nan
        ret = ret.dropna()
        ret = np.log(ret)
        mean = np.mean(ret)
        std = np.std(ret)
        ret = (ret - mean) / std
        for i in range(n):
            x[i] = i - 2.5
            y[i] = np.mean(ret[(ret.shift(1) >= x[i] - 0.5) &
             (ret.shift(1) < x[i] + 0.5)])
        plt.plot(x, y, label=str(year))
    plt.title('Previous True Range and Current True Range (' + symbol + ')')
    plt.xlabel('Previous True Range')
    plt.ylabel('Current True Range')
    plt.xlim(-2.5, 2.5)
    plt.ylim(-1.75, 1.75)
    plt.legend(loc='upper left')
    plt.axvline(x=0, color='black', linestyle=':')
    plt.axhline(y=0, color='black', linestyle=':')
    plt.tight_layout()
plt.savefig('previous_true_range_and_current_true_range.png', dpi=150)
plt.show()

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