ペアトレードアルゴリズム取引
created at
グラフィカルラッソをペアトレードに応用する【導入編】
今回はペアトレードという取引手法について紹介していきたいと思います。おそらく【導入編】-【応用編】-【実践編】の3部構成になります。
そもそもペアトレードとは?
裁量取引を行ったことのある方ならお分かりになられると思いますが、単純に相場の上げ下げだけを予測するのは非常に難しいことです。どんなに優れたエコノミストであっても、どんなにスゴイ機械学習Botであっても、予測を外すことはあります。そこで単純なディレクショナリティの予測をやめ、複数の銘柄を使って多角的なアプローチを取り入れることを考えます。そこでペアトレードの登場です。
おそらくペアトレードといった場合、一般的に(厳密にではなく)主に二つの意味で使われることが多いように思います。
1. リスクヘッジのロングショート
例えば、ETHは素晴らしいので上昇しそうだ、という目論見があったとします。しかし、Ethereumがいかに素晴らしいプロダクトであろうと、マクロ環境によっては下落してしまう可能性も否めません。そこでETHのロングとBTCのショートをある比率で組み合わせます。すると、マクロ環境によってETHの価格が下がっても、同様にBTCの下落も見込めるので、ある程度のリスクヘッジができていると分かります。
もちろんこれは複数の銘柄に対しても拡張することができます。ロングオンリーの戦略をとる個別株ポートフォリオは相場全体の下落に弱い。そこでTOPIX先物をショートしておくと、ポートフォリオ全体のリスクを軽減させることができます。
単純なリスクコントロールの方法ではありますが、これだけでも一個の銘柄の上げ下げを予測するより良さそうというのは分かると思います。
2. 複数の銘柄間の不均衡を狙ったロングショート(もしくはポートフォリオ)
狭義にはペアトレードといった場合、こちらを指すことが多いのではないでしょうか。この記事では、こちらの戦法に焦点を当てていきます。
例えば、DOGEとSHIBはどっちも似たようなミームコインなので似たような動きをする、という仮説があったとします。しかしながら、しばしばDOGEがSHIBをアウトパフォームするような動きをすることが観測されました。もし、仮説が正しければ、DOGE-SHIBスプレッドは次第に縮小するので、DOGEショート + SHIBロングという戦略を立てることができると思います。あるいは、DOGEが暴騰しているのに、SHIBの価格は変わらないという場合、SHIBロングで攻めるというのも似たような考え方だと言えます。
最も単純な例は、上で挙げたような二つの銘柄間の乖離(スプレッド)に焦点をあて、ある閾値に到達したときにロングショートを構築するという戦略です。このような単純なロジックでも、アイデアと執行によっては利益を挙げられると思います。実際にトレーディングBotを運用されている方であれば、スプレッドに重点を当てたアルゴリズムの開発を実装/夢想されたことがあると思います。
ただし、この考え方をより発展させて、応用的に統計学の手法を取り入れることも考えられます。統計的手法を取り入れたペアトレードは統計的裁定取引という言われ方もしたりします。
次節では統計的裁定取引の入りとして、共和分を用いたペアトレードを紹介したいと思います。この統計的裁定取引は1980年代の株式市場で大変流行しました。モル○○・スタンレーなどはこの手法で莫大な利益を上げたと言われています。
共和分を用いた古典的ペアトレーディング
1970年代に見せかけの回帰の問題が発見されて以来、時系列の取り扱い方への研究は深まりました。(【ML Botter必見】バックテストでは上手くいくのに儲からない理由も参考にしてみてください)
トレンド項を取り除いてみたり、階差をとってみたりと研究者たちは色々と苦心して行く中で、共和分という概念が注目され、これをモデル化するアプローチが試みられました。簡単に説明しますと、二つの非定常な時系列(良くないやつ)をいい按分で線型結合させてあげると定常過程(いいやつ)となる場合、これらを共和分関係にあると言います。
二つの時系列とがあります(例えばビットコインとイーサリアム)。それぞれ単体では予測は難しいですが、のように変形させてあげればは予測しやすくなる。このを予測して儲けよう。そんなイメージです。
そして、さらに共和分関係を推定するためのモデルとして、ベクトル誤差修正モデル(Vector Error Correction Model: VECM) というモデルが発明されました。このベクトル誤差修正モデル自体は主にマクロ経済学の分野で用いられることの多い戦法ですが、昔の悪い大人たちはこれをトレーディングに応用することを考えました。
以下に(統計的)ペアトレーディングを行う上での簡単なロードマップを示しておきます。Pythonのstatsmodelsというパッケージが便利です。
単位根検定を実施。そもそも単位根がなければ共和分関係を探す理由はない。
from statsmodels.tsa.stattools import adfuller results = adfuller(x)
共和分ペアを探したい場合
P値が有意水準(例えば0.05などが一般的)を下回っている場合、そのペアは共和分関係にあると言える。 実務的には、itertools.combinationsで得たペアの候補に対して、forループを使って各々検定することが多い。
from statsmodels.tsa.stattools import coint #df: pandas.DataFrame t_stats,p_value,params = coint(df['x'], df['y']) print(p_value)
実際にVECMに落とし込む場合
from statsmodels.tsa.api import VECM model = VECM(df) results = model.fit() print(results.summary()) #統計のサマリー。注目するべきはP値とbetaの値。 print(results.predict()) #予測値 print(results.plot_forecast(steps=50))
VECMはVECMで面白いのですが、本題ではないので、詳細は割愛させていただきます。
異常検知とペアトレーディング
前節では共和分を用いたペアトレーディングの手法を紹介しました。しかしながら、ベクトル誤差修正モデルにもデメリットは存在します。
- 共和分関係が存在しない場合、VECMを使用することができない。
- 変数の個数を増やすにつれ、パラメータの数も増大し、実務で使うには非常に不安定になってしまいがち。
特に、VECMは古典的モデルにしては数学的に複雑でノイズの多い金融時系列には不向きです。そこで共和分とは全く違う別のアプローチからペアトレードを行うことを考えます。例えば次のような状況はどうでしょう。
- あなたはBTC,ETH,BNB,XRP,SOLの五つの銘柄を監視しています。SOLの価格が暴騰しており、他の四つの銘柄に比べて明らかにアウトパフォームしている。その上がり方が閾値を超えたので、SOLをショートする。
- 仮想通貨市場が盛況な中、LTCの価格が他のメジャーコインに対して出遅れている。そこでLTCをロングする。
このような状況下で有効なのが距離法を用いた異常検知です。
マハラノビス距離を用いた異常検知
マハラノビス距離は、多変量データにおいて、個々の観測がデータセットの中心(平均)からどの程度離れているかを測るための尺度です。この距離は、データの分布が多変量正規分布に従うと仮定した場合に、その分布の形状や変数間の相関に基づいて調整されます。そのため、ユークリッド距離とは異なり、各変数のスケールや変数間の相関に影響されません。
マハラノビス距離の計算式は次のとおりです。
ここで、
- は観測値のベクトル。
- はデータセットの平均値のベクトル。
- はデータセットの分散共分散行列。
- は分散共分散行列の逆行列。
この距離は、各変数の分散と変数間の共分散を考慮することで、変数間の相関が強い場合に特に有効です。変数が相関している場合、単純なユークリッド距離では変数間の関係が適切に反映されず、誤った判断を下す可能性があります。しかしマハラノビス距離では、これらの相関を考慮に入れるため、より適切な距離の尺度を提供します。
異常検知の文脈では、マハラノビス距離は、各観測値がデータセットの全体的なパターンからどれだけ離れているかを測るのに用いられます。距離が大きいほど、観測値は異常であると考えられる可能性が高くなります。
マハラノビス距離の問題点
マハラノビス距離は便利な尺度ですが、いくつかのデメリットも持っています。上記の数式を見てお気づきかと思われますが、マハラノビス距離を計算するためには、分散共分散行列の逆行列(精度行列)が必要です。変数の数が観測数に比べて多い場合、分散共分散行列は特異行列(逆行列が存在しない)になることがあります。
ノイズの多い金融時系列では、この精度行列が必要という点が非常に大きな問題になってきます。変数が多いときにこの問題は顕著になり、実務上では、しばしば精度行列を求めることは不可能になります。また、仮に精度行列が求まったとしても、金融にありがちな変数間同士の相関が高い場合は、行列の条件数の増加に伴い、精度行列は非常に不安定になります。
そこで、この問題点を解決する戦法がグラフィカルラッソとなります。
グラフィカルラッソの登場
ラッソ(LASSO: Least Absolute Shrinkage and Selection Operator)というのは統計学や機械学習でよく使われる手法の一つで、パラメータの数に対して罰則を儲けることにより、パラメータの増大化を防ぐことができます。精度行列を求める際にラッソを取り入れたものがグラフィカルラッソ(Graphical Lasso)です。特に、次元が高い(変数の数が多い)場合や、変数間の依存関係がスパース(疎)だと予想される場合に有用で、しばしばファイナンスx機械学習の分野で使われます。
多変量正規分布に従うデータがあり、その分散共分散行列を、逆行列(精度行列)を とします。グラフィカルラッソでは、以下の目的関数を最小化するを求めます(逆行列を使わず精度行列を直接求めているのがポイントです)
ここで、 はトレース(行列の対角成分の和)、 は精度行列の行列式の対数、 は の絶対値の和(L1ノルムと呼ばれます)です。
グラフィカルラッソには以下のような様々なメリットが挙げられます。( chatGPTに聞いてみる )
-
グラフィカルラッソはL1正則化を利用しているため、不要なパラメータをゼロにすることができます。これにより、結果として得られる精度行列はスパース(ほとんどの要素がゼロ)になります。これは、変数間の関係が少ない(つまり、多くの変数が互いに独立している)ことを意味し、解釈しやすいネットワーク構造を提供します。
-
精度行列の非ゼロの要素は変数間の条件付き依存性を表しています。これにより、どの変数が条件付きで他の変数に依存しているかを容易に識別でき、因果関係の推定や変数間のネットワーク構造の解釈に有用です。
-
データセットにおける観測数が変数の数より少ない場合、通常の最尤法では分散共分散行列の逆行列を推定することができません。グラフィカルラッソの正則化は、このような高次元データセットにおいても精度行列の推定を可能にします。
-
グラフィカルラッソは効率的なアルゴリズムを用いることができるため、大規模な問題に対しても比較的高速に解を求めることができます。
-
正則化パラメータの選択によって、モデルの複雑さを調整することができます。これにより、オーバーフィッティングを避けつつ、データに最も適したモデルを選択することが可能です。
-
正則化により、ノイズの多いデータや外れ値に対しても、よりロバストな推定が可能になります。
メリットづくしですね。過剰パラメータを防げるというだけでなく、精度行列を直接求めることで逆行列が求まらないという状況を回避することもできます。
カルバック・ライブラー情報量を用いた異常検知
さて、グラフィカルラッソを用いて推定された変数間の(銘柄間の)グラフ構造をもとに、マハラノビス距離を用いて異常検知を行う概要はお分かりいただけたと思います。が、もう少し議論を拡張させたいと思います。マハラノビス距離は多次元空間内での点の相対的な距離を測定することを目的としたものでした。しかし、個々の銘柄がある確率モデルに従って上げ下げを繰り返している、ような仮定を置いた時、異常検知の尺度を点同士の距離ではなく、確率モデル同士の距離に拡張させてることも考えられます。そこで登場するのがカルバック・ライブラー情報量(Kullback–Leibler divergence)です。
カルバック・ライブラー情報量は2つの確率分布の差異を計る尺度です。厳密には距離ではないのですが、距離のようなものなのでカルバック・ライブラー距離とも呼ばれます(以下KL距離)。確率分布 と間のKL距離は次のように定義されます。
ここで、
- と は連続確率分布
- と はそれぞれ分布 と の確率密度関数
ここで使われている分布を条件付き分布に拡張することで、ある一つの銘柄の確率分布に的を絞ることができます(つまり他の銘柄の分布が与えられた時のその銘柄の分布が条件付き分布)。
ふたつの条件付き確率分布 と間のKL距離は、ベイズの定理を用いて以下のように書くことができます。
ここで、
- とはそれぞれ二つの条件付き確率分布
- とはそれぞれ分布 と の条件付き確率密度関数
- はの確率密度関数
さて、ここで使われている確率分布に、グラフィカルラッソで推定した多変量正規分布を用いることで、この式をさらに発展させることができます(精度行列が使えるというのがミソです。詳しくは次回)。
まとめると、グラフィカルラッソによって銘柄間の依存関係(構造)を推定、その関係性を基に個別の銘柄の騰落率の異常値を検出する、というのがタイトルの「グラフィカルラッソをペアトレードに応用する」の主旨となります。
これ以上は高度な内容になってしまうので、続きは【応用編】で書いていきます。
↓投げ銭があると励みになります(ETH, MATIC, BNB, AVAX ... and whatever)。コメントも大歓迎です。
0x52250ea3a9a379c6655f00488Ea647DB406677ae