ファイナンス機械学習:分数次差分をとった特徴量 E-mini S&P500 先物ドルバーの対数累積時系列 共和分検定

E-mini S&P 先物ドルバーの時系列の対数価格の累計を取る。

logClose=np.log(close.astype(float)).cumsum()
plt.plot(logClose.index,log_close)
先物ドルバーの対数価格の累積

$${\tau=1e-5}$$で固定ウィンドウ法により定常になる、最小の$${d, d\in [0,2]}$$を求める。

def plotMinFFD(process,WindowWidth,thres,dmin=0.,dmax=1.,dnum=21):
    from statsmodels.tsa.stattools import adfuller
    '''
    Finding the minimum differentiating factor that passes the ADF test
    
        Parameters:
            process (np.ndarray): array with random process values
            WindowWidth (bool): flag that shows whether to use fixed width window (if True)
                                         or expandingi width window (if False)
            thres (float): threshold for cutting off weights
    '''
    out = pd.DataFrame(columns=['adfStat', 'pVal', 'lags', 'nObs', '95% conf'], dtype=object)
    printed = False
    
    for d in np.linspace(dmin, dmax, dnum):
        if WindowWidth: #Fixed Window
            process_diff = fracDiff_FFD(pd.DataFrame(process), d, thres)
        else:           #Entending Window
            process_diff = fracDiff(pd.DataFrame(process), d, thres)    
        test_results = adfuller(process_diff, maxlag=1, regression='c', autolag=None)
        out.loc[d] = list(test_results[:4]) + [test_results[4]['5%']]
        if test_results[1] <= 0.05 and not printed:
            print(f'Minimum d required: {d}')
            d_min=d
            printed = True
    fig, ax = plt.subplots(figsize=(11, 7))
    ax.plot(out['adfStat'])
    ax.axhline(out['95% conf'].mean(), linewidth=1, color='r', linestyle='dotted')
    ax.set_title('Searching for minimum $d$')
    ax.set_xlabel('$d$')
    ax.set_ylabel('ADF statistics')
    plt.show()
    return d_min, out

d,outADF=plotMinFFD(logClose,True,1e-5,dmin=0.0,dmax=2.,dnum=41)
ドルバー対数累積の分数次差分差分

$${d=2}$$で差分を取り、定常となった時系列と、対数累積時系列の相関を取る。

lCFFD = fracDiff_FFD(logClose, d=2.0, thres=1e-5).dropna()
df=(pd.DataFrame()
    .assign(org=close)
    .assign(log=logClose)
    .assign(ffd=lCFFD['Close'])
    ).dropna()
df.corr()
ドルバー、ドルバーの対数累積、固定ウィンドウd=2での分数次差分の相関

差分し、定常となった時系列と、オリジナル時系列、対数累積時系列の間に相関はない。
 次に、共和分検定を行う。

def printEGcoint(p0,p1):
    from statsmodels.tsa.stattools import coint
    # pVal<0.05 has cointegration
    EGcoint = coint(p0, p1)
    print('T-statistic:', EGcoint[0])
    print('p-value:', EGcoint[1])
    print('Critical Values:')
    critical_value_labels = ['1%', '5%', '10%']
    for i, value in enumerate(EGcoint[2]):
        print('\t%s: %.3f' % (critical_value_labels[i], value)) 

 この検定を行う前に、二つの時系列が共和分を持つ条件は、二つともが単位根を持つことを確かめる。
 また、statsmodelsのcoint関数は、与えられた二つの時系列$${y_0}$$、$${y_1}$$について、共和ベクトル$${(a,b)}$$を用いた線型結合$${ay_0 + b y_1}$$の定常性の計算に最小二乗法を使っていることで、
$${coint(x,y}$$と$${coint(y,x)}$$では答えが違うことがある。
 これを、単位根のあるオリジナル時系列と対数累積時系列、定常時系列で単位根のない分数差分された時系列で見ていく。

printADF(df.org)
printADF(df.log)
printADF(df.ffd)
ドルバー、対数累積、分数差分の時系列のADF検定結果
print('Dollar Bar vs. FFD')
printEGcoint(df.org, df.ffd)

print('Cumsum of LogPrice vs. FFD')
printEGcoint(df.log, df.ffd)


print('Cumsum of LogPrice vs. Dollar Bar')
printEGcoint(df.log, df.org)
printEGcoint(df.org, df.log)
Engle-Granger共和分検定

帰無仮説「共和分を持たない」は、すべての組み合わせで受け入れられているが、ADF検定で単位根を持たないと判定されている分数差分時系列FFDが入っている結果は適当ではないことに留意するべきである。
 ここに反例として、分数差分時系列とドルバーの順序を逆にして共和分検定を行った結果を示す。

分数次差分とドルバーの順序を変えて共和分検定を行った結果

「共和分を持たない」帰無仮説は棄却され、共和分を持つ結果となっている。先ほど見た通りに、分数差分された時系列には単位根はない。したがって、この結果で、共和分を持つと結論づけることは間違いである。

差分された時系列にJarque-Bera正規性検定を行う

差分時系列の正規性検定

Jarque-Bera正規性検定の帰無仮説「与えられたデータは正規分布に従う」はp値0.0で棄却されている。よって、差分時系列は正規性を持たない。

この記事が気に入ったらサポートをしてみませんか?