Your Copy Trading Bot Will Break. Here's How to Build One That Doesn't.
By @CoinMarketMan - 08-Jul-2026
あなたのコピートレードボットは必ず壊れる。壊れないものの作り方。
Hyperliquid上でコピートレードボットを構築するのは、半日あれば十分だ。ポーリングループはPythonで50行程度: ウォレットのポジションを取得し、ローカルの状態と比較し、差分をミラーリングする。GitHubにあるオープンソース実装のほぼすべてが同じパターンに従っており、テストの最初の週はたいてい問題なく動作する。
その後、5つのうちのどれかが起きる。リードウォレットがポーリング間隔の間にポジションをクローズし、あなたは古いトレードを抱えたまま清算カスケードに巻き込まれる。コピーしているウォレットが別の取引所でヘッジしており、方向性のあるベットに見えるものが実は中立ポジションの片脚に過ぎない。あるいはそのウォレットのレバレッジは$3Mのアカウントには理にかなっているが、ボットがサイズ調整をせずに方向だけコピーするため、$10Kのアカウントではマージンコールを引き起こす。
ポーリングループは難しい部分ではない。その周りのリスクレイヤーこそが何ヶ月もかかる部分であり、ほとんどのチュートリアルが完全にスキップしている部分だ。
このガイドでは、構造的な障害モードに対処するコピートレードボットの4層アーキテクチャを解説する。HyperliquidのオンチェーンインフラとHyperTrackerのコホートインテリジェンスAPIの具体的なコードも含む。基本的なループをすでに構築してプロダクション環境で失敗を経験したなら、これが欠けていたレイヤーだ。
なぜHyperliquidはコピートレードに最適な場所なのか
コピートレードには透明なポジションデータが必要だ。中央集権型取引所では、取引所がそれを機能として構築し、「リードトレーダー」を厳選し、独自システムを通じてポジションへのアクセスを提供する場合にのみコピートレードが可能になる。Hyperliquidでは、すべてのポジションがデフォルトでオンチェーンかつクエリ可能だ。どのウォレットが何をしているかを確認するために取引所の許可は必要ない。
Hyperliquidの完全オンチェーン中央指値注文板は、毎秒約200,000件の注文を処理する。 すべての約定、キャンセル、ポジション変化は検証可能なチェーンイベントだ。コピートレードの観点から言えば、これは2つのことを意味する: 取引所からAPIキーを取得することなく任意のウォレットのポジションをポーリングでき、ボットの実行がオフチェーンマッチングエンジンを信頼するのではなくオンチェーンで実際に起きたことを検証できる。
Hyperliquidの最小注文サイズは$10の想定元本だ。 これは重要で、小さなアカウントで比例サイジングをするとこの下限を下回るトレードサイズが生まれることがある。ボットはこれをうまく処理する必要がある: そのトレードをスキップしてログに記録し、次に進む。
4層アーキテクチャ
本番環境で生き残るコピートレードボットには、4つの明確なレイヤーがある。それぞれが独立して失敗する可能性があるため、それぞれに独自のエラーハンドリングとロギングが必要だ。
レイヤー1: ウォレット探索
コピートレードシステムの品質は、ウォレット選択にすべてかかっている。悪いウォレットをミラーリングする完璧な実行エンジンは、完璧な忠実度でお金を失う。探索レイヤーは、Hyperliquidのエコシステム全体をフォローする価値のある少数のウォレットに絞り込む。
リーダーボードから始める。HyperTrackerの/leaderboards/perp-pnlエンドポイントは、全期間、月間、週間、日次の時間軸でウォレットを累積Perp PnLでランキングする。全期間PnLは複数の市場レジームにわたるパフォーマンスを捉えるため最も信頼できるフィルターであり、持続的なエッジと運良く当たった一週間を区別する。
次にコホートでフィルタリングする。HyperTrackerはHyperliquid上のすべてのウォレットを16の行動コホートに分類する: アカウントサイズ別8つ(Shrimp からLeviathan)と全期間PnL別8つ(Giga-Rekt からMoney Printer)。コピートレードでは、Money Printer コホート(全期間PnL $1M超、セグメントID 8)とSmart Moneyコホート($100K〜$1M、セグメントID 9)が、持続的な収益性が運ではなく真の取引スキルを反映している可能性が最も高い2つのセグメントだ。
import requests
API_BASE = "https://ht-api.coinmarketman.com/api/external"
headers = {"Authorization": "Bearer YOUR_JWT_TOKEN"}
# Smart Money wallets with open positions, sorted by PnL
response = requests.get(
f"{API_BASE}/wallets",
headers=headers,
params={
"segmentIds": 9,
"hasOpenPositions": True,
"orderBy": "perpPnl",
"order": "desc",
"limit": 20,
},
)
candidates = response.json()
候補を取得した後、活動頻度を確認する。月に1回しかトレードしないウォレットは有用なシグナルを生成するには少なすぎる。毎日数十のポジションを開くウォレットはノイズが多すぎ、実行コストがエッジを食いつぶす。コピートレードに有用な範囲は、週に数回ポジションを取り、明確なエントリーと定義されたホールド期間を持つウォレットだ。
レイヤー2: ポジションモニタリング
モニタリングレイヤーは、各ターゲットウォレットのポジションを定期的にポーリングして変化を検出する。非HFTコピートレードの標準的なサイクルは5分だ。より速いポーリングはエントリーを早く捉えるがAPIコストが増加し、まだ決済されていない部分約定からのノイズが増える。遅いポーリングは短命なポジションを見逃し、エグジットタイミングのズレが大きくなる。
差分エンジンはこのレイヤーのコアだ。各ポーリングサイクルで、リモートウォレットの現在のポジションをローカルスナップショットと比較し、イベントのセットを生成する: OPEN(新しいポジションが出現)、INCREASE(既存ポジションが拡大)、REDUCE(既存ポジションが縮小)、CLOSE(ポジション消滅)。各イベントタイプは実行レイヤーで異なる処理が必要だ。
def diff_positions(local_state, remote_positions):
events = []
remote_map = {p["coin"]: p for p in remote_positions}
local_map = {p["coin"]: p for p in local_state}
for coin, pos in remote_map.items():
if coin not in local_map:
events.append({"type": "OPEN", "coin": coin, "position": pos})
elif abs(float(pos["szi"]) - float(local_map[coin]["szi"])) > 0.001:
if abs(float(pos["szi"])) > abs(float(local_map[coin]["szi"])):
events.append({"type": "INCREASE", "coin": coin, "position": pos})
else:
events.append({"type": "REDUCE", "coin": coin, "position": pos})
for coin in local_map:
if coin not in remote_map:
events.append({"type": "CLOSE", "coin": coin, "position": local_map[coin]})
return events
レイヤー3: リスクゲート
これがほとんどのチュートリアルがスキップするレイヤーであり、ボットが本番環境で生き残れるかどうかを決定するレイヤーだ。リスクゲートはモニタリングレイヤーと実行レイヤーの間に位置し、トレードシグナルを受け取り、それを承認、修正、または完全に拒否する。
比例サイジング。 コピートレードで最もよくある失敗はサイズのミスマッチだ。リードウォレットが$3Mのエクイティを持ち、$300Kのポジションを開いたとする。それは彼らにとって計算されたアロケーションだ。ボットが$10Kのアカウントで同じドル額をミラーリングすると、1つのトレードで30倍のレバレッジになる。比例サイジングはポジションをあなたのアカウントのエクイティ比率にスケールする:
def calculate_copy_size(lead_size, lead_equity, my_equity):
ratio = my_equity / lead_equity
scaled = lead_size * ratio
# Hyperliquid minimum notional is $10
if scaled * current_price < 10:
return None # Skip: below minimum
return scaled
レバレッジ上限。 比例サイジングをしていても、リードウォレットはあなたのリスク許容度を超えるレバレッジを使用しているかもしれない。ボットはリードウォレットが使用するレバレッジとは独立して、アセットごとのレバレッジ上限を強制する必要がある。シグナルが20倍を要求しても上限が5倍なら、リスクゲートはそれに応じてサイズを縮小するかトレードをスキップする。
エクスポージャー制限。 1つのポジションがアカウント全体を消費してはならない。トレードあたりのエクイティの最大パーセンテージを設定する。リスクゲートがこの制限を超えるシグナルを受け取った場合、縮小するか拒否する。
サーキットブレーカー。 1セッションでアカウントのエクイティが閾値を下回ったら、ボットは新しいポジションを開くことを停止する必要がある。これは損失の連鎖が清算まで複利で膨らむのを防ぐキルスイッチだ。既存のポジションはクローズしない(一時的なドローダウン中に損失を確定させることになる)。手動でレビューするまで新規エントリーを一時停止するだけだ。
レイヤー4: 実行
実行レイヤーは、承認されたシグナルを公式PythonSDKを使ってHyperliquid上の注文に変換する。キーとなる関数はexchange.order()で、アセット、方向、サイズ、価格、注文タイプを受け取る。
from hyperliquid.exchange import Exchange
from hyperliquid.info import Info
from hyperliquid.utils import constants
info = Info(constants.MAINNET_API_URL, skip_ws=True)
exchange = Exchange(wallet, constants.MAINNET_API_URL)
# Place a market buy order for ETH
result = exchange.order(
coin="ETH",
is_buy=True,
sz=0.5,
px=None, # market order
order_type={"limit": {"tif": "Ioc"}}, # IOC for market-like execution
)
実行後、ボットは約定を検証する必要がある。SDKはresting(注文がオーダーブックに置かれた)またはfilled(平均価格で即時約定)のステータスオブジェクトを返す。コピートレードでは、ほとんどの場合IOC(即時約定か取消)注文が望ましい。ポイントは特定の価格を待つことではなく、リードウォレットのポジションに今合わせることだからだ。
検出から約定までの時間差、リードウォレットのエントリー価格、自分のエントリー価格、スリッページをすべてログに記録する。このログが後でシステムをチューニングするための診断ツールになる。
5つの障害モード(とその対処法)
基本的なポーリングループで構築されたコピートレードボットはすべて、同じ5つの構造的障害に対して脆弱だ。これらはバグではない。アーキテクチャ的な解決策を必要とする設計上の限界だ。
隠れたヘッジ。 リードウォレットがHyperliquidでETHのロングを開き、別の取引所で同サイズのETHショートを建てる。彼らのネットエクスポージャーはゼロだ。あなたのコピーはむき出しのロングだ。ETHが下落すると、彼らは何も失わず、あなたはすべてを失う。ヘッジが別のチェーンや中央集権型取引所に存在するため、オンチェーンデータだけからこれを検出する方法はない。対策はシングルウォレットの代わりにコホートレベルのシグナルを使うことだ。Smart Moneyコホート全体がETHでネットロングにシフトするとき、それは数百のウォレットからのコンセンサスシグナルだ。全員が同時にヘッジしているはずがない。
シグナルの劣化。 ウォレットがコピートレードで人気になるにつれ、より多くのボットが同じシグナルに殺到する。リードウォレットは$3,500でエントリーする。ボットが検出して実行するころには、他のコピートレーダーがすでに買い込んでいるため、価格は$3,512に動いている。このスリッページはトレードのたびに蓄積され、時間とともにエッジを侵食する。エントリー価格とリードウォレットの約定価格を監視する。スリッページが常に閾値を超える場合、そのウォレットはコピーして収益を得るには混みすぎている。
サイズのミスマッチ。 リスクゲートのセクションですでに説明した。比例サイジングと独立したレバレッジ上限が主要な防御だ。
エグジットタイミングのズレ。 リードウォレットがポーリング間隔の間にポジションをクローズする。エグジットシグナルを見逃してしまい、古いポジションを持ち続ける。そのギャップの間にポジションが逆行すれば、リードウォレットが回避した損失をあなたが被る。アクティブなポジションがある場合はポーリング間隔を短くする(コピーしたポジションがライブの間は1分ごと、アイドル時は5分ごとにポーリング)。自分のポジションには独立したトレーリングストップをバックストップとして設定する。
生存バイアス。 リーダーボードは今収益を上げているウォレットを示す。同様の戦略を追って吹き飛んだ何千ものウォレットは示さない。全期間利益$2Mのウォレットは、最終的に平均回帰するであろう積極的なレバレッジで到達したかもしれない。トレード数(最低でも数百回)でフィルタリングし、総PnLに対するドローダウンを確認する。ドローダウンが大きいハイPnLウォレットは、滑らかなエクイティカーブを持つ中程度のPnLウォレットより悪いコピー対象だ。
より安全な代替手段としてのコホートシグナル
シングルウォレットのコピートレードはサンプルサイズが1だ。1つのアドレスが持続的なエッジを持ち、他の場所でヘッジしておらず、ボットが追えるパターンでトレードを続けるという賭けだ。その前提連鎖のどこかが崩れる可能性がある。
コホートレベルのシグナルは、同じ収益性プロフィールを持つ数百のウォレットにわたるポジションを集約する。Money PrinterコホートがBTCでネットロングにシフトしながら、Giga-Rektコホート(全期間PnL -$1M以下、セグメントID 15)が同じアセットでネットショートになっているとき、その乖離は統計的に意味のあるシグナルだ。1つのウォレットは間違っているかもしれないし、ヘッジしているかもしれない。収益性コホート全体が一致して行動するのは、別種の情報だ。
HyperTrackerの/cohort-metricsエンドポイントは、5分ごとに更新されるセグメント別の集約ポジションを提供する。個別ウォレットではなくコホートバイアスを監視するシステムを構築できる。これにより、隠れたヘッジ問題が排除され、シグナルの劣化が軽減され(特定のアドレスへの集中がない)、多様化されたシグナルソースが得られる。
# Fetch Smart Money cohort metrics for BTC
cohort_data = requests.get(
f"{API_BASE}/cohort-metrics",
headers=headers,
params={"coin": "BTC", "segmentId": 9},
).json()
# Check net bias: are Smart Money wallets net long or short?
net_bias = cohort_data.get("netBias")
トレードオフは精度だ。コホートシグナルはスマートマネーが積み上げていることを教えてくれるが、エントリー価格、レバレッジ、正確なタイミングは教えてくれない。コホートシグナルは方向性バイアスに使い、自分のエントリーはテクニカルレベル、指値注文、またはDCAで管理する。
ライブ運用前のドライラン
資金を投入する前に、少なくとも2週間はリアルタイムデータと擬似実行でデプロイする。ドライランはバックテストでは発見できない問題を明らかにする: プロダクション負荷でのAPIレート制限、Hyperliquidが新しいアセットをリストする際の差分エンジンのエッジケース、約定シミュレーション精度。
検出時の価格、擬似約定時の価格(中間価格をプロキシとして使用可能)、実際に実行していた場合の結果とともに、シミュレーションされたすべてのトレードをログに記録する。ドライラン期間中の勝率、平均スリッページ、最大ドローダウンを追跡する。シミュレーション結果がバックテストの前提と合理的な範囲内で一致しない場合、そのギャップは通常実行にある: スリッページ、タイミング、またはバックテストが捉えられなかったポジションサイジングのエッジケースだ。
いくつかのオープンソースHyperliquidコピートレードボットはすぐ使えるドライモードをサポートしている。Pythonベースのボットは通常、注文を送信せずにリアルシグナルを処理する擬似残高トラッカーとしてこれを実装しており、資金リスクなしにウォレット探索からリスクゲート、実行ロジックまでパイプライン全体を検証できる。
コホートインテリジェンスでコピートレードシステムを構築する
HyperTrackerのAPIは、ウォレット探索とシグナルレイヤーを動かすリーダーボードデータ、コホートフィルタリング、集約ポジションメトリクスを提供する。無料ティア(1日100リクエスト)から始め、プロダクションのポーリングサイクルに対応できる準備ができたらPulse($179/月)にスケールアップする。
シグナルよりアーキテクチャの方が重要
ほとんどのコピートレードボットガイドはシグナルに焦点を当てる: どのウォレットをフォローするか、どのトレードをコピーするか。シグナルはシステムの約10%だ。その周りのアーキテクチャが残りの90%だ。リスクゲート、ポジションサイジングロジック、サーキットブレーカー、エグジットタイミングハンドラー、スリッページモニター、ドライランフレームワーク。これらが、ボットが最初のドローダウンを乗り越えるか、火曜日の午後にアカウントを清算するかを決定するコンポーネントだ。
まずリスクレイヤーを構築する。極端な入力でテストする。それからシグナルを上に重ねる。最良のコピートレードボットは、何もしないタイミングを知っているボットだ。