Maker注文を出すだけで手数料をもらいながら、$GRVTポイントを24時間積み上げ続けます。こんな収益構造を持つDEXは、2026年時点でGRVTだけです。

私はD_maker戦略(Maker手数料+エアドロfarm兼用)でGRVTのボットを実運用しています。TGEを前にしたこの時期、ボットで稼ぐ仕組みを完全に解説します。

この記事では、GRVT APIへの接続方法からPythonによるMaker戦略の実装、$GRVTポイント最大化の設定まで、すべての手順を網羅します。

⚠️ 注意
本記事はGRVTボット開発のチュートリアルです。自動売買には元本損失リスクが伴います。GRVTは海外事業者であり、日本の金融規制の対象外です。運用は自己責任で行い、余裕資金の範囲内に留めてください。GRVTの基本的な使い方はGRVT使い方ガイドを先にご参照ください。
📝 この記事でわかること
・GRVTのMaker手数料リベートとエアドロの二重収益構造
・Python + GRVT APIで自動売買ボットを構築する手順
・D_makerパターンによるMaker両建て戦略の実装コード
・$GRVTポイントを最大化するための設定とOI継続のコツ
・リスク管理・遮断器・エラーハンドリングの実装方法

GRVTでボットを動かすメリット:Maker+エアドロの二重収益

Maker手数料リベートの仕組み

ほとんどのDEXはMaker(指値を置く側)からも手数料を取ります。GRVTは逆で、Maker注文が約定するとリベート(報酬)を受け取れます

現行のレート構造(2026年7月時点)では、Maker手数料はマイナス、つまり受け取りになります。仮に0.01%のMakerリベートとして試算すると:

  • 1日の両建て取引量:$100,000(BTC-USD-PERP)
  • Makerリベート:$100,000 × 0.01% = $10/日
  • 月間:$10 × 30 = $300/月(取引量維持の場合)

ボットで24時間板を維持すれば、人が寝ている間も継続的にリベートが積み上がります。これがGRVTボット運用の根幹です。

$GRVTポイント獲得の仕組み

$GRVTエアドロップのポイントは4つの軸で獲得できる:

  • 取引量:Maker/Taker双方のポジション開閉がカウント
  • OI継続時間:ポジションを保有し続けた時間×残高がスコアに影響
  • $GRVT保有量:証拠金として預けた額に比例
  • 紹介コード(SJM0660):紹介者・被紹介者双方にポイント加算

ボットが特に強いのは「OI継続時間」です。人間が手動で運用すると寝る前にポジションをクローズしがちだが、ボットなら24時間ポジションを保持し続けられます。両建てでネットポジションをほぼゼロに保ちながら、OIとしてはロング・ショート両方をカウントさせるのがD_makerパターンの本質です。

11% APY証拠金利回りとの組み合わせ

GRVTではポジションの担保(証拠金)に対して最大11% APYの利回りが発生します。$10,000を証拠金に入れると年間$1,100、つまり月$92が証拠金に置くだけで得られる計算になります。

Makerリベート+$GRVTポイント+証拠金APYの三層構造が、他のDEXにはないGRVT固有の収益設計です。

ZKsyncが可能にするもの

GRVTはZKsync上で動作するハイブリッドDEXです。オフチェーンで注文をマッチングしてCEX並みの速度を実現しつつ、決済はZKsyncのゼロ知識証明でオンチェーンに確定します。つまり「取引速度はCEX、カストディはDEX」という設計です。

ZKsyncのプライバシー機能により、オンチェーン決済でも個々の取引内容が外部から直接閲覧されにくい。APIキーが流出してもGRVT外の資産には触れないため、自動売買のセキュリティ面でも優位性があります。

STEP1: 開発環境の構築とGRVT API認証設定

Python環境の準備

Python 3.10以上を推奨します。必要なライブラリは最小限に絞る:

# 仮想環境の作成と有効化
python -m venv grvt_bot
source grvt_bot/bin/activate   # Windows: grvt_bot\Scripts\activate

# 依存ライブラリのインストール
pip install requests websocket-client eth_account python-dotenv

GRVT APIの認証方法

GRVTのAPI認証はウォレット署名ベースです。CEXのような単純なAPIキー/シークレットとは異なり、秘密鍵で署名したメッセージを使ってセッショントークンを取得します。

認証フローは以下の通り:

  1. GRVT公式でAPIキー(L2エージェント鍵)を発行
  2. 署名でセッショントークンを取得
  3. 以降のAPIコールはトークンをヘッダーに付与
⚠️ 注意:L1鍵は絶対に使いません
GRVTのAPIには「L1鍵(ウォレットのマスター秘密鍵)」と「L2/エージェント鍵」があります。ボットに渡すのはL2鍵のみ。L1鍵を.envに書くと全資産が危険にさらされます。

環境変数設定

# .env ファイル
GRVT_PRIVATE_KEY=0xYOUR_L2_AGENT_PRIVATE_KEY
GRVT_ACCOUNT_ADDRESS=0xYOUR_WALLET_ADDRESS
GRVT_ENV=mainnet   # または testnet
💡 Claude Codeへの指示例

「.envから GRVT_PRIVATE_KEY と GRVT_ACCOUNT_ADDRESS を読み込み、eth_accountで署名してGRVT Mainnet APIのセッショントークンを取得するPythonモジュールを作って。トークンの有効期限を自動で監視して、切れる前に再取得する機能も入れて」

STEP2: GRVT APIへの接続とマーケットデータ取得

接続テストコード

import os
import requests
from dotenv import load_dotenv
from eth_account import Account
from eth_account.messages import encode_defunct
import time

load_dotenv()

BASE_URL = "https://trades.grvt.io"  # Mainnet
# BASE_URL = "https://dev.trades.grvt.io"  # Testnet

def get_session_token():
    # ウォレット署名でセッショントークンを取得
    private_key = os.environ["GRVT_PRIVATE_KEY"]
    account = Account.from_key(private_key)

    timestamp = int(time.time() * 1000)
    message = f"GRVT login:{timestamp}"
    msg = encode_defunct(text=message)
    signed = Account.sign_message(msg, private_key=private_key)

    payload = {
        "wallet": account.address,
        "signature": signed.signature.hex(),
        "timestamp": timestamp
    }

    resp = requests.post(f"{BASE_URL}/auth/login", json=payload, timeout=10)
    resp.raise_for_status()
    return resp.json()["token"]

def get_orderbook(token, instrument="BTC_USDC_Perp"):
    # 板情報を取得
    headers = {"Authorization": f"Bearer {token}"}
    params = {"instrument": instrument, "depth": 5}
    resp = requests.get(
        f"{BASE_URL}/full/v1/book",
        headers=headers,
        params=params,
        timeout=10
    )
    resp.raise_for_status()
    return resp.json()

if __name__ == "__main__":
    token = get_session_token()
    print(f"Token acquired: {token[:20]}...")

    book = get_orderbook(token)
    bids = book["result"]["bids"]
    asks = book["result"]["asks"]

    best_bid = float(bids[0]["price"]) if bids else 0
    best_ask = float(asks[0]["price"]) if asks else 0
    mid_price = (best_bid + best_ask) / 2

    print(f"BTC Mid Price: ${mid_price:,.2f}")
    print(f"Spread: {(best_ask - best_bid) / mid_price * 100:.4f}%")

WebSocket購読サンプル

import websocket
import json

def on_message(ws, message):
    data = json.loads(message)
    if data.get("type") == "trade":
        print(f"Trade: {data['price']} x {data['size']}")

def subscribe_trades(token, instrument="BTC_USDC_Perp"):
    # 取引をリアルタイム購読
    ws_url = "wss://trades.grvt.io/ws"

    def on_open(ws):
        ws.send(json.dumps({"type": "auth", "token": token}))
        ws.send(json.dumps({
            "type": "subscribe",
            "channel": f"trades:{instrument}"
        }))

    ws = websocket.WebSocketApp(
        ws_url,
        on_message=on_message,
        on_open=on_open
    )
    ws.run_forever()
💡 Claude Codeへの指示例

「GRVT APIを使って、BTC-USD-PERPで現在の中値から0.1%上にSell Limit、0.1%下にBuy Limitを出し続けるMakerボットを作って。約定したら即座に反対側に再配置、ポジションが証拠金の50%を超えたら新規注文を止めて」

STEP3: Maker注文戦略の実装(D_makerパターン)

D_makerパターンは「Maker手数料リベートを取りながらOIを維持します」ために設計した戦略です。実運用から得た知見をそのまま反映しています。

スプレッドを使ったMaker両建て

中値(Mid Price)を基準に、上下対称に指値を置きます。スプレッドは板の薄さと必要リベートに応じて調整します。

import requests
import time
import os
from dotenv import load_dotenv

load_dotenv()

BASE_URL = "https://trades.grvt.io"
INSTRUMENT = "BTC_USDC_Perp"
SPREAD_PCT = 0.001   # 0.1% 上下に指値
ORDER_SIZE = 0.001   # BTC建てのサイズ

def place_limit_order(token, side, price, size):
    # Maker指値注文を発行
    headers = {"Authorization": f"Bearer {token}"}
    payload = {
        "instrument": INSTRUMENT,
        "side": side,          # "BUY" or "SELL"
        "type": "LIMIT",
        "price": str(round(price, 2)),
        "size": str(size),
        "time_in_force": "GTC",   # Good Till Cancel
        "post_only": True          # Makerのみ。Takerになったら拒否
    }
    resp = requests.post(
        f"{BASE_URL}/full/v1/order",
        headers=headers,
        json=payload,
        timeout=10
    )
    resp.raise_for_status()
    return resp.json()

def cancel_all_orders(token):
    # 全注文をキャンセル
    headers = {"Authorization": f"Bearer {token}"}
    payload = {"instrument": INSTRUMENT}
    resp = requests.delete(
        f"{BASE_URL}/full/v1/orders",
        headers=headers,
        json=payload,
        timeout=10
    )
    resp.raise_for_status()

def get_position(token):
    # 現在のネットポジション取得
    headers = {"Authorization": f"Bearer {token}"}
    resp = requests.get(
        f"{BASE_URL}/full/v1/positions",
        headers=headers,
        timeout=10
    )
    resp.raise_for_status()
    positions = resp.json().get("result", [])
    for pos in positions:
        if pos["instrument"] == INSTRUMENT:
            return float(pos["size"])
    return 0.0

def run_maker_bot(token):
    # メインループ: 板を張り続けるMakerボット
    print("D_maker Bot 起動 -- GRVT BTC-USDC-Perp")

    while True:
        try:
            book = get_orderbook(token)
            bids = book["result"]["bids"]
            asks = book["result"]["asks"]

            if not bids or not asks:
                print("板が薄い、10秒待機")
                time.sleep(10)
                continue

            best_bid = float(bids[0]["price"])
            best_ask = float(asks[0]["price"])
            mid = (best_bid + best_ask) / 2

            buy_price  = mid * (1 - SPREAD_PCT)
            sell_price = mid * (1 + SPREAD_PCT)

            net_pos = get_position(token)

            cancel_all_orders(token)

            if abs(net_pos) * mid < 5000:   # ポジション制限: $5,000未満なら両側配置
                place_limit_order(token, "BUY",  buy_price,  ORDER_SIZE)
                place_limit_order(token, "SELL", sell_price, ORDER_SIZE)
                print(f"[{time.strftime('%H:%M:%S')}] Mid:{mid:.2f} "
                      f"BUY@{buy_price:.2f} / SELL@{sell_price:.2f} | Net:{net_pos:+.4f}")
            else:
                if net_pos > 0:
                    place_limit_order(token, "SELL", sell_price, ORDER_SIZE)
                    print(f"[{time.strftime('%H:%M:%S')}] 過剰ロング -- Sellのみ配置")
                else:
                    place_limit_order(token, "BUY", buy_price, ORDER_SIZE)
                    print(f"[{time.strftime('%H:%M:%S')}] 過剰ショート -- Buyのみ配置")

            time.sleep(30)  # 30秒ごとに再配置

        except requests.exceptions.RequestException as e:
            print(f"APIエラー: {e}、60秒後リトライ")
            time.sleep(60)
        except Exception as e:
            print(f"予期せぬエラー: {e}、30秒後リトライ")
            time.sleep(30)
✅ D_makerパターンのポイント
post_only: True を必ず指定。Takerになるとリベートが取れないどころか手数料を払います
・30秒ごとの再配置で、板から外れた注文を常に最新の中値にリセット
・ネットポジションが偏ったら片側のみ配置してリバランス誘導

STEP4: $GRVTポイント最大化のための最適化

取引量とOI継続時間を同時に稼ぎます

ポイントの計算式は公式に完全開示されていないが、実運用の経験から以下がわかっている:

  • 取引量:約定した時点でカウント。Maker/Taker双方対象
  • OI継続:保有ポジション×時間。30秒間隔の再配置でも約定さえしていればOIはゼロになりません

スプレッドを0.05〜0.15%の範囲で運用すると、約定頻度とOI維持のバランスが良い。スプレッドを広げすぎると約定しなくなり取引量ポイントが減る。狭すぎるとTakerに飲まれてMakerリベートを損失します。

紹介コードSJM0660でポイントを上積み

GRVTに登録する際、紹介コード SJM0660 を入力すると紹介者(筆者)と被紹介者(あなた)の双方にポイント加算があります。既に登録済みの場合は、ポイントポータル(app.grvt.io/rewards)で友人への紹介リンクを発行できます。

TGE前に積み上げるべき理由

2026年7月時点でGRVTはまだTGE(トークン生成イベント)前です。トークンの価値が確定していないこの段階がポイントの積み増しに最も有利な時期です。TGEが近づくほど新規参入者が増えてポイント単価が希薄化するため、早期に高OIを維持したほうが有利になる可能性が高い。

STEP5: リスク管理と遮断器の実装

最大ドローダウン制限

ボットが暴走してもアカウントが致命傷を受けないよう、遮断器を実装します。

class RiskBreaker:
    # シンプルなリスク遮断器

    def __init__(self, max_daily_loss_usd=100.0):
        self.max_daily_loss = max_daily_loss_usd
        self.daily_realized_pnl = 0.0
        self.trade_count = 0
        self.is_breaker_tripped = False

    def record_trade(self, pnl):
        # 約定時にPnLを記録
        self.daily_realized_pnl += pnl
        self.trade_count += 1

        if self.daily_realized_pnl < -self.max_daily_loss:
            self.is_breaker_tripped = True
            print(f"[RISK] 日次損失上限 ${self.max_daily_loss} を超過 -- ボット停止")

    def can_trade(self):
        return not self.is_breaker_tripped

risk = RiskBreaker(max_daily_loss_usd=200.0)

エラーハンドリングとループ保護

ネットワーク切断やAPIレート制限は必ず発生します。while Trueの中の処理全体をtry/exceptで包み、未捕捉例外でプロセスが落ちないようにします。

def run_with_protection(token_getter, bot_func):
    # プロセス全体を保護するラッパー
    consecutive_errors = 0
    MAX_CONSECUTIVE_ERRORS = 10

    while True:
        try:
            token = token_getter()
            bot_func(token)
            consecutive_errors = 0

        except KeyboardInterrupt:
            print("手動停止")
            break

        except Exception as e:
            consecutive_errors += 1
            print(f"トップレベルエラー ({consecutive_errors}/{MAX_CONSECUTIVE_ERRORS}): {e}")

            if consecutive_errors >= MAX_CONSECUTIVE_ERRORS:
                print("連続エラー上限に達したためプロセス終了")
                break

            # バックオフ待機
            wait = min(60 * consecutive_errors, 600)
            print(f"{wait}秒後に再起動")
            time.sleep(wait)
📝 ZKsync手数料コストについて
GRVTの決済はZKsyncオンチェーンで確定するが、GASコストはGRVTが負担する設計になっており、ユーザーが別途ETH/ZKを準備する必要はない(2026年7月時点)。ただし出金時にはZKsync手数料が発生するため、取引と出金のコストは分けて計算すること。

動作確認とトラブルシューティング

認証エラーの対処

「401 Unauthorized」が返ってくる場合:

  • .envのPRIVATE_KEYが正しいL2エージェント鍵かを確認(L1鍵は使いません)
  • ウォレットアドレスとL2鍵のペアが合致しているか確認
  • トークンの有効期限切れ(取得から一定時間後)→ 再取得ロジックを実装します

注文が通らない場合

「post_only rejection」エラー:指値価格がMid付近すぎてTakerになりそうと判断されています。スプレッドを少し広げる(0.08%→0.12%)。

「Insufficient margin」エラー:証拠金残高不足。GRVTのポートフォリオページで残高を確認します。

ポイントが反映されない場合

app.grvt.io/rewardsのポイントは即時反映ではなく、数時間〜24時間のラグがあります。取引は成立しているのにポイントが動かない場合は1日待ってから確認します。紹介コードの適用漏れは登録後の修正ができないため、新規登録時にSJM0660を入力することを忘れずに。

よくある質問

Q: GRVTのMaker手数料はいくら受け取れますか?
A: 2026年時点のレートはティアによって異なり、Maker手数料はマイナス(受け取り)となっています。公式サイトのFee Scheduleページで最新のレートを確認してください。一般的にDEXのMakerリベートは取引量が増えるほどレートが改善される仕組みです。大まかな目安として、1日$10万の取引量で$5〜$15程度のリベートを想定して設計するのが安全です。
Q: ボットの取引でも$GRVTポイントは獲得できますか?
A: はい、取得できます。GRVTはAPIを通じた自動取引も手動取引と同様にポイントの対象としています。ただし、明らかな「人工的な出来高操作」(自己売買など)はシステムで除外される可能性があります。D_makerパターンのような正常な板提供行為は問題ありません。
Q: Season 2は終わりましたが今からボットを動かす価値はありますか?
A: あります。GRVTのポイントプログラムはシーズン制で継続しており、TGEが確定するまではポイントを積み上げる意味があります。TGEが近いほど競合参加者が増えてポイント単価が下がる傾向があるため、今が積み増しの最終チャンスとも言えます。
Q: GRVTボットとHyperliquidボットはどちらが有利ですか?
A: 目的によって異なります。HyperliquidはMakerリベートが存在しないため、スプレッド収益を取る通常のMMボット向きです。GRVTはMakerリベート+エアドロ+証拠金APYの三重収益があり、TGE前の現時点ではGRVTが期待値で上回る可能性が高いです。私はどちらも並行運用していますが、エアドロ期待値込みではGRVTへの資金配分を増やしています。
Q: どれくらいの資金から始められますか?
A: 実用的なMakerボット運用の目安は$1,000〜$5,000程度です。あまり少額だとポジションサイズが最小ロット以下になって注文が弾かれます。$1,000であれば0.001 BTC(約$100相当/枚)の指値を数枚出す程度の運用が現実的です。初めは小さく始めて、ボットの動作を確認してから増額するのを強くお勧めします。

まとめ:TGE直前の今こそGRVTボット運用を始める理由

✅ この記事のポイント
・GRVTのMaker注文はリベートを受け取れます。ボットで24時間板を維持すれば継続収益になります
・$GRVTポイントは取引量+OI継続時間が軸。ボットはOI維持で人間より圧倒的に有利
・証拠金11% APY+Makerリベート+エアドロの三層構造は他のDEXにない設計
・D_makerパターンはpost_only指定のMaker両建て+ポジション上限管理が核心
・TGEが近づくほど参入者増→ポイント希薄化。今が最もコスパの良い参加タイミング

GRVTのD_maker戦略を組んだのは、「手数料を払いながらボットを動かす」という従来の非効率を逆転させたかったからです。GRVTなら手数料が収益になります。これは設計上のブレークスルーだと思っています。

今から始めればTGEまでの数週間〜数ヶ月でポイントを積める。ボットの初期構築に1〜2時間かければ、あとは自動で回り続けます。この記事のコードをそのまま試すのもいいし、Claude Codeに「このコードを元にGRVT Makerボットを作って」と渡して自分好みに拡張してもいい。

関連記事: