単純移動平均線の平均回帰を考える

久しぶりにブログを書いてみます。
ドル円の5分足の終値について、5本平均線と200本平均線の比の関係を考える。それを考える理由は、仮に前者の数値をA、後者をBとすると、A/Bに平均回帰性(1に回帰?)という性質があることが分かれば、ゴールデンクロスを待たずに両者が一定以上乖離した時点で利確するという戦略が考えられるからだ。

例えば下の図のような状況において、乖離率が一定以上になったときにクローズするという条件を付け加えれば、実際にクロスする点Pではなく、Qあたりで利益確定することができる可能性が十分にあり、PとQの価格差までもを取れて単純なゴールデンクロスよりも有利な戦略を実行することができる。では実際に検証してみよう。
f:id:UTS1:20210219232000j:plain

 

 以下のようなコードで検証を試みた。ここではYahoo!Pythonライブラリであるyfinanceを用いている。これを用いると分足のデータまで入手出来てとても便利である。(pandas.Datareaderを使ってYahoo!からデータを取ると日足までしか入手できない)

まずデータを入手して、比率の推移を図示する。データは2021年2月19日から過去一か月のものを用いている。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
(!pip install yfinance) #Jupyterでは!が必要
import yfinance

data = yfinance.Ticker("USDC-JPY")
USDJPY = data.history(period="1mo",interval="5m")
USDJPY = USDJPY["Close"] #終値のみを用いる

dataframe = pd.concat([
    series,
    series.rolling(5).sum()/5,
    series.rolling(200).sum()/200
],axis=1).dropna()
dataframe.columns = ["Close","5day_ave","200day_ave"]

ratio = list()

for i in range(len(dataframe)):
  a = dataframe.iat[i,2]/dataframe.iat[i,1]
  ratio.append(a)

data = pd.Series(ratio)
data.plot()
plt.grid(True)
plt.title("Ratio between 200days-to-5days")
plt.xlabel("Period")
plt.ylabel("Ratio")
plt.show()
〜

以下のグラフが得られる。これを見ると確かに平均回帰性がありそうに思える。(ただの直感)
f:id:UTS1:20210219231047p:plain
では検証。ここではstatsmodel.apiを用いてADF検定(拡張ディッキー–フラー検定 - Wikipedia)を行い、データの定常性が存在するかどうかを検証する。
データに定常性が存在すれば、その期待値が一定ということが言えるので、平均回帰性についても言えることになる。

import statsmodels.api as sm

# トレンド項あり(2次まで)、定数項あり
ctt  = sm.tsa.stattools.adfuller(data, regression="ctt")
# トレンド項あり(1次まで)、定数項あり
ct = sm.tsa.stattools.adfuller(data, regression="ct")
# トレンド項なし、定数項あり
c = sm.tsa.stattools.adfuller(data, regression="c")
# トレンド項なし、定数項なし
nc = sm.tsa.stattools.adfuller(data, regression="nc")

print("トレンド項あり(2次まで)、定数項あり:"+str(ctt[1]))
print("トレンド項あり(1次まで)、定数項あり:"+str(ct[1]))
print("トレンド項なし、定数項あり:"+str(c[1]))
print("トレンド項なし、定数項なし:"+str(nc[1]))

#Result
トレンド項あり(2次まで)、定数項あり:5.0942354321243265e-05
トレンド項あり(1次まで)、定数項あり:1.085873740318188e-05
トレンド項なし、定数項あり:9.544199682578882e-07
トレンド項なし、定数項なし:0.7339364028608703

出力値はp値であり、ADF検定ではデータが単位根過程であることが帰無仮説になっているので、棄却することができればデータが単位根過程でない、つまり定常であると判断できます。上のデータを見ると、トレンド項なし、定数項なしの場合を除き定常性が認められるため、一定の条件下で平均回帰を示すと言えるのではないかと思います。この結果を具体的にどう活用するかはまたいつか書かせていただきます。

※コードや統計の知識等拙いところが多々あるので見つけたらコメントで教えて頂けると助かります