元バイオ系

元バイオウェット系がデータサイエンスやらを勉強していくブログ。 基本自分用のまとめ。

インバランスバーを理解したい

 ファイナンス機械学習で、非定常時系列の前処理・解析の勉強をしているんですが再序盤である第2章で躓いてしまいました。読んで理解するだけなら難しくありませんが、インバランスバーを実装してみるとここで躓く人も多いのではないでしょうか。

 第2章3節ではティックからバーを生成する手法が列挙されているのですが、いくつか実用に耐えない問題があります。今回はその問題と対策についてまとめていきます。

情報ドリブンバー

 チャートでバーと言えば〇分足のような時間で区切ったタイムバーが一般的ですが、タイムバーはリターン分布(各時刻における価格変化分布)の統計的性質が良くないとされています。機械学習モデルではデータが独立同分布(i.i.d)で生成されていることを前提としているため、タイムバーを使用して学習・推論することは適していないといえます。2章ではさまざまなバーを紹介してくれていますが、今回はその中でも、定義と実装の両方に問題があると思われるインバランスバーについてまとめます。

ティックインバランスバー

 ティックインバランスバーは、ティックの不均衡度合いが期待値を超える度にバーを更新するバーです。書籍で以下のように定義されています。

 \displaystyle \left\{(p_t, v_t)\right\}_{t=1,\ldots,T} を時刻  \displaystyle t において、価格  \displaystyle p_t、出来高  v_tのティック系列とする。この時、 \displaystyle b_t \in \left\{-1, 1\right\}である以下の系列を定義する。

$$ \begin{equation} b_t = \left\{ \begin{aligned} b_{t-1} \quad &\text{if } \Delta p_t = 0 \\ \frac{|\Delta p_t|}{\Delta p_t} \quad &\text{if } \Delta p_t \ne 0 \end{aligned} \right. \end{equation} $$

そして、ティックインバランスを以下のように定義する。

$$ \begin{equation} \theta_T =\sum_{t=1}^{T} b_t \end{equation} $$

そして、このティックインバランスが閾値を超えたとき(つまり、ティック不均衡となったとき)に、バーを更新します。

 閾値の決め方は、筆者によると以下のように決定できるとされています。

$$ \begin{equation} T^* = \text{argmin}_T \left\{|\theta_T| \ge\mathbb{E_0}[T]|2\mathrm{P}[b_t=1]-1|\right\} \end{equation} $$

しかしこの式には大きな問題点があります。

閾値が大きくなり続ける

 実は、この式の通りに実装を行うとインバランスバーの閾値が大きくなり続け、最終的にバーが更新されなくなってしまいます。これは、現在の閾値を超えたらバーを更新するということと、定義式の \displaystyle 2P[b_t = 1 ] - 1の最大値が  1 であることに起因します。閾値  \displaystyle E[\theta] を求めるときに  \displaystyle 2P[b_t = 1] -1 の上限が決まっているので  \displaystyle T の方で調整するしかなく、「現在の閾値を超えたら」バーが更新されるので、要求される  \displaystyle T はどんどん大きくなっていきます(細かいことを言えば原因はこれだけじゃないですが...)。

対策

2022-09-04 追記
ツイッターにて、間違いをご指摘いただいたので修正しています [2] 。

 閾値の定義式を嚙み砕いて言ってしまえば、「ラベルの偏り率が \displaystyle 2P[b_t = 1 ] - 1のとき、ティック数 Tが経過したらどの程度偏りが蓄積しているか」ということなので、閾値の定義は偏りの正常とされる許容範囲を示しているに過ぎません。

 「インバランスを検知したい」という基本に立ち返るならば、固定閾値をこえたらバーを更新し、都度 b_tをリセットすれば良さそうです。式で書くと以下のようになります。

$$ \begin{equation} \begin{aligned} \theta_T &=\sum_{t=1}^{T} b_t \\ T^* &= \text{argmin}_T \left\{|\theta_T| \ge \text{const.} \right\} \end{aligned} \end{equation} $$

 \text{const.}をどの程度の値に固定すれば良いのかは決め内でも良いと思いますし、動的に変化させたいなら b_t系列について偏りの移動平均を計算してみても良いと思います。この辺りが妥協点じゃないでしょうか?

実際に本対策法でFTXJPのBTC-PERPのリターン分布を計算してみたところ以下のようになりました。1か月分のデータに対してバーの数が1500~2000程度になるような閾値で計算しています。閾値次第な部分もあると思うのであまり参考にならないかもしれないですが、発散さず計算できたことがわかります。

 閾値によって分布は変わるのでちゃんとした比較にはなりませんが、ボリュームバーやドルバーは、ティックバーよりもやや緩やかなで、より対称な分布になっている気がします。

さいごに

  • これはあくまで私の見解です。間違いやもっと良いアイデアがあるよという方はコメントいただけると嬉しいです。
  • インバランスバーの次にランバーというものも紹介されていますが、定義を見る限り同じ問題が発生しそうです。

参考

  1. https://twitter.com/kodojibtc/status/1566034056542027776?s=20&t=s_JJkLKNgQXaZnXwRYFwUw