ラウンドナンバーと変化率 (2017/12/09)

ラウンドナンバーと変化率との関係を調べる。

  • 通貨ペア:EURJPY、EURUSD、USDJPY
  • 期間:2012年1月1日〜2016年12月31日
  • 足の種類:5分足
  • ROCの計算期間:1本
  • 価格帯の区分:始値を0pipsから100pipsまで10pips刻み

なお、変化率は各価格帯のROCの平均から全体のROCの平均を減じてトレンドを除去したものとする。

検証

○以下のコマンドをIPythonコンソールで実行する。

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

fs.remove_folder('temp')

start = datetime.strptime('2012.01.01 00:00', '%Y.%m.%d %H:%M')
end = datetime.strptime('2016.12.31 23:59', '%Y.%m.%d %H:%M')
timeframe = 5
n = 10
y = np.empty(n)
plt.figure(figsize=(6, 12))
cnt = 0
for symbol in ['EURJPY', 'EURUSD', 'USDJPY']:
    cnt += 1
    plt.subplot(3, 1, cnt)
    roc0 = fs.i_roc(symbol, timeframe, 1, 0)[start:end]
    mean = roc0.mean()
    open0 = fs.i_open(symbol, timeframe, 0)[start:end]
    if symbol=='EURUSD':
        tenth = (open0*100.0) - np.floor(open0*100.0)
    else:
        tenth = open0 - np.floor(open0)
    for i in range(n):
        y[i] = roc0[(tenth>=i/n)&(tenth<(i+1.0)/n)].mean() - mean
    plt.plot(y)
    plt.title('Round Number and Change (' + symbol + ')')
    plt.xlabel('Number (10pips=1)')
    plt.ylabel('Change')
    plt.legend()
    plt.axhline(y=0.0, color='black', linestyle=':')
    plt.tight_layout()
plt.savefig('round_number_and_change.png', dpi=150)
plt.show()

fs.remove_folder('temp')

結果

  • EURUSDでは変化率が0-10pipsでマイナス、90-100pipsでプラスとなっており、ブレイクアウトの傾向が強いようにも見える
  • EURJPY、USDJPYでは上記の傾向は見られない

時間帯と変化率 (2017/12/04)

時間帯と変化率との関係を調べる。

検証

  • 通貨ペア:EURJPY、EURUSD、USDJPY
  • 期間:2012年1月1日〜2016年12月31日
  • 足の種類:5分
  • 時間帯の区分:0時から23時まで1時間刻み

傾向を見るために変化率は累積和としている。累積変化率は出現数で除しているが、出現数は同数なのであまり意味はない。また、累積変化率は期間中のトレンドを除去している。

○以下のコマンドをIPythonコンソールで実行する。

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

fs.remove_folder('temp')

start = datetime.strptime('2012.01.01 00:00', '%Y.%m.%d %H:%M')
end = datetime.strptime('2016.12.31 23:59', '%Y.%m.%d %H:%M')
timeframe = 5
minute = 60

plt.figure(figsize=(6, 12))
cnt = 0
for symbol in ['EURJPY', 'EURUSD', 'USDJPY']:
    cnt += 1
    plt.subplot(3, 1, cnt)
    roc0 = fs.i_roc(symbol, timeframe, 1, 0)[start:end]
    roc0 -= roc0.mean()
    maxmin = 0.0
    for i in range(0, 8):
        period = fs.to_period(minute, timeframe)
        hour = fs.time_hour(roc0.index)[start:end]
        num = (hour==i).sum()
        cum_change = roc0[hour==i].cumsum()
        cum_change /= num
        plt.plot(cum_change, label=str(i))
        maxmin = np.max([maxmin, np.abs(cum_change[len(cum_change)-1])])
    plt.title('Hour and Change (0-7, ' + symbol + ')')
    plt.xlabel('Date')
    plt.ylabel('Cumulative Change')
    plt.legend(loc='upper left')
    plt.axhline(y=0.0, color='black', linestyle=':')
    plt.tight_layout()
plt.savefig('hour_and_change1.png', dpi=150)
plt.show()

plt.figure(figsize=(6, 12))
cnt = 0
for symbol in ['EURJPY', 'EURUSD', 'USDJPY']:
    cnt += 1
    plt.subplot(3, 1, cnt)
    roc0 = fs.i_roc(symbol, timeframe, 1, 0)[start:end]
    roc0 -= roc0.mean()
    maxmin = 0.0
    for i in range(8, 16):
        period = fs.to_period(minute, timeframe)
        hour = fs.time_hour(roc0.index)[start:end]
        num = (hour==i).sum()
        cum_change = roc0[hour==i].cumsum()
        cum_change /= num
        plt.plot(cum_change, label=str(i))
        maxmin = np.max([maxmin, np.abs(cum_change[len(cum_change)-1])])
    plt.title('Hour and Change (8-15, ' + symbol + ')')
    plt.xlabel('Date')
    plt.ylabel('Cumulative Change')
    plt.legend(loc='upper left')
    plt.axhline(y=0.0, color='black', linestyle=':')
    plt.tight_layout()
plt.savefig('hour_and_change2.png', dpi=150)
plt.show()

plt.figure(figsize=(6, 12))
cnt = 0
for symbol in ['EURJPY', 'EURUSD', 'USDJPY']:
    cnt += 1
    plt.subplot(3, 1, cnt)
    roc0 = fs.i_roc(symbol, timeframe, 1, 0)[start:end]
    roc0 -= roc0.mean()
    maxmin = 0.0
    for i in range(16, 24):
        period = fs.to_period(minute, timeframe)
        hour = fs.time_hour(roc0.index)[start:end]
        num = (hour==i).sum()
        cum_change = roc0[hour==i].cumsum()
        cum_change /= num
        plt.plot(cum_change, label=str(i))
        maxmin = np.max([maxmin, np.abs(cum_change[len(cum_change)-1])])
    plt.title('Hour and Change (16-23, ' + symbol + ')')
    plt.xlabel('Date')
    plt.ylabel('Cumulative Change')
    plt.legend(loc='upper left')
    plt.axhline(y=0.0, color='black', linestyle=':')
    plt.tight_layout()
plt.savefig('hour_and_change3.png', dpi=150)
plt.show()

fs.remove_folder('temp')

結果

  • いくつかの時間帯では継続的な傾向があるように見える
  • ただし、なぜそうなるのかという理由を見出せない限り、あまり信用すべきではないだろう

トレンド期間と変化率 (2017/12/03)

1本前の足のトレンド期間と現在の足の変化率との関係を調べる。

検証

  • 通貨ペア:EURJPY、EURUSD、USDJPY
  • 期間:2012年1月1日〜2016年12月31日
  • 足の種類:5分
  • トレンド期間の計算期間:12本(60分)
  • トレンド期間の区分:-1.5以上-1.0未満、-1.0以上-0.5未満、-0.5以上0.0未満、0.0以上0.5未満、0.5以上1.0未満、1.0以上1.5未満

傾向を見るために変化率は累積和としている。比較の便のため、累積変化率は出現数で除している。また、累積変化率は期間中のトレンドを除去している。

ここでは、安値が移動平均線を連続して上回っている期間をプラスのトレンド期間、高値が連続して移動平均線を下回っている期間をマイナスのトレンド期間とし、それを計算期間で除している。

○以下のコマンドをIPythonコンソールで実行する。

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

fs.remove_folder('temp')

start = datetime.strptime('2012.01.01 00:00', '%Y.%m.%d %H:%M')
end = datetime.strptime('2016.12.31 23:59', '%Y.%m.%d %H:%M')
timeframe = 5
minute = 60

plt.figure(figsize=(6, 12))
cnt = 0
for symbol in ['EURJPY', 'EURUSD', 'USDJPY']:
    cnt += 1
    plt.subplot(3, 1, cnt)
    roc0 = fs.i_roc(symbol, timeframe, 1, 0)[start:end]
    roc0 -= roc0.mean()
    maxmin = 0.0
    for i in range(6):
        period = fs.to_period(minute, timeframe)
        trend_duration1  = fs.i_trend_duration(
                symbol, timeframe, period, 1)[start:end]
        trend_duration1 /= period
        num = ((trend_duration1>=-i/2+1.0) & (trend_duration1<-i/2+1.5
               )).sum()
        cum_change = roc0[
                (trend_duration1>=-i/2+1.0)
                & (trend_duration1<-i/2+1.5)].cumsum()
        cum_change /= num
        plt.plot(cum_change, label=str(-i/2+1.0)+' ~ '+str(-i/2+1.5))
        maxmin = np.max([maxmin, np.abs(cum_change[len(cum_change)-1])])
    plt.title('Trend Duration and Change (' + symbol + ')')
    plt.xlabel('Date')
    plt.ylabel('Cumulative Change')
    plt.ylim(-maxmin, maxmin)
    plt.legend(loc='upper left')
    plt.axhline(y=0.0, color='black', linestyle=':')
    plt.tight_layout()
plt.savefig('trend_duration_and_change.png', dpi=150)
plt.show()

fs.remove_folder('temp')

結果

  • トレンド期間と変化率は負の比例
  • トレンド期間の絶対値と変化率の絶対値は比例
  • 時期によって傾向がやや不安定な印象

Zスコアと変化率 (2017/12/03)

1本前の足のZスコアと現在の足の変化率との関係を調べる。

検証

  • 通貨ペア:EURJPY、EURUSD、USDJPY
  • 期間:2012年1月1日〜2016年12月31日
  • 足の種類:5分
  • Zスコアの計算期間:12本(60分)
  • Zスコアの区分:-3以上-2未満、-2以上-1未満、-1以上0未満、0以上1未満、1以上2未満、2以上3未満

傾向を見るために変化率は累積和としている。比較の便のため、累積変化率は出現数で除している。また、累積変化率は期間中のトレンドを除去している。

○以下のコマンドをIPythonコンソールで実行する。

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

fs.remove_folder('temp')

start = datetime.strptime('2012.01.01 00:00', '%Y.%m.%d %H:%M')
end = datetime.strptime('2016.12.31 23:59', '%Y.%m.%d %H:%M')
timeframe = 5
minute = 60

plt.figure(figsize=(6, 12))
cnt = 0
for symbol in ['EURJPY', 'EURUSD', 'USDJPY']:
    cnt += 1
    plt.subplot(3, 1, cnt)
    roc0 = fs.i_roc(symbol, timeframe, 1, 0)[start:end]
    roc0 -= roc0.mean()
    maxmin = 0.0
    for i in range(6):
        period = fs.to_period(minute, timeframe)
        zscore1  = fs.i_zscore(symbol, timeframe, period, 1)[start:end]
        num = ((zscore1>=-i+2) & (zscore1<-i+3)).sum()
        cum_change = roc0[(zscore1>=-i+2) & (zscore1<-i+3)].cumsum()
        cum_change /= num
        plt.plot(cum_change, label=str(-i+2)+' ~ '+str(-i+3))
        maxmin = np.max([maxmin, np.abs(cum_change[len(cum_change)-1])])
    plt.title('Z-Score and Change (' + symbol + ')')
    plt.xlabel('Date')
    plt.ylabel('Cumulative Change')
    plt.ylim(-maxmin, maxmin)
    plt.legend(loc='upper left')
    plt.axhline(y=0.0, color='black', linestyle=':')
    plt.tight_layout()
plt.savefig('zscore_and_change.png', dpi=150)
plt.show()

fs.remove_folder('temp')

結果

  • Zスコアと変化率は負の比例
  • Zスコアの絶対値と変化率の絶対値は比例

イベントとディレクション (2017/08/06)

イベントの発生がディレクションにどのような影響を与えるかを調べてみる。

ここでは急騰、または急落が起きた時にイベントが発生したと考えることにする。イベントが発生した後の24時間でディレクションが上か下かを見てみる。

調べる前では①イベントの発生がトレンドを生んで急騰なら上、急落なら下、あるいは②反動で急騰なら下、急落なら上、のどちらかだろうかと予測していた。だが、いずれでもなかったようである。

検証

それでは検証してみる。

①この記事で使うライブラリをインポートする。

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

②設定を読み込む。

fs.remove_folder('temp')

timeframe = 5
start = datetime.strptime('2014.01.01 00:00', '%Y.%m.%d %H:%M')
end = datetime.strptime('2016.12.31 23:59', '%Y.%m.%d %H:%M')
n = 288
threshold = 2.0

ここでは5分足を使用し、期間は2014年初から2016年末までである。

③検証を実行し、グラフを表示する。

time = np.arange(n)
up = np.zeros(n)
down = np.zeros(n)
event = np.zeros([n, 3])
plt.figure(figsize=(6, 12))
cnt = 0
for symbol in ['EURJPY', 'EURUSD', 'USDJPY']:
    plt.subplot(3, 1, cnt+1)
    roc = fs.i_roc(symbol, timeframe, 1, 0)[start:end]
    mean = roc.rolling(window=n).mean()
    std = roc.rolling(window=n).std()
    z = (roc-mean) / std
    for i in range(n):
        up[i] = (roc-roc.mean())[z.shift(1+i)>=threshold].mean()
        down[i] = (roc-roc.mean())[z.shift(1+i)<=-threshold].mean()
    up = np.cumsum(up)
    down = np.cumsum(down)
    plt.plot(time, up, label='up')
    plt.plot(time, down, label='down')
    plt.title('Event and Direction (' + symbol + ')')
    plt.xlabel('Hour')
    plt.ylabel('Cumulative ROC')
    plt.legend()
    plt.xlim(0, 288)
    plt.ylim(-0.03, 0.01)
    plt.xticks([0, 48, 96, 144, 192, 240, 288], [0, 4, 8, 12, 16, 20, 24])
    plt.axhline(y=0.0, color='black', linestyle=':')
    plt.tight_layout()
    cnt += 1
plt.savefig('event_and_direction.png', dpi=150)
plt.show()

fs.remove_folder('temp')

通貨ペアはEURJPY、EURUSD、USDJPYを使用した。ROCを直近24時間の平均と標準偏差で正規化し、+2.0以上で急騰、-2.0以下で急落と見なすことにした。また、ROCの全期間の平均を減じてトレンドを除去している。

グラフを見ると、当初の予想とは違い、いずれの通貨ペアでも急騰、急落を問わずイベント発生後の24時間では下落の傾向があるように見える。

解釈

なぜこのような結果になるのか分からないが、ポジションの偏りが関係しているのだろうかと想像している。

ポジションは数カ月、または数年に渡ってロング、またはショートに偏った状態が継続することがよくある。これはスワップ狙いの長期保有者や中長期的な観点から売買を行うヘッジファンドなどの存在によるのだろう。

中長期的な保有者にすれば、急騰、または急落といったボラティリティの拡大はリスクの拡大となる。そしてリスクの拡大はポジションの解消につながるだろう。

したがって、ポジションがロングに偏っている場合、ポジションの解消は売りとなり、下落する傾向を持つ。逆にポジションがショートに偏っている場合、ポジションの解消は買いとなり、上昇する傾向を持つ、というわけである。

もちろん、これは単なる想像であって何の根拠もない。もっと厳密な検証が必要だ。