こんにちは。システムトレーダーの卵ことKenKenです。本日は「トレンドのモデル化」について、「Python3ではじめるシステムトレード ──環境構築と売買戦略」で勉強したことやそれに関連することを調べたのでまとめていきたいと思います。
確定的トレンドとは。
$$Y_t=\alpha + \beta t +u_t$$
上記の式で表されるトレンドを確定的トレンドまたは時間トレンドと呼ぶ。\(\alpha\)と\(\beta\)は回帰係数では\(u_t\)定常な攪乱工または残差項である。次に。2変数からなるモデルを考える。
$$E(Y | X_i ) = \beta_1 + \beta_2 X_i$$
\(Y\)を被説明変数、\(X\)を説明変数という。\(\beta_1\)、\(\beta_2\)は定数で回帰係数という。
\(E(Y |X_i)\)は\(X_i\)の時の\(Y\)の期待値を表す。この式は、\(X_i\)の時の\(Y\)の期待値が必ず\(\beta_1+\beta_2 X\)である確定的な関係を表している。これを母集団回帰関数と呼ぶ。実際には、平均からの乖離があるのでそれを表現すると以下の式となる。
$$Y_i = \beta_1 + \beta_2 X_i + u_i = E(Y | X_i) + u_i$$
\(E(Y | X_i)\)は説明変数における被説明変数の平均的な値であり、確定的な成分である。一方、\(u_i\)は予測不可能であるので確率的な成分である。この式を母集団回帰式とよぶ。
以上の式は、すべてのデータが手に入る母集団を前提にしている。しかし、実際には母集団を手に入れることは不可能であり、手に入れられるのは母集団の一部(標本という)である。したがって、標本から母集団回帰関数と同等の標本回帰関数を推定する必要がある。標本関数を次の式で表す。
$$\hat{Y_i}=\hat{\beta_1} + \hat{\beta_2} X_i + \hat{u_i}$$
ここで、\(\hat{Y_i}\)、\(\hat{\beta_1} \)、\( \hat{\beta_2} X_i\)、 \(\hat{u_i}\)は統計量であり、\(\hat{u_i}\)を残差項と呼ぶ。これらの推定量は、最小二乗法で導出できる(説明は割愛)。最小二乗法では、以下の仮定している。
- 回帰関数は線形でなければならない
- \(X_i\)は確率変数であってはならない
- \(u_i\)の平均はゼロ
- \(u_i\)の分散は一定
- \(u_i\)と\(u_{i+j}\)の相関はゼロ
- \(u_i\)と\(X_i\)の共分散はゼロ
日経平均株価の確定的トレンド
上記で説明したモデルを用いて、日経平均株価の確定的トレンドのモデル化を行っていく。時間の経過とともに価格が線形に上昇、または下落する傾向を持つとき、その時系列は以下の式で表される。
$$Y_t = \alpha + \beta \cdot t + u_t$$
ここで\(Y_t\)は日経平均株価、\(t\)は経過時間、\(\beta\)は傾き、\(u_t\)は残差項を表す。
日経平均株価は、バブル崩壊までは強い上昇トレンドを示し、その後はいくつかの上昇トレンドと下降トレンドを繰り返しながら、最高値を更新できないでいる。まずは、1949年から直近までの期間について確率的トレンドの有無について調べてみる。なお、本分析では対数価格を用いる。
import pandas_datareader.data as pdr import statsmodels.api as sm import numpy as np import matplotlib.pyplot as plt %matplotlib inline # データ取得 end = '2020/11/27' N225 = pdr.DataReader('NIKKEI225', 'fred', '1949/5/16', end).dropna() ln_N225 = np.log(N225) y = ln_N225.values # 被説明変数 x = range(len(ln_N225)) # 説明変数 x = sm.add_constant(x) # 切片 model = sm.OLS(y, x) # 最小二乗法 results = model.fit() print(results.summary())

サンプル数は17782であり、決定係数は0.756と高い。回帰係数について、\(\alpha\)と\(\beta\)の帰無仮説はそれぞれ\(\alpha=0\)と\(\beta=0\)である。標準誤差はそれぞれ、0.011と0.000であり、p値はそれぞれ0である。したがって、帰無仮説は棄却され、\(\alpha=6.2842\)、\(\beta=0.0003\)となる。したがって、1949年以降の日経平均株株価は上昇トレンドを持っており、以下の式でモデル化される。
$$lnY_t = 6.2842 + 0.0003t$$

本当にそうなのか??最小二乗法の過程を見返してみると。。。
まずは、モデルの期待値と日経平均株価(対数)をプロットしてみる。
# グラフを図示 plt.figure() ax = plt.subplot(1, 1, 1) plt.plot(ln_N225.index,ln_N225, label='ln_N225', color='darkgray') plt.plot(ln_N225.index, results.fittedvalues, label='predict') plt.ylabel('log(N225 index)') plt.legend()

次に残差項だけを取り出し、時系列チャートを書いてみる。
# 残差の時系列チャート plt.figure() ax = plt.subplot(1, 1, 1) ax.plot(results.resid, color='seagreen') plt.ylabel('residual')

上図を見ると、残差にもトレンドがあるように見える。そこで残差のヒストラムを書いてみる。
# 残差のヒストグラム plt.figure() ax = plt.subplot(1, 1, 1) ax.hist(results.resid, bins=100, color='lightgray') plt.ylabel('frequency')

上図から残差はいくつかの分布から構成されており、残差の平均と分散はいくつか存在しているように見える。これは、上記で書いた条件を満たしているようには見えない。
したがって、一見すると確定的トレンドをモデル化できているように見えたが、残差項に着目するとどうやらさらに短い期間のトレンドが存在しているように見える。残差についてはさらなる分析が必要そうである。
次回は、期間幅を短くしてトレンドの分析をしてみようと思う。確定的トレンドをモデル化してそれをシストレに反映していくことはできないか検討中。統計的手法に基づくトレーディングシステムでどうなんだろか。その辺についても今後、調査していこうと思う。
以上