連続して上昇/下落した翌日の挙動

denovor.hatenablog.com

  • 前回の記事で連続して上昇、あるいは下落する日数を調べた。
  • そこで自然に、「連続して3日上昇した翌日は下落するのか?」、あるいは「連続して5日下落した翌日は(流石に)上昇するだろう」といった疑問が湧く。

denovor.hatenablog.com

  • こちらの記事では、上昇と下落の割合は1596/3249 = 0.49108170310701954であった。約1/2であり、ドル円の上昇と下落がランダムに決定されていることを示唆している。
  • ここで求める確率は、「n日連続上昇している時」(A)に、「翌日上昇する確率」(B)である。
  • 仮にドル円の上昇/下落がランダムであれば、n日連続で上昇していようがいまいが、翌日上昇/下落する確率は1/2であろう。例えば、3日連続で上昇する確率は1/8となるし、4日連続で上昇する確率は1/16となる。
  • 次の図は全体の中で、n日連続で上昇/下落した日数を縦軸にしたものであるが、日数が増えるにつれ、縦軸はほぼ半分になっている。

f:id:denovor:20201005151828p:plain

  • こちらは下落の場合。

f:id:denovor:20201005152001p:plain

  • まずはいつものようにLibraryをimportする。
import pandas as pd
from pandas.plotting import autocorrelation_plot
import numpy as np
from scipy import stats

from matplotlib import pylab as plt
import seaborn as sns
sns.set()
import statsmodels.api as sm
import heapq as hp
import math

fx_data = pd.read_csv("/Users/ユーザー名/Documents/FX/foreign_exchange_historical_data/USDJPY/USDJPY_DAY.csv")#データの読み込み
#pandasの計算は遅いので、全てnumpy配列に変換
opening = np.array(fx_data["opening"])#始値
high = np.array(fx_data["high"])#高値
low = np.array(fx_data["low"])#低値
closing = np.array(fx_data["closing"])#終値
  • n日連続して上昇/下落した時、n+1日目が上昇/下落のいずれかになるのか調査する。
days_chr = [0] * len(opening)
#それぞれの日が、何日間上昇しているのか、あるいは下落しているのかを表す。
#例えば、days_chr[x] = 5とすると、xという日は5日連続で上昇していることを表す。
#days_chr[x] = -3とすると、xという日は3日連続で下落していることを表す。 
m = 0
M = 0

for i in range(len(opening)):
    if opening[i] > closing[i]:
        m = 0
        M += 1
    elif opening[i] < closing[i]:
        m += 1
        M = 0
    days_chr[i] = -m + M

from collections import Counter
#Counterのimport

a = Counter(days_chr)

とする。n日連続で上昇して、翌日も上昇する確率は、

a[n+1]/a[n]

として良い。

from collections import defaultdict
days_prob_pos = defaultdict(int)

for j in range(1, 15):
    days_prob_pos[j] = a[j+1]/a[j]
  • 計算すると
defaultdict(int,
            {1: 0.5017964071856288,
             2: 0.4797136038186158,
             3: 0.417910447761194,
             4: 0.5476190476190477,
             5: 0.5652173913043478,
             6: 0.5,
             7: 0.46153846153846156,
             8: 0.5,
             9: 0.6666666666666666,
             10: 1.0,
             11: 0.5,
             12: 1.0,
             13: 1.0,
             14: 1.0})
  • 図示すると次のようになる。

f:id:denovor:20201008180129p:plain

  • 解釈が重要である。1日上昇した次の日はほぼ1/2の確率で上昇する。2日連続した時も同様であるが、確率は0.479となり、多少下落の確率が高くなる。
  • 3日目が重要で、3日連続で上昇した時は、4日目に上昇する確率は約0.42である。逆にいうと、6割程度下落している。
  • また、4日連続、5日連続で上昇した時は、その翌日は上昇する確率の方が高い。8日目以降はサンプルが少ないので、あまり重要ではない。
  • 下落の場合はどうだろう。
days_prob_neg = defaultdict(int)
for k in range(-8, -1):
    days_prob_neg[k] = a[k]/a[k+1]
defaultdict(int,
            {-8: 0.2727272727272727,
             -7: 0.5238095238095238,
             -6: 0.4666666666666667,
             -5: 0.4787234042553192,
             -4: 0.47715736040609136,
             -3: 0.4925,
             -2: 0.4778972520908005})
  • 図示は以下。

f:id:denovor:20201008180630p:plain

  • こちらはほぼ1/2で下落している。