JPYCから始めるBotter入門


はじめに

この記事は仮想通貨Botterアドベントカレンダー21日目です。

あいかわと言います。よろしくお願いします。この記事ではJPYCを利用したBotについて初心者向けに書いています。
”稼ぐ”という事にフォーカスしたつもりです。
私はMLBot系をメインでやっていて,DEX(Defi)系のBotをしっかり触り始めたのは2か月程前からなのでまだまだ未熟な所ばかりです。記事内で気になる点がありましたらご指摘お願いします。

想定読者

この記事では以下のようなBotterを想定しています。

  • Botをまだ作ったことがない

  • Botを作ったことはあるが収益が得られていない

このような方に向けて取っ掛かりやすい方法を書いてみました。コンピュータサイエンスに詳しくない人からすると1つ目のBotを作るのはとてつもないハードルがあるのではないかなと思います。ここで紹介するやり方は私が人生で初めて作ったBotを模したものです。私自身が初めて作ったBotなのでまさに初心者用Botとしてうってつけなのではないかと思います。

紹介するBotについて

紹介するのはJPYCを利用したBotです。紹介するにあたってこのBotがま機能するのか調べましたが、一応まだ使えそうという結論になっています。この手法を公開する事によって誰かの利益を大きく棄損する事はないと思い公開していますが、もしもクレームが入ったら即刻削除します。

Botの性能ですが、資金10万円で始めればC級Botterも視野に入れてもいいかなという感じです。とはいってもスケールはしないので100万円用意しても10万円稼ぐのは難しいと思います(だからこそ紹介できてます)。

あと現存するエッジを書いているので過度な利益志向な記事になる事を避ける為に具体的なソースコードは省かせていただきます。大体の初心者向け記事はBotの作り方に焦点を当てている事が多い印象ですが、結局技術があってもエッジを知らなければ稼ぐことは出来ないです。という訳でこの記事では一番簡単そうなエッジを紹介してみようという趣旨になります。エッジさえ持っていればそれをBotに落とし込むための技術記事はたくさんあるはずです。
とはいえ基本的にはコントラクトのイベントを取得する事とコントラクトを実行する事が出来れば再現実装は可能だと思うで是非挑戦してみてください。chatGPTに聞けば書けるレベルだと思います。

web3.pyを使うなら次のページがイベント取得の参考になると思います。

注意事項

Bot開発は自己責任で行ってください。ここで書かれている話は必ず儲かる話ではありません。損失を被る可能性も十分にある事を理解してください。

JPYC社からの新発表や経済状況などで環境は変化するので常にここに書いてあることが成り立つ訳ではない事に注意してください。もしかしたらここに書いてある事を実装しようとした初心者Botterから金を巻き上げるBotが出現する可能性もあります。

Botterの世界は怖いです。細心の注意を払いましょう。

JPYC

タイトルにもある通りですがこの記事ではJPYCというプロダクトを例にBotでの収益化のポイントをあげていこうと思っています。
仮想通貨に興味がある日本人には有名だと思いますが、日本円のステーブルコインを扱っているプロダクトです。

JPYCトークンはJPYC社にて日本円と交換を行う事ができます。交換に関しては以下の用に設計されています。
ケース①:日本円からJPYCへの変換
1円=1JPYCとしてJPYCを購入可能
ケース②:JPYCから日本円への変換
現金化する事は出来ません。ただし、1円=1JPYCとしてVプリカ(or giftee box)へ交換が可能です。Vプリカはネット決済用のVisaのプリペイドカードです。また、現金化ができないのは日本の法律上の問題のようです。

当然JPYCはERC20トークンでありDEXにて取引可能です。人気な所はAstarネットワークのArthswapやPolygonのUniswapV3/Quickswapとかでしょうか。どこのDEXでどの程度取引されているかも見てみると面白いと思います。

利益源の考察

さてここからJPYCの収益源について考察してみます。
JPYCでの最大のポイントは”JPYCから日本円に現金化できない”事でしょう。これがどの程度の影響があるのかを考えてみます。細かいことは考えないとして等価に日本円とJPYCを交換できるのであるならば、理論上価値は一致するはずです(1JPYC=1円)。ただし現状のJPYCは1円⇒1JPYCを再現する事は可能ですが、1JPYC⇒1円は不完全です(現金× Vプリカ〇)。よって一般的には日本円の方が価値が高い状態になると考えるの妥当でしょう。後述しますが実際の市場でもほぼそのような状態になっています。
一方で”どの程度”日本円の価値と乖離するのが妥当なのかは簡単には求められません。Vプリカ自体はネットショッピングをする場合ほぼ不便なく使えるので日本円と同等に考える事も出来ますし、日常使いの範囲を超える数千万円レベルのJPYCを抱える事に関してはまだ躊躇する人も多いのではないのかと思います。

妥当な価格が分からないという不安定さがあるということはレートがある程度の値幅をもって動く事が予想できます。ただし本当に全くレートが分からないかというとそうではなく、日本円との乖離が進みすぎた場合には乖離を解消する方向に力が働きそうと考えるのが自然そうです。

ここで整理しつつ大まかなトレード方法について考えてみます

前提として日本円とJPYCの価格は”ほぼ”一致するはずです。ただし完全に現金化できない事によって価格は不安定さを持ちます。価格は大きく二つの状態に分かれます。
状態①:JPYC高JPY安 ex.市場レート1JPYC=1.01円
この場合はJPYC社からX 円分のX JPYCに購入し市場にてトレードする事で1.01*X 円を得る事が可能です。これは裁定機会になるのでこういった状況はまれだと考えられます。
状態②:JPYC安JPY高 ex.市場レート1JPYC=0.99円
Y円を市場にて(Y*100/99)JPYCに交換します。ここで得たJPYCを等価に現金化できればこれも裁定機会になるのですが現実としてはVプリカにする事しかできません。これは厳密には裁定機会とは言えず、制限つきの円転だと考えるとこの状況は起こり得そうです。さらに適正価格が分からない事からある程度の値幅をもって動く事が予想されます。
つまり適正価格を推定できるならば適正価格以上に乖離が広がった場合にJPYCと日本円の両建てで乖離を取る事ができそうです。

ただし両建てするのは初心者にとってめんどくさいです。この場合ならFX口座を用意するもしくはDefiでの法定通貨デリバティブ等を使って日本円のトレードをしなくてはいけません。
よって初心者はJPYCの片建てでも良いと思います。もちろん片建てのリスクは知っておく必要があります。乖離が大きいと思ってポジションを持ってもそれはしばらく戻らない可能性があります。その間に日本円自体の価格がJPYCの価格に追いついてしまった場合などは損失を被ります。日本円に対する価格変動リスクを受け入れる必要があるという事ですね。
ただし、JPYCの乖離は極端に大きく出る事があります。こういう場合はすぐに歪みが解消するように動く事がほとんどなので私はこれによる損失を受けたことはほとんどないです。

ここからはおまけですが他の視点も持ってみるといいかもしれません。まず一つにJPYC社が現金化を可能にする世界線もあり得ない話ではなさそうです。その場合上記の片方建てで価格変動リスクによる損失を被る場面だったとしても将来的に現金化できれば結果的にはプラス収益に持っていく事ができます。もちろんJPYC社に対する信用リスクが大きいですし長期投資かつ現物買いのみになるので資金力が必要になります。

さらに考え方を変えれば価格変動リスクを受けて損失を受けたポジションに関してはVプリカにしてネットショッピングすれば実質お得に買い物したことになるので考え方次第ではこれもプラスに変換する事は可能そうです。(ちょっと無理やりですが、笑)

少し脇道に逸れましたが、いずれにせよ多角的に状況を判断できるようにすることは大事だと思います。

実際の市場

実際にJPYCの価格推移を見てみましょう。こちらの不手際でデータが無いところが所々ありますが、また取ってくるのもめんどくさいので許してください。JPYC(polygon:uniswapV3)と日本円(外為オンライン)のレートを取ってきています。DIVは乖離率[%]( JPYC/JPY - 1 )を示しています。

JPYC, JPY, DIV

ここから分かる事として、まずJPYCは予想通りにJPYC安JPY高の状態が通常という事が分かります。乖離率が0%を切る事はかなり稀です。最大で5%まで乖離が広がっている所もあります。
また乖離率は一日の中で1~2%程度の揺らぎがありそうです。実際に取引を行う場合uniswap上では取引手数料が0.3%なので往復で0.6%が取られます。
0.6%の手数料に対して変動率が1~2%あるのであれば十分に利益は狙えそうです。
一方で難しそうな点として挙げるとDIVの予測は少しめんどくさそうです。グラフ前半では平均してDIV1%程度で推移してますが、最近になると徐々に上がっているような状態に見えます。DIVの適正値が分からないとトレードの判断が難しくなるでしょう。

手法まとめ

ここまでをまとめると私が思う初心者おススメのJPYCトレードのススメは

  1. JPYCと日本円の乖離率を監視する(DEXのswapイベント監視&適当に日本円レートを取得)

  2. 乖離率がある閾値を越えたらエントリー

  3. 乖離率が元の水準に戻ってきたらイグジット

というようなシンプルな構成で良さそうです。
ただしこのトレードには閾値(適正価格)とトレード量を決定する必要があります。これらの最適値は簡単には分かりません。ここのアイディアは各自で色々試してほしいです。とりあえず最初は固定した閾値と固定したトークン量をトレードすればいいと思います。もっと効率を伸ばしたいとなったら複雑化させていけばいいと思います。まず完成させることが大事だと思います。

一応私の考えをメモ程度に共有しておきます

  1. 乖離率の移動平均を適正値とする
    先ほども言及したように乖離率は時期によって割と柔軟に変動します。よって固定値だと取りこぼしが多くなったり余計に多くトレードしてしまったりする可能性があるのでそれらに柔軟に対応する為に移動平均を取る事で柔軟に適正価格を対応させようというものです。ただし移動平均の窓パラメータをどうするかであったり諸々で考えないといけない事が多くて正直面倒です。

  2. 乖離率の差分を取る
    大体の場合JPYCの乖離ができる原因は一つのトランザクションがDEXのプールに対して大きすぎるトークン量をトレードした場合に起こる事がほとんどです。つまりほとんどの場合で1txで乖離率は急激に変動するので乖離率の差分を取ればスパイクの存在を確認する事が出来ます。結局やっている事は同じですが"スパイク"を取りに行く手法になります。イグジットはスパイク前の乖離率にしておけば良さそうです。

  3. スパイクに起因したTxの1/n倍のトレード量
    実はトレード量もかなり重要なファクターです。ちょっと賢くやるならばスパイクの原因になったtxのトレード量の1/2や1/3位をトレードすると効率が良かったりするかもしれないです。

  4. プール状態から計算する
    初心者向けではないかもしれないですがuniswapV2型であればgetAmountOuts関数などを用いて自分の理想のトレード量を計算してみるのも良いと思います。


さらなる収益性を求めて

ここまでみて再現実装してもらえた方、そしてここからもっと大きな金額を稼ぎたい方に向けて次にやる事を書いておこうと思います。

まずはっきり言っておく必要があるのはB級を目指したいのであればJPYCを研究してるのは効率が悪いです。これは流動性と出来高の問題です。おそらくJPYCを取り扱っているDEXで現状最もよいのはpolygonチェーンのuniswapV3だと思います。そこですら一回100万円の取引で利益を出せるかと言われると厳しさを感じます。一日に何万回もトレードがあるわけでもないので小さな利益も積み重ねられません。
実際に以下のグラフが週次の出来高と取引数のグラフです。polygonのuniswapV3のデータです。雑ですいません。

出来高 取引数

文字が小さいですが、出来高は週次で多くて700万円くらいでトレード回数でいうと1000回行かない事の方が多いです。
このような環境で大きい利益を積むのは諦めるのが良いと思います。

簡単に収益を上げられるのに鞘が放置されている原因は収益量の上限が低いという事に起因していそうです。何百万も稼げるならこの鞘がここまで放置されている訳がありません。もっと沢山稼ぎたいのであれば別の事をしなくてはいけません。はたまた収益量の上限が低そうな簡単な鞘を沢山見つけるのもいいかもしれませんね。

JPYCのBotはスケールしないですが、すべてのBotに言える事で競合を見て学ぶのは改善が沢山見えてくるのでおススメです。

一つ例を挙げてみます。
振り返りですが、今回のBotはイベントを監視しつつ乖離が出たらトレードするようなBotを想定しています。そしてログを眺めると以下のようなイベントが確認できました。

{'args': AttributeDict({'sender': 'A_address', 'amount0': -9941810208, 'amount1': 1500000000000000000000000, 'sqrtPriceX96': 975881245490287343788842827808604942, 'liquidity': 20086062485097981461, 'tick': 326546}
{'args': AttributeDict({'sender': 'B_address', 'amount0': 94479450, 'amount1': -14326159468052298789027, 'sqrtPriceX96': 975824736889291892018159844458127585, 'liquidity': 20086062485097981461, 'tick': 326545}
{'args': AttributeDict({'sender': 'C_address', 'amount0': 33110599, 'amount1': -5020251708595902479119, 'sqrtPriceX96': 975804934834084394781335145934742387, 'liquidity': 20086062485097981461, 'tick': 326545}
{'args': AttributeDict({'sender': 'D_address', 'amount0': 1578559639, 'amount1': -239106117006807089345017, 'sqrtPriceX96': 974861796361303844434015184582459451, 'liquidity': 20086062485097981461, 'tick': 326525}
{'args': AttributeDict({'sender': 'E_address', 'amount0': 1696715, 'amount1': -256754472255672150598, 'sqrtPriceX96': 974860783610045640960577301230277795, 'liquidity': 20086062485097981461, 'tick': 326525}
{'args': AttributeDict({'sender': 'F_address', 'amount0': 1943765196, 'amount1': -293789366405276555235382, 'sqrtPriceX96': 973701950629027636409104740992965233, 'liquidity': 20086062485097981461, 'tick': 326502}
{'args': AttributeDict({'sender': 'G_address', 'amount0': 414072343, 'amount1': -62494471788266470784258, 'sqrtPriceX96': 973454072105256962241270611829097820, 'liquidity': 19902597857140171386, 'tick': 326496}

これはいつかのPolygon:UniswapV3 JPYC/USDCプールのSwapイベントを取得したものです。(細かい部分は色々省略しています)

7つのイベントを時系列順に載せています。amount0がUSDCの取引量を示しています。一番古いイベントでは9941USDC分のトレードが行われています。この規模の量がスワップされると価格が歪むのでそれに伴って反対売買が続く形になっています。すべてのTxがBotなのかは分からないですが、そういった目的のTxが多いと思われます。
そして重要な点としてこれらのイベントは全て同一ブロックで実行されているという点です。つまり超高速で鞘を解消しに来ている優秀なBot達です。この記事で再現実装した人はここまでの速度は出せないと思います。イベントを確認しながらTxを出してるようではこの人たちには勝てません。まずはこういう人達が存在していてBotの最先端の人達の練度を把握する事が大切です。そしてこの人達のウォレットを追ってみると現環境の最先端や新しいエッジが分かったりします。(このBotの人達は多分JPYCとは直接関係のない所で利益を出してると思います)

すべてのBot作りで言える事ですが競合のBotterを監視する事が個人的にはかなり重要だと思っています。

最近は自分でエッジを開拓するんじゃなくて他人が見つけたエッジにいち早く乗るのか良いんじゃないかと思っています。

おわりに

沢山稼げるわけではないですが、初心者向けBotとしてはかなりおススメできるのではないかと思います。

去年のアドベントカレンダーでも日本円ステーブルに関する記事を作成しているので良ければエッジ探しに活用してください。


余談

Rosさんのアドカレ記事は今の自分には非常に刺さりますね

来月に結婚式と家の購入が同時に来ることになりました。はじめてのローン。都内の土地代は半端ないですね。

人生における重要な場面が今すごい重なっていて、時間が限られています。そんな奴が廃人に勝てる訳はないんだよなぁ。
まぁ自分が選んだ道なので限られた時間を効率的に使うしかないです。効率的にかつ合理的に物事を進めるのは苦手分野ですが、、、
合理的な人って都内に家買わない気がする。結婚もしない気がする。なんならトレードもしない気がする。わからないですが。みなさんの意見をお聞かせください。

ただありがたい事に仕事の時間をほぼフルでBot開発できる状態にしているので今の忙しい時期を乗り越えたら、仮想通貨に割ける時間はかなり多くできそうです。

当面の目標はローン分稼ぐ事ですね。家ドロ狙います。

本業と領域が重なりすぎてアウトプットが自由にできないのですが機会をみつけてアウトプット活動始めたいです。
その時はローン返済noteでも作ろうかなと思います。


この記事が気に入ったらサポートをしてみませんか?