Hyperliquid APIでTWAPとVWAPを実行する方法
大きな注文をそのまま成行で出すと、価格への影響(market impact)が大きくなりやすくなります。買い注文であれば、自分の注文によって価格を押し上げてしまい、平均約定価格が想定より高くなることがあります。こうした問題に対応するため、機関投資家の取引ではさまざまな執行アルゴリズムが使われてきました。その代表例が、TWAP(時間加重平均価格)とVWAP(出来高加重平均価格)です。
HyperliquidはオープンなAPIを提供しているため、個人開発者でもオンチェーンの無期限先物市場でTWAPやVWAPに近い執行ロジックを実装できます。本記事では、両者の考え方、実装の基本、使い分けを順に解説します。コードを書かずに取引したい一般ユーザーには、OneKey Perpsを使うことで、より手軽にオンチェーン無期限先物へアクセスできます。
TWAPとは
TWAPの基本的な考え方は、大きな注文を時間で均等に分割し、一定間隔ごとに小さな注文を出すことです。これにより、最終的な平均約定価格を、その期間の時間加重平均価格に近づけることを目指します。
たとえば、1時間で100万ドル相当のBTC無期限先物を買いたい場合、TWAPでは60回に分け、1分ごとに約1.67万ドル分の注文を出す、といった設計が考えられます。価格が上下しても、約定価格はその1時間の時間平均に近づきやすくなり、一度に大きな注文を出す場合の価格インパクトを抑えやすくなります。
TWAPの利点は、実装が比較的シンプルで、リアルタイムの出来高データに大きく依存しないことです。一方で、相場の流動性が高い時間帯と低い時間帯を区別しません。そのため、流動性が薄い時間帯にも機械的に注文を出してしまい、スリッページが大きくなる可能性があります。
VWAPとは
VWAPは、時間だけでなく出来高も考慮する執行方法です。アルゴリズムは過去またはリアルタイムの出来高分布をもとに、出来高が多い時間帯には多めに、出来高が少ない時間帯には少なめに注文を出します。目的は、最終的な平均約定価格を市場の出来高加重平均価格に近づけることです。
VWAPではリアルタイムまたは過去の出来高データが必要になるため、実装難度はTWAPより高くなります。ただし、流動性の分布に偏りがある市場では、TWAPより執行コストを抑えやすい場合があります。
なぜオンチェーン市場で重要なのか
オンチェーン無期限先物市場では、時間帯によって流動性の厚みや価格発見の効率が変わります。また、オンチェーンのマッチングエンジンや決済設計の特性により、大口注文が板に与える影響は中央集権型取引所とはやや異なる場合があります。
Hyperliquidの公式ドキュメントで板の深さ、手数料体系、API仕様を確認しておくと、TWAPやVWAPのパラメータを設定する際の参考になります。
TWAPとVWAPの比較
Hyperliquid REST APIでTWAPを実装する
基本的な考え方
Hyperliquidの注文APIを使い、分割した子注文を一定間隔で送信します。以下は概念を示すサンプルです。
import time
import math
def execute_twap(exchange, info, coin, total_size, is_buy, duration_seconds, num_slices):
"""
duration_seconds秒の間に、total_sizeをnum_slices回に分けて執行する。
"""
slice_size = total_size / num_slices
interval = duration_seconds / num_slices
for i in range(num_slices):
# 現在のマーク価格を取得
ctx = info.meta_and_asset_ctxs()
mark_px = get_mark_price(ctx, coin)
# 一定のスリッページを許容した成行注文
# 必要に応じて、板に近い指値注文へ変更できる
result = exchange.market_open(
coin=coin,
is_buy=is_buy,
sz=round(slice_size, 4),
slippage=0.005 # 0.5%の許容スリッページ
)
print(f"[{i + 1}/{num_slices}] 約定結果: {result}")
if i < num_slices - 1:
time.sleep(interval)
print("TWAPの実行が完了しました")
本番環境で使う場合は、少なくとも以下のような処理を追加する必要があります。
- APIエラーや通信障害時のリトライ
- 部分約定の処理
- 未約定注文の管理
- 極端な価格変動時に執行を一時停止する保護ロジック
- ログ記録と事後分析用のデータ保存
改良例:指値注文でコストを抑える
各子注文を成行ではなく指値で出すと、板状況によっては手数料やスリッページを抑えられる場合があります。ただし、指値注文には約定しないリスクがあります。そのため、一定時間内に約定しなければキャンセルし、必要に応じて成行で補う設計が考えられます。
def place_with_timeout(exchange, coin, is_buy, sz, limit_px, timeout_seconds=30):
result = exchange.order(
coin=coin,
is_buy=is_buy,
sz=sz,
limit_px=limit_px,
order_type={"limit": {"tif": "Gtc"}}
)
oid = result["response"]["data"]["statuses"][0]["resting"]["oid"]
time.sleep(timeout_seconds)
# 注文がまだ板に残っているか確認
open_orders = get_open_orders(coin)
if any(o["oid"] == oid for o in open_orders):
exchange.cancel(coin=coin, oid=oid)
# 残数量を成行で補う
exchange.market_open(
coin=coin,
is_buy=is_buy,
sz=get_remaining_size(oid),
slippage=0.01
)
実際には、約定済み数量、残数量、キャンセル失敗時の処理、再送時の重複注文防止なども考慮する必要があります。
WebSocketの約定データでリアルタイムVWAPを計算する
VWAPを計算するには、約定価格と出来高をリアルタイムに集計します。
class VWAPTracker:
def __init__(self):
self.cumulative_pv = 0.0 # price * volume の累計
self.cumulative_v = 0.0 # volume の累計
def on_trade(self, price, size):
self.cumulative_pv += price * size
self.cumulative_v += size
@property
def vwap(self):
if self.cumulative_v == 0:
return None
return self.cumulative_pv / self.cumulative_v
HyperliquidのWebSocketで約定データを購読し、各約定ごとにon_tradeを呼び出すことで、リアルタイムのVWAPを更新できます。VWAP執行ロジックでは、このVWAPと現在価格、板の厚み、残りの執行時間、残り数量などを比較しながら、次の子注文の数量とタイミングを決めます。WebSocketの購読形式やレスポンス仕様は、Hyperliquidの公式ドキュメントで確認してください。
パラメータ設定の考え方
TWAPやVWAPの成否は、アルゴリズムそのものだけでなく、パラメータ設定にも大きく左右されます。
最初は小さな数量でテストし、実際の約定価格、スリッページ、約定率、失敗パターンを記録することが重要です。
他のDEX執行アルゴリズムとの違い
- dYdXもREST APIによる注文に対応しており、TWAPに近いロジックを実装できます。
- GMXは価格オラクルを使う設計のため、板ベースの取引所とは執行アルゴリズムの考え方がやや異なります。
- Hyperliquidはオーダーブック型の設計が中央集権型取引所に近く、TWAPやVWAPの実装経験を比較的そのまま応用しやすい特徴があります。
ただし、どの市場でも流動性、手数料、API制限、約定仕様、清算リスクを確認したうえで設計する必要があります。
コードを書きたくない場合はOneKey Perpsを使う
すべてのユーザーが自分で執行アルゴリズムを実装する必要はありません。OneKey Perpsは、オンチェーン無期限先物を直感的に取引できるインターフェースを提供し、OneKeyハードウェアウォレットによる安全な署名フローと組み合わせて利用できます。
中規模の取引であれば、OneKey Perps上で板や価格を確認しながら、指値注文を適切に設定し、複数回に分けて手動で執行するだけでも、価格インパクトを抑える効果が期待できます。開発やAPI管理に時間をかけたくない場合は、まずOneKeyをダウンロードし、OneKey Perpsで少額から操作感とリスクを確認してみるのが現実的な始め方です。
よくある質問
Q1:HyperliquidではTWAPとVWAPのどちらが向いていますか?
多くの個人開発者にとっては、TWAPのほうが始めやすく、実装の安定性も高いです。VWAPはオンチェーン市場の出来高分布に一定の規則性がある場合に有効ですが、過去データの分析やリアルタイムデータ処理が必要になります。まずTWAPを理解し、データを蓄積してからVWAPに進むのが無難です。
Q2:執行アルゴリズムを使えば市場インパクトを完全になくせますか?
完全にはなくせません。市場インパクトの下限は、注文サイズと市場流動性の比率によって決まります。アルゴリズムの役割は、インパクトを時間的に分散し、流動性があるタイミングに寄せることで、コストを抑えることです。
Q3:執行結果はどう評価すればよいですか?
一般的には、実際の平均約定価格と、執行期間中のTWAPまたはVWAPベンチマークとの差を見ます。これはImplementation Shortfallとして評価されることがあります。各子注文の価格、数量、時刻、手数料を記録し、執行後に分析することをおすすめします。
Q4:OneKeyハードウェアウォレットはアルゴリズム執行スクリプトと連携できますか?
可能です。OneKeyは標準的なEthereum署名インターフェースに対応しています。アルゴリズムスクリプトからローカル署名サービスを通じて署名対象メッセージをハードウェアウォレットへ送り、署名後にHyperliquidへ送信する構成が考えられます。TWAPのような低頻度の執行では、署名遅延は多くの場合大きな問題になりにくいです。
Q5:執行中に相場が大きく動いた場合はどうすべきですか?
価格保護の仕組みを入れることが重要です。たとえば、執行開始時の価格から市場価格が2%など事前に決めた閾値を超えて乖離した場合、自動的に執行を一時停止し、相場が落ち着くのを待つ、またはその執行を終了する設計が考えられます。これにより、不利な急変時にポジションを積み増し続けるリスクを抑えられます。
まとめ
TWAPとVWAPは、大口注文の執行コストを抑えるための代表的な手法です。HyperliquidのオープンAPIにより、これらの考え方はオンチェーン無期限先物市場でも応用できます。コードで自動化する場合でも、手動で分割して注文する場合でも、基本は同じです。時間を分散し、価格インパクトを抑え、平均コストを管理することが重要です。
安全性と使いやすさを重視してオンチェーン無期限先物を始めたい場合は、OneKeyをダウンロードし、OneKey Perpsを使って少額から取引フローを確認してみてください。アルゴリズムを自作しないユーザーにとっても、分割注文や指値注文を意識することは、より慎重な取引につながります。
リスクに関する注意: アルゴリズム執行は、特定の価格での約定を保証するものではありません。市場変動、流動性不足、API障害、通信障害、実装ミスなどにより、実際のコストが想定から大きく乖離する可能性があります。無期限先物取引は高リスクであり、資金の一部または全部を失う可能性があります。本記事は技術的な参考情報であり、投資助言、金融助言、法的助言ではありません。リスクを十分に理解したうえで、ご自身の状況に応じて慎重に判断してください。



