見出し画像

【機械学習自動売買ボットの改善案】 richmanbtcさんのチュートリアルの改良 〜特徴量の定常性と定常化〜②

こんにちは、rog_peterです。

以前の記事で、特徴量の定常性と定常化について大雑把に説明したわけですが、実際チュートリアルで紹介されているTalibから生成される特徴量をどう処理していけばよいのか、について解説します。

なぜ定常性や定常化が重要なのかについて詳しく知りたい方は以前の記事をご覧ください。

特徴量の定常性を調べることに関しては、richmanbtcさんのチュートリアルの上級部分であるnon_stationary_score.ipynbに実装が載っております。non_stationary_score.ipynbは、大雑把に説明するとインデックス量(〜時刻)をLightGBMモデルで"予測できてしまう"かどうか調べるノートブックです。仮に高精度で予測できてしまう場合、特徴量のいずれかが時刻に強く相関がある(=非定常)な量である可能性が高く、そのような特徴量はモデルの汎化性能を低下させる可能性ある、ということを意味しています

この実装で注意すべき部分は、LightGBMを定義する部分でrichmanbtcさんのノートブックでは、

model = lgb.LGBMRegressor(n_jobs=-1, random_state=1)

となっている点です。LightGBMではデフォルトで、importance_type="split"になっており、これは、feature importanceを表示する際にモデルでその特徴量が使用された回数を基準にしていることを意味しています。下記の記事に詳しい解説があります。

 それとは別に、オプションでimportance_type="gain"というのもあり、こちらは、その特徴量が使用する分岐からの目的関数の減少 を示しており、importance_type="split"よりも特徴量の目的変数に対する実際の寄与を表現することができます。

model = lgb.LGBMRegressor(n_jobs=-1, random_state=1, importance_type="gain")

importance_type="gain"をモデル定義部分で設定してチュートリアルのnon_stationary_score.ipynbを動かしてみると、下記のようなグラフが得られると思います(訓練期間によって2番目以降は多少順番が入れ替わるかもしれません)。

feature importance


STDDEV、つまり、終値の標準偏差が、時刻を予測するというモデルでぶっちぎりで最も大きな寄与を果たしているということがわかります。つまり、STDDEVはリターン予測のモデルの特徴量として使った際に汎化性能を悪化させるかもしれない特徴量になっているということです。実際にdf['STDDEV']を時刻に対してプロットしてみると、

df["STDDEV"]

というふうに2019-2020年は比較的小さめの値ですが、2021年以降は急激に増加しており、強く時間依存していることがわかります。これは標準偏差の定義を考えれば妥当な結果で、大雑把には標準偏差はビットコインの値動き幅で、ビットコインの価格の絶対値におおよそ依存しているからです。単純にビットコインの価格が大きければ、値動き幅の絶対値も大きくなるということですね。(ビットコインの価格は2021年以降大幅に上がりましたよね。)

さて、df['STDDEV']を終値df['cl']で割ってみましょう。(定常化の方法は終値で割る以外にもたくさんあるのでいろいろ試してみてください。)

df['STDDEV'] = df['STDDEV']/df['cl']

そして同様にプロットしてみると、

df["STDDEV"]/ df['cl']

という感じでどの時刻でもほぼ同様の振る舞いになっていることがわかります。さてこのdf['STDDEV']で再度feature importanceを見てみると、先程ぶっちぎりで1番だったSTDDEV が3番目まで後退してこの時刻を予測するというモデルにおける重要度の寄与が大幅に下がっていることがわかります。つまり、定常化された可能性が高いことがわかります。(本当に定常化されたかどうかは、前回紹介した単位根検定、ADF検定をやってみてください。)

feature importance

以上の過程が、非定常な特徴量を発見して、定常化していくというプロセスでrichmanbtcさんのチュートリアルベースのモデル改善ではとても重要なプロセスになっております。

こちらの記事も御覧ください。

今回具体例を紹介した定常化の他にも様々な特徴量エンジニアリングの方法があると思いますので一緒に学んでいきましょう!

それではよいBotter Lifeを!

以下投げ銭用です。

ここから先は

0字

¥ 500

この記事が気に入ったらチップで応援してみませんか?