こんにちは。ギャンブルで消耗してますか?紫藤かもめ @shidokamo です。暗号通貨の話です。
今日は、ごく初歩的な裁量トレードを題材に、プログラムを用いた解析とそれを実際に自動化して動かす例を紹介します。
ボーダーレスで24時間365日動き続ける暗号通貨市場、長く楽しみたいものですね。
そのためには健全なトレードの元になる規律が必要です。それをプログラミングで支えようという初心者向け企画となります。
初心者の人は、この記事を読んで実践すれば少しだけ強くなれるかもしれません。全て無料でコードも実際に動くものを公開しています。 参考程度ですが、バーチャルトレードの損益も貼ってあります。
今まで全くコードを書いていなかった人の自動トレードの第一歩にも活用できるかもしれません。
最初にまとめ
まず自作の Jupyter Notebook で以下のように、短期的な急落狙いのロングエントリのシミュレーションを行います。
それを実際にbotとして実装します。バーチャルシミュレーションの様子はこちら。 こちらがどのようなロジックで動いているのかを後ほど詳しく解説します。
実りあるギャンブルのために
では本題の前に、冒頭で述べた規律という部分をもう少し詳しく掘り下げます。 今回題材にするのは、いわゆる「裁量トレード」であり、どこまで行っても究極的にはギャンブルですので、自分をどう律するかをしっかりと言語化しておきます。
今回は簡単に言うと以下のような行動が課題として設定されて、botの実装につながっていきます。
- 資産のごく一部でやる。借金などはもっての他。
- 真剣に勝ちを目指す。
- 仮説の提起と分析を楽しむ。
- 分析結果を自動化してbotとして運用する。
資産のごく一部でやる。借金などはもっての他。
まあこれは言うまでもないことなのですが、botを出す以上は念のため。 借金してトレードとか、全財産一点賭けなんかは一番のアンチパターンですね。
特に借金はいけません。 一発で人生終了する可能性があります。
本記事のコードを使う場合、決して一発逆転を狙うようなことのないようにお願いします。 目標が大きい場合は、5年、10年の期間で取り組むべきです。
真剣に勝ちを目指す
真剣に勝ちを目指すということをもっと落とし込むとこれは結局 「戦場選び」 というところに行きつくのかなと思います。
落ち込んでいる時など、つい安易にビットコインをロングだショートだとやってしまいますが、チャンスの多い暗号通貨業界でも ここぞという場面に出くわすことはそこまで多くないです。
本当は分が良くない賭けなのに、自分の中で何かの理屈を付けて安易なポジションを取るということはやってしまいがちなのですが、 ぐっと堪えてチャンスを待つ運用が大切かなと思います。
特に本記事のコードやロジックは特定のケース以外では基本的に爆損するので、よろしくお願いします。
サラリーを貰ってトレードをしている人と違って、我々は常にポジションを取り続ける必要はないという一種の強みを持つわけですから、 それを生かすように心がけたいですね。
基本的には、競合が少ない場所か、人がたくさん集まり資金が大きく集まりつつある場所を狙うべきだと思います。
今回は、HYPEというトークンがリリース(TGE)された直後の活況時のトレードを題材とします。
仮説の提起と分析を楽しむ
負けるにして勝つにしても行動の前に、最初にきちんと仮説がないとやはり長く続けるのは厳しいのかなと思っています。
以下では自分が思いついた仮説とそれに対して使用した簡単な検証フレームワークのコードを紹介します。
分析結果を自動化してbotとして運用する
人間の精神力リソースは有限です。その限りある資源の有効活用のために自動化を行うことは優先順位が高いです。
特に、裁量トレードにおいては余計なことを考えないようにするという点は大切ですね。 チャートとにらめっこする時間が長くなるほど、利確を早まったり、物事を必要以上に悪く予想することになりがちです。 その対策として、裁量トレードの自動化により、チャートを見る時間を大幅に減らすことができます。
自動化にはもうひとつ大事な効用があって、それは収益機会の最大化ができることです。24時間動き続ける暗号通貨市場なので、 起きてPCの前に向かっているときしかトレードできませんということになると殆どの収益機会を逃すことになります。 これは売買立会時が非常に短く、休日にはまったく場が立たない株式市場との大きな違いだと思います。
収益機会の発見の例
ここからは本題として先ほどの4つの課題を具体的なトレードとして実践するアイディアを紹介していきます。
2024年末に、Hyperliquid という取引所が HYPE というトークンをリリースして暗号通貨界隈はお祭り騒ぎになりました。
このHYPEのトレードは一言で言うと、「熱かった」訳ですが、その理由として第一にHyperliquidという取引所が優れていたという点が語られます。
その上で、トレードをするという視点ではもう少し別の理由もあって、
- L1トークンであり、当初 Hyperliquid以外では現物の取引が行われていなかった
- エアドロップ(無料配布)であるので、ユーザによる投げ売りが発生しやすい
- AF(アシスタンスファンド)と呼ばれる公式アカウントの買い支えがあった。
Hyperliquid以外で現物取引が行われていなかったのは、他の暗号通貨取引所では入出金の対応がすぐには出来なかったことに由来します。 簡単に言えば、Hyperliquidの運営がそのようなサポートや営業活動を積極的に行わなかったということになるかと思います。
Hyperliquidという取引所がHYPEというトークンを出したのは、自社の取引所を使ってもらうためのマーケティングの一環ですから、 当然運営は囲い込みをするのが自然であり、現物取引はHyperliquid内に限定されていました。
Hyperliquid以外で現物取引がないということは、物事を単純化します。 価格監視もシンプルになりますし、そもそもどこでbotを運用するか考える必要もなく、 また、ユーザの資金が一か所に集まることになります。 新規の取引所を使う抵抗感という参入障壁から強い競合が集まりにくくなる効果も期待できます。
次に、エアドロップというユーザに無料で配布されたトークンであるという点は 値動きの荒さに繋がり、価格の歪みが発生しやすくなります。 無料で貰ったものは基本的にいくらで売っても構わないという心理が強くなるかと思います。 特に最初期は値付けが全体的に甘くなりやすいです。
とはいえ、エアドロップ通貨をセカンダリで買ってもほとんどの場合は失敗するので、 HYPEほどのチャンスはなかなか来るものでないのでくれぐれもご注意を。
Hyperliquidでは事前に予告なく、公式アカウントが買い支え(バイバック)を始めたこともあり、 底堅い値動きの支えとなった点も大きかったようです。
HYPEの初期の値動きを見ての仮説
さてその上で、HYPEリリース後数日経っての値動きです(1分足のClose)
この値動きを見て、値動きの荒さが利益につながるのではないかという直感を得ました。 値動きの荒さが有る一定のパターンに収まっているように感じたからです。
そこで上下で一定のルールで買い売りを繰り返すだけで大きく利益がでるのでは? という仮説を立てました。
投入するロジックの設計
- 直近M分の分足OHLC価格を取得
- 取得したM個のHigh価格の95パーセンタイルからN%下落したところに指値を置く
- 指値が約定したらP%のところに利確指値を置く
- Q時間以内に利確できなかったら決済
簡単に言えば、 直近高値からN%下落したところに常に指値を置き続ける戦略です。 (低頻度マーケットメイキングと言ってもいいのでしょうか?)
要は急落時にエントリをすることを狙い、 例えば24時間かけて-5%下がった場合にはエントリしないが、 30分で-5%下がった場合は約定させるみたいな感じです。
見ての通りこの戦略には4つしかパラメータがありません。 まあこれでも勝てるときは勝てます。なぜならほとんどの参加者はこれより単純な思考で動いているからです。
プログラムによる解析
さて、では仮説が出来上がったところで、パラメータの設定を適当に考えずに、ちょっとした検証フレームワークで良さそうな設定値を探ってみます。
Pythonというプログラミング言語を用いて、以下のようなノートを用意しました。 粗削りな部分が多々あるのですが、当時のノートを完全にそのまま公開します。
まあ粗削りな部分どころか誤字が多数あるのですが、臨場感を楽しんでいただければ幸いです。
以下の二つのノートは同じものです。どちらか好きなリンクを使ってください。
当時このノートは数時間で用意しました。
AIの助けを借りたから素早く出来た………!のではなく、元からそのようなノートを半ば趣味で過去に書いていたからです。 データ取得の部分だけを書き換えればほぼそのまま使えました。備えあれば憂いなしとはまさにこのことです。
(ちなみに内容については、基本的にやりたいことはやれていると思うのですが、全て独学で作ったものなので、もっといいやり方があるよという人は教えてください。)
このノートの細かい部分を修正したものを後に掲載するので、自分で使ってみる人はそちらを使ってください。
以下ではノート中身を簡単に解説していきます。
解析の目的
この解析の目的は、M、N、P、Qのパラメータの最適値を探すことです。 たった4つなので総当たりで解析を回しています。
そんなのカーブフィッティングじゃないか!という批判はまさにその通りで、 直近で一番良かったパラメータを探しているだけです。再現性も何もあったものではありません。 まあ鉄火場に飛び込むというのはそういうことだと思います。 正確さより早さが大事です。
テストデータと学習データを分けるとかそういうこともしていませんので、ごく初心者向けの題材としては良いのではないかと思い紹介します。
4段ネストのforループをぶん回しています。実行時間は20分から30分くらいなので大したことはありません。
- rolling_size が M
- dip_buy が (1-N)
- dip_sell が (1+P)
- position_duration が Q
です。
価格の取得
まずは直近のHYPEの値動きを取得します。
Noteの中から直接Hyperliquidという取引所のAPIを呼んで、ロウソク足のデータをダウンロードします。
このような新規の市場が立った場合、きちんと価格を取得できるだけでちょっとしたエッジになることもあるようです。 要はトークンがリリースされた直後なので、HyperliquidのAPIを使わないと正確な価格が取得できないわけですが、 ほとんどの人はそんな面倒なことはやりたくないわけです。
例えば、初期のUniswapでも似たような例はあって、DEXというものを みたことも使ったこともないような人ばかりの中で、 きちんと価格が取得できればそれだけでかなりの優位性がありました。
このノートは実行するたびに毎回Hyperliquidから最新の1分前までの1分足のデータを自動で取得するようになっています。 (そのようなことが気軽にできるのもHyperliquidという取引所がAPIを気前良く整備しているからなので、 実にありがたいことです。)
ちなみにこのノートは先物ではなく現物市場のHYPEのデータを取得しています。 当初は現物市場の方が出来高が大きかったからです。
24時間分のデータに分けて小分けで何回もAPIを呼び出していますが本当は一括で取得してかまいません。 もしかしたら細かく区間を分けた方がより古いデータを所得出来るのではないかくらいの気持ちでやっています。
最後に rename をしているのは、もともとの Notebook のデータ形式に合わせるためです。
200 minites agoとか書いてあるのは誤字ですね。
データの整形
特に難しいことはないです。
異常値の除外
95%パーセンタイルなどを使って、いわゆる上髭を付けたデータを除外します。
これをしないと、異常な上髭を付けた場合に、「高値からM%下落」という条件が満たされてしまい、 即座にエントリを行うことになってしまいます。
たとえば、こんな感じのスパイクが出た場合、シンプルに高値から10%も下落した! という判定を行ってしまうと実用上大変なことになります。
以下のコードの quantile という部分で 95 パーセンタイル等を取得してこのような値を除外するようにしています。
エントリクローズロジックの作成
基本的には、それぞれの時刻でロングの指値のエントリ価格を作って、 Open > entry かつ Low < entry であればロングポジションが約定する という計算をしています。 (ごく極端なケースだとこれでは判定をすり抜ける可能性もあるのですが、無視します)
実行速度を向上させるためにクローズの計算をラフにしているのでクローズの計算がずれることがよくあります。 のちのバージョンではこの部分は修正しました(実行速度は落ちました)。
(「VERY IMPORTANT」と書いてある部分がなぜ重要だったのかは忘れました。)
損益計算の実行
OHLCデータを順にたどって行って、エントリを記録、クローズを記録、タイムアウトが発生した場合はその処置などを行っています。 単純ですがただコードがひたすら長いです。
損益順にパラメータをリスト
総当たりでパラメータを試した結果を省略せずリストしてしまったので恐ろしく長いテーブルになってしまっています。 見づらくてすいません。
ひとつパラメータを選んで確認
ひとつパラメータを選んで、より詳しく確認しています。 この場合選んだパラメータは、
- 直近30分の高値から3.5%下落した場合にエントリ(0.965の部分)
- エントリから2.5%上昇したところで利確((1.025の部分)
- 2時間以内に利確できなかったらクローズということになります
実際に色々試してみると、値幅を追うよりも案外このように細かく利確して積み上げていく方が良さそうだと分かりました。 2.5%の値幅が一日で10回取れたりするので、コツコツ複利で積み上げていくと相当なリターンになります。
エントリクローズの視覚化
ここが一番気を使っているところで、最終的に選んだパラメータによるエントリ&クローズをきちんと視覚的に確認して、 おかしな部分がないことを検証しています。
実際の運用
そんな感じで、シンプルなロジックでも思った以上に利益が出そうだったのでバーチャルトレードをしてみました。
一番初期のバーチャル損益はこんな感じだったようです。
動画での動作の紹介
バーチャルトレードの様子を動画にもしてみました。この時はかなりうまく行っていて、 32時間程度の動作でレバレッジなしで+33%ほどというバーチャルシミュレーション結果になったようです。 最初に掲載した動画と同じものになります。人間がこういうことを手動でやるのはちょっと難しいものがありますよね。
パラメータの例
毎日パラメータを変更していましたが、中期のパラメータのひとつはこのようなものだったようです。 直近100分から4.5%下落した場所に指値をするというものになっています。
最終的な結果と反省
毎日パラメータを調整しながらシミュレーションして、最終的に、+400%ほどのバーチャル損益を記録したのちに大きくドローダウンしました。 所詮はバーチャルトレードですが、なかなか良い記録が出せたことに満足しました。 途中でパラメータ設定で何度も迷走したりしていますので、もうちょっと市場に寄り添えればなというところでした。
大きくドローダウンするまでは動かし続けると決めていたのですが、最後にレバレッジを上げすぎた(2.5倍くらいだったか?) のが反省でした。熱狂の高まりとともにレバレッジを調整するなど対策が必要でした。 最初はレバレッジを大きくして徐々に下げていく方が良かったように思われます。
単にロングポジションを持っていればいいのでは?
ここは難しい問題で、ロングポジションを持っているだけで利益は出ました実際。 なので、 この戦略にαがあるのかどうかは微妙なところでもあるんですよね。 HYPEというトークンをただロングしている以上のαを出せているのかというのは真剣に考える必要があります。
このロジックでエントリを繰り返す場合の良さは以下のようなものになると思います。
- リスクを限定できる
- ポジション保持時間を短くすることによる心理的ストレス削減
- 金利支払いを減らすことができる
- バックテストでは直近利益が出ているという心理効果
- 本当にパラメータがハマればロングを持つだけより大きく利益が出る
- 出来高を稼げる
とはいえ、このロジックでは一気に価格が上昇するような局面だと全くエントリーができないということも発生しますので、 戦場選びとパラメータの設定がカギとなるかと思います。
二度目の収益機会の到来
実はこのbot、もう一度テストするチャンスを得ました。また別の熱いエアドロ通貨のトレードが始まったからです。 これだけで、玄人の方ならすぐにピンと来たかもしれません。答えは ASTER です。
Hyperliquid と同じ Perp DEX のエアドロトークンであり、一時大きな盛り上がりを見せました。
私は Aster の情報が出回って来てから即座に bot をテストしてみました。 同じような状況では同じような収益機会が再現される可能性が高いと判断したからです。
本来は、botを Aster という取引所に対応させてテストするべきなのですが、
面倒臭かったので時間との勝負と考え、Hyperliquidでのバーチャルトレードテストを試みました。
パラメータ調整は、HYPE初期の値動きを参考に決め打ちしたような気がします。
結果
その結果がこちらです。今回はHYPEの反省を生かして深追いせず良いところで抜けることができました。 今回は大きく調整が入った後は、あえて決済指値を遠くに置いて値幅を追うような運用もしています。
バーチャルトレードなので気楽に運用できたことが勝因だったかもしれません。
コードの紹介
さて、では実際にHyperliquidでトレードできるコードも用意してみようということで、こちらにコードもご用意させて頂きました。
github.com/shidokamo/starter-trader
このコードを1分間隔で呼び出すなど、定期的に実行すれば、先ほどの戦略に沿った運用ができるかと思います。
実用上は、Google Cloud Functions V2 にデプロイして、Cloud Scheduler (cron) から1分ごとに呼び出して使えば、 Googleの最強インフラの上でサーバレスで運用できます。(そのようなコンテナ運用のために設定パラメータは環境変数から取るようになっています。)
このコードは改変、再配布などは自由にして構いませんが、何らかの損害を被った場合の責任は負いません。 わたしはバーチャルトレードしかしていないので、このコードがちゃんと動くかどうかは定かではないのでご注意ください。
またこのbotが実際に生かせる場面は少ないと思いますので、Hyperliquidでの注文の出し方などの部分だけを基本的には参考にしていただけると良いかと思います。
実装時に意識したこと
とにかくシンプルに作ることを意識してみました。その理由は
- 一分でも早く投入するため
- バグが入る確率を下げるため
- バグがないことを目視で素早く検証するため
- 動かしながら改良できるようにするため
- メンテナンスコストを下げるため
- 水平展開を容易にするため
鉄火場ではスピードが命なのでだらだら時間をかけていられませんが、バグがあれば資産が吹き飛びます。 そのために自分で目で追ってバグがないことを確信できるくらいシンプルにしています。
こういった短期勝負での戦略としては、「シンプルなものを出来るだけ早く仕上げる(8時間以内が目標)→少額でテスト→実戦投入→動かしながら改良」という形が良いのではないでしょうか?
特に鉄火場で動かしながらバグを潰したり、改良するためにはシンプルに出来ていないと怖くて触れないと思います。
動作上の注意
- アカウントの残高全てを証拠金として使い続けます(複利で回し続けます)。
- 指定のレバレッジ分の注文を出します。
- 入出金などで証拠金の量に変更があった場合は、注文をキャンセルして反映させます。
- 設定レバレッジを下げる、もしくは証拠金を減らすことによりリスクをコントロールしてください。
- 設定変更があった場合は、注文をキャンセルして反映させます。
- 売り、買いの指値共に、指定の値幅の中でランダムに注文を分割します。(当然ノートでのシミュレーションとずれが発生します。)
- 最後に約定した買い注文の時刻をHyperliquidから取得してポジションのタイムアウトを計算します。
- 指定のレバレッジに対して余力がある場合、買い注文を必ず出します。
- つまり売り注文が部分約定して余力がでた場合、即座にその分の買い注文も発生します。
- これにより以下のような動作が発生する場合があります。
- 売り注文が部分約定→発生した注文余力で買い注文を出す→そのまま売り注文が全て約定できず値下がり→買い注文が約定→この場合、タイムアウトが延長され最後の買い注文からタイムアウトが計算される
- HyperliquidからのAPIの応答が正しいことに依存しているため、APIに問題が発生したら損失が発生する可能性があります。
- 売り注文のタイムアウト時の動作があまりよくないので、適宜変更してください(雑に成行注文が出ます)
大まかな処理の流れ
- 設定取得
- マーケット情報取得
- 現在のポジションを所得
- 直近のローソク足を取得
- 直近N時間の高値取得して、買い注文を入れる値段を計算
- Ask/Bid を取得
- オープンオーダーを取得
- 直近の注文の約定を取得
- 買い注文を管理、買い注文の更新が必要なら更新。
- 直近に買い注文が約定した場合更新はしない。一定時間後に全てキャンセル
- 売り注文を管理、タイムアウトした場合は Ask 付近に注文を出す。
改良版のNotebook
先ほどの Jupyter Notebook を改良した最新版を以下に置いておくので良ければご活用ください。
実用上は、エントリが含み損になっている区間がどれくらいあるのかが心理的に大事になるので、 そのような情報を以下のようにまとめたりしています。 例えばこれを見ると、-5%の含み損になっている時間が全区間の8%ほどあるなどということが分かります。 これはかなりリスクが高いパラメータかもしれません。
Google Colab で実行できるノート
さらにGoogle Colab で実行できるノートも用意してみたので、オンライン上で実行してみたい人は使ってみてください。 詳しくは知らないのですが、コピーすれば自分のアカウントでクラウドで実行できるらしいです。
仮想通貨botter Advent Calendar に寄稿しています
この記事は毎年恒例の仮想通貨botter Advent Calendarの1日目に寄稿しています。 とりまとめは @hohetoさんです。いつもありがとうございます!
アドベントカレンダー2日目になる明日は、@qash_NFTさんの記事です!
