📖

Binance永久先物の24時間アノマリーと戯れる

2022/09/24に公開

きっかけ

JMLさんの曜日アノマリーの話にRichmanBTCさんが乗っかり、24時間前と48時間前のリターンの平均をごにょごにょしていて、ほうほう、と思いました。

Hohetoさんが以前投稿していた24時間アノマリーの記事はこちらです。

しっかり分析されていて、なるほどためになる…と思ったので、Binanceのデータを使って自分でも検証してみることにしました。こういう検証を地味に繰り返すことで力がつくはず!

検証データについて

  • 期間は2020/9/20(月) から2022/9/18(日)までとしました
  • 検証の対象とする数値は、前日クローズ価格から当日クローズ価格の対数リターン系列にしました
  • 銘柄はCoinGeckoの時価総額順に、以下のBinance USDT建て永久先物を選択しました
    • BTCUSDT
    • ETHUSDT
    • BNBUSDT
    • XRPUSDT
    • ADAUSDT
    • SOLUSDT
    • DOGEUSDT
    • DOTUSDT
    • 1000SHIBUSDT
    • MATICUSDT
    • TRXUSDT
    • AVAXUSDT
    • ETCUSDT
    • ATOMUSDT
    • UNIUSDT
    • LTCUSDT
    • NEARUSDT
    • LINKUSDT
    • XLMUSDT
    • XMRUSDT
    • BCHUSDT
    • ALGOUSDT

検証1 : 24時間アノマリーはまだ有効か?

Hohetoさんの記事では、24時間アノマリーがよく効く銘柄とそうでないものがある、とあります。そこで、上記の銘柄の全組み合わせについて、コレログラムを書いてみました。

24時間アノマリーのクロスコレログラム

あわせて、scipy.stats.pearsonrを使って、シフトしない対数リターン系列と、24時間シフトした対数リターン系列の相関係数とp値を計算しました。

銘柄 相関係数 p値
BTCUSDT -0.0294 0.0001
ETHUSDT -0.0357 0.0000
BNBUSDT -0.0689 0.0000
XRPUSDT -0.0250 0.0009
ADAUSDT -0.0545 0.0000
SOLUSDT -0.0266 0.0004
DOGEUSDT -0.0955 0.0000
DOTUSDT -0.0555 0.0000
1000SHIBUSDT -0.0868 0.0000
MATICUSDT -0.0606 0.0000
TRXUSDT -0.0452 0.0000
AVAXUSDT -0.0405 0.0000
ETCUSDT -0.0522 0.0000
ATOMUSDT -0.0376 0.0000
UNIUSDT -0.0284 0.0002
LTCUSDT -0.0448 0.0000
NEARUSDT -0.0359 0.0000
LINKUSDT -0.0483 0.0000
XLMUSDT -0.0325 0.0000
XMRUSDT -0.0366 0.0000
BCHUSDT -0.0444 0.0000
ALGOUSDT -0.0357 0.0000

結果1 : 24時間アノマリーはまだ有効で有意

Hohetoさんの記事の中のコレログラムと比べると、今回のものは多少違いはありますが、24時間アノマリーは健在です。


Hohetoさんの記事の中のBTCUSDTのコレログラム


今回のBTCUSDTのコレログラム

計算した相関係数とp値も24時間アノマリーが健在であることを裏付けています。

結果2 : BTCUSDT以外の銘柄の方が24時間アノマリーは強い

今回はBTCUSDTに限らず他の銘柄のコレログラムも書いてみたのですが、その結果BTCUSDTの24時間アノマリーは他の銘柄に比べると弱い部類であることがわかりました。

BTCUSDTの相関は-0.03~-0.04程度ですが、上のコレログラム群を見た感じ、おおむね-0.2を超えるものが相関が強い部類と考えてよいと思います。

特に24時間アノマリーが強く印象に残ったのは、以下の二つの銘柄です。たまたまどちらもいわゆるミーム銘柄で、市場の参加者の特性が表れているのかもしれません。


DOGEUSDTのコレログラム


1000SHIBUSDTのコレログラム

結果3 : 銘柄を超えた24時間アノマリーは総じて弱いが例外もある

また、銘柄間のクロスコレログラムも書いてみたところ、ほとんどのケースで他の銘柄との相関が自己相関を超えることがないことも分かりました。

ADA, AVAX, MATIC, SOL, ATOM辺りの銘柄に例外ペアがぼちぼち存在します。例外の一つとしてSOL-ADAのペアをあげておきます。観測期間の間、SOLは24時間前の自分の値動きよりも、ADAの24時間前の値動きと似たような動きをしがちだったことを示していますが、何らかの因果関係があるかはわかりません。


SOLとADAのクロスコレログラム

検証1-1 : 24時間アノマリーが毎時間成立しているかを確認する

24時間アノマリーが健在なことは分かりましたが、本当に一日中そんなアノマリーが成立しているものなのでしょうか。

24時間前の対数リターンとの相関が毎時どの程度あるかを銘柄ごとに調べてみます。タイムゾーンはUTCを使っています。

結果

予想通り24時間アノマリーが有効な時間とそうでない時間があることが分かりました。

その中でも1000SHIBは24時間のうち14時間にわたって有意に24時間アノマリーが成立していることが特に目立ちます。また、1000SHIBは24時間アノマリーが成立しないのがアメリカ太平洋標準時の深夜0時から朝7時までの時間帯であることが興味深いです。

各銘柄について24時間中何時間24時間アノマリーが有意に成立しているかも書いておきます。

銘柄 24時間アノマリーが成立する時間
BTCUSDT 5時間
ETHUSDT 5時間
BNBUSDT 10時間
XRPUSDT 4時間
ADAUSDT 10時間
SOLUSDT 4時間
DOGEUSDT 11時間
DOTUSDT 7時間
1000SHIBUSDT 14時間
MATICUSDT 11時間
TRXUSDT 6時間
AVAXUSDT 6時間
ETCUSDT 10時間
ATOMUSDT 5時間
UNIUSDT 1時間
LTCUSDT 4時間
NEARUSDT 6時間
LINKUSDT 9時間
XLMUSDT 5時間
XMRUSDT 6時間
BCHUSDT 8時間
ALGOUSDT 3時間

検証2 : 簡単なルールベースのバックテストをしてみる

24時間アノマリーは健在そうだということが分かったので、各銘柄で簡単なバックテストをしてみることにしました。

執行戦略は以下の通りの非常にシンプルなものです。

  • 直前の1時間足のクローズ価格で成行エントリー、現在の1時間足のクローズ価格で成行イグジットを繰り返します
  • 売買方向は24時間前の1時間足の価格変化がプラスならショート、マイナスならロングの逆張りをします

なお、Binanceの成行手数料は片道0.04%なので、取引ごとに0.08%の手数料を取られるものとしました。

結果

ぜんぜん利益がでません

1時間に1回取られる手数料0.08パーセントが多すぎる単なるBinanceを儲けさせるBotになってしまっています。HohetoさんのNoteで書かれている通りになってしまいました。

仮想通貨の聖杯は取引所を経営することであることは確定的に明らかであることがわかりました

しかしよく見ると…1000SHIBだけは利益が出ています。これだけシンプルなルールで毎時間0.08%の手数料を取られてもプラス収支を叩き出されたのはすごいです。ほぼすべての銘柄で勝率が50パーセントを超えているのもえらい。


シンプルな24時間アノマリー逆張り戦略のリターン

銘柄 利益 勝率
BTCUSDT -1165.74% 50.73%
ETHUSDT -1003.37% 51.20%
BNBUSDT -917.15% 51.15%
XRPUSDT -979.03% 49.79%
ADAUSDT -609.05% 50.64%
SOLUSDT -416.49% 51.36%
DOGEUSDT -458.62% 50.66%
DOTUSDT -428.26% 51.47%
1000SHIBUSDT 44.04% 52.89%
MATICUSDT -158.78% 51.16%
TRXUSDT -998.78% 49.52%
AVAXUSDT -797.64% 50.18%
ETCUSDT -687.70% 50.66%
ATOMUSDT -727.70% 50.44%
UNIUSDT -964.61% 51.15%
LTCUSDT -1081.55% 50.55%
NEARUSDT -612.85% 51.18%
LINKUSDT -667.85% 50.92%
XLMUSDT -1010.02% 50.50%
XMRUSDT -900.43% 50.63%
BCHUSDT -1132.48% 50.59%
ALGOUSDT -645.03% 50.59%

検証3 : 簡単なルールベースのバックテストを改良する

検証2のバックテストは、手数料を払いすぎているのでマイナスになってしまいました。

毎時間取引するというルールなので、1時間のリターンが手数料より少ない見込みの時も取引をしてしまい、0.08%の手数料を払ってマイナスになってしまっているということでしょう。

では、24時間前の変化が小さいなら取引はしないようにすれば、手数料負けは減るかも? と考えて、ルールを追加します。

  • 直前の1時間足のクローズ価格で成行エントリー、現在の1時間足のクローズ価格で成行イグジットを繰り返します
  • ただし、24時間前の1時間足の価格変化率の絶対値が1%未満の場合はエントリーしません
  • 売買方向は24時間前の1時間足の価格変化がプラスならショート、マイナスならロングの逆張りをします

結果

大きく利益が改善しました
全てのペアで利益率が向上しました。目論見通り手数料負けを減らせたようです。

おまけに勝率まで向上しています。24時間前の価格変化が大きい時の方が24時間アノマリーは強くなるという新しい発見です。

ただ、ドローダウン率が100%以上なので、そのままBotとして稼働すると大変なことになりそうです。

ともあれ、実験結果から仮説を立て、改善策を考えてまた実験する、その結果を分析してまた次の実験をする…というBot作りの基本が分かってきました。あまり複雑過ぎないBotでこの改善サイクルに慣れるのがよさそうだ、と言う手ごたえがありました。


24時間前に1%以上の値動きがあった時だけ取引する24時間アノマリー逆張り戦略のリターン

銘柄 利益 勝率
BTCUSDT 13.28% 57.93%
ETHUSDT 25.57% 55.91%
BNBUSDT 146.28% 56.66%
XRPUSDT 21.34% 54.40%
ADAUSDT 41.49% 53.68%
SOLUSDT 20.45% 55.45%
DOGEUSDT 302.72% 57.23%
DOTUSDT 106.15% 55.66%
1000SHIBUSDT 309.22% 62.88%
MATICUSDT 198.32% 55.45%
TRXUSDT 54.13% 54.12%
AVAXUSDT 122.05% 53.67%
ETCUSDT 129.70% 56.77%
ATOMUSDT 32.57% 52.48%
UNIUSDT 4.02% 53.96%
LTCUSDT 54.54% 56.35%
NEARUSDT -18.48% 53.05%
LINKUSDT 94.16% 55.87%
XLMUSDT 83.58% 56.33%
XMRUSDT 18.99% 51.56%
BCHUSDT 81.46% 55.43%
ALGOUSDT 4.01% 53.86%

検証4 : XGBoostで24時間アノマリーを発見できるか - 回帰編

24時間アノマリーを使ったBotをルールベースで作れそうな感じにはなってきましたが、ついでに機械学習で24時間アノマリーを発見できるかを確認してみることにしました。

ここまでのコレログラムの計算などで72時間分の1時間足の対数リターンを使ったので、それらを特徴量としてXGBoostに与えて学習してもらい、その結果得られる特徴量の重要度を見て判断します。

XGBoostを以下のようなパラメータで動かして回帰学習をしてみます。

  • eta = 0.1
  • objective = 'reg:squarederror'
  • eval_metric = 'rmse'
  • num_boost_round = 1000
  • early_stopping_rounds = 20
  • random_state = 0

トレーニングに与えるデータからは、予測対象となる現在の1時間足のリターンが、大きすぎるもの、と小さすぎるもの(上位下位2.5%)を取り除きました。極端な値を学習してしまうことを避けるためです。

結果

XGBoostは24時間前の時間足をもっとも重要な特徴量として発見することができませんでした

全ての銘柄で1時間前の情報を圧倒的に重要な特徴量として扱っています。24時間前の情報を下位の特徴量として発見したケースもいくつかありましたが、回帰問題では直近の情報の影響が大きすぎるのかもしれません。

XGBoostを使った回帰学習の結果

検証5 : XGBoostで24時間アノマリーを発見できるか - 二値分類編

回帰を使った場合は機械学習で24時間アノマリーを発見できませんでしたが、よりシンプルな価格の上昇・下降という二値分類ではどうかを確認してみます。

XGBoostをobjectiveだけを切り替えて二値分類学習をしてみます。

  • eta = 0.1
  • objective = 'binary:logistic'
  • num_boost_round = 1000
  • early_stopping_rounds = 20
  • random_state = 0

トレーニングに与えるデータは回帰の場合と全く同じものを使いました。

結果

XGBoostは24時間前の時間足を重要な特徴量として発見することができました

回帰の際とは異なり、SOL, 1000SHIB, MATIC, AVAXなどの銘柄で24時間前の時間足の情報をもっとも重要な特徴量のひとつとして発見することができています。

問題が単純になることによって隠されたパターンを発見しやすくなったのかもしれません。今後Bot作りに機械学習を利用する際には、どのような予測をさせるかをよく考える必要がありそうです。

XGBoostを使った二値分類学習の結果

おわりに

ということで、24時間アノマリーの検証をしてみました。

こういった検証を繰り返すことで経験値を積んで、そのうちC級Botterになれるとよいなあ。

Discussion