⚠️ 重要な注意事項
本戦略を読んで使用する前に、以下の3点を必ずご確認ください。
1. 戦略にはポジションを取るタイミングを待つ忍耐が必要です
Binanceの契約上場廃止は低頻度のイベントであり、毎日起こるわけではありません。戦略を開始した後、初めてのポジションがトリガーされるまでに数日以上かかる場合があります。運用中はプログラムの大部分が「待機・監視」状態になります。長期間の待機に心理的な準備を整え、短期間で取引が発生しないからといって戦略が機能していないと誤解しないでください。
2. ポジション検出タイミングにはまだ最適化の余地があります
本稿では15秒ごとにfapi/v1/exchangeInfoエンドポイントをポーリングし、deliveryDateフィールドの変化で上場廃止シグナルを識別する方法を採用しています。この方法には実際の取引テストで一定の遅延があり、最速の手法ではありません。読者は自身のニーズに応じて検出方法をさらに最適化できます。例えば、ポーリング間隔を短くする、Binanceのお知らせAPIを並行監視する、WebSocketプッシュを購読する、複数ソースのシグナルをクロス検証するなど、より早いエントリータイミングを目指してください。エントリーが早ければ早いほど、最初の急落による最大の下落幅を獲得できます。
3. 必ずタイムリーに戦略を停止し、利益の後退を防ぐ
実際の取引では、すべての上場廃止銘柄が上場廃止時刻まで一貫して下落するわけではないことが観察されています。一部の銘柄は発表後急落した後、数時間から1日かけて徐々に反発し、価格が発表前の水準に戻ることさえあります。タイムリーに停止しなければ、前期に蓄積された含み益が反発で大きく削られ、利益から損失に転じる可能性があります。
以下のいずれかの条件をアクティブな退出シグナルとして設定することを推奨します。
- 事前設定した利益目標に達したら即座に全ポジションを決済して退出する。
- 価格が発表後の最安値から一定割合(例:20%~30%)反発した場合に強制決済する。
- ポジションのドローダウンがピーク利益の一定割合(例:30%~50%)に達した場合に利益確定保護をトリガーする。
上場廃止の60分前まで受動的に待ってから決済してはいけません。それはセーフティーネットであり、最適な退出タイミングではありません。
はじめに
Binanceの先物市場には、ほとんどの人に見逃されている特別な取引機会があります。先物契約の上場廃止イベントです。
一定期間ごとに、Binanceは流動性が低い、または取引量が減少した無期限先物を上場廃止すると発表します。発表の瞬間、市場は急速に反応します。ロングポジションを持つトレーダーは強制的に決済され、パニック的な売りが続きます。価格は発表後数分以内に急激に下落し、その後長期間のボラティリティの高い下落トレンドに入り、最終的に上場廃止を迎えます。
今回のMLNUSDTを例に取ります。
30分で約3分の1下落し、上場廃止期間全体は通常数日続き、価格は低水準で推移し続けます。このような相場は、ショート戦略にとっては自然な有利な環境です。
しかし、手動でこのような機会を監視して取引するには2つの難点があります。
第一に、情報のタイムリー性が極めて重要です。 発表後最初の5分間が下落幅の最大の窓口であり、このタイミングを逃すと、後からショートを追いかけるリスクが大幅に上昇します。人間の監視では24時間365日のリアルタイム対応は困難です。
第二に、相場は一方的な滝のように下落するわけではありません。 価格下落中には常に反発が発生します。ショートポジションを純粋に保有すればトレンド収益を得られますが、反発中の高頻度な価格差の機会を逃してしまいます。
これらの2つの問題を解決するために、本稿では完全に自動化された戦略を紹介します。プログラムによるBinanceの上場廃止シグナルのリアルタイム監視、発表の瞬間に自動でショートのベースポジションを構築し、同時にダイナミックなショートグリッドを起動、全体的な下落トレンドの中で継続的にボラティリティの価格差を捉え、最終的に上場廃止前に自動でポジションを決済して退出、全プロセスに人間の介入は不要です。
一、なぜこのような相場なのか
戦略の詳細に入る前に、まず上場廃止銘柄の価格変動の特徴を理解する必要があります。これが戦略設計の基盤です。
1.1 上場廃止発表の市場への衝撃
Binanceがある無期限先物の上場廃止を発表すると、市場の第一反応はパニックです。ロングポジションを持つトレーダーは、契約がまもなく消滅することを知り、上場廃止前に決済しなければ強制清算されます。この集中した売りが短期的に強い売り圧力を生み、価格を急激に押し下げます。
同時に、マーケットメーカーは素早くスプレッドを狭めたり流動性を引き揚げたりし、価格変動をさらに激しくします。これが、上場廃止発表後の最初の数分間が、上場廃止期間全体で最大の下落幅となる理由です。
1.2 ボラティリティの高い下落トレンドのパターン
最初の急落の後、価格は一直線に底まで下落するわけではなく、典型的なボラティリティの高い下落トレンドを示します。
このパターン形成には内在的な論理があります。反発のたびに、下落しすぎたと考える短期トレーダーが押し目買いに入りますが、ファンダメンタルズは変わっていない(契約が間もなく消滅する)ため、押し目買いはすぐに含み損を抱え、価格は再び下落します。反発の高さは次第に低くなり、上場廃止前に流動性が完全に枯渇します。
この規則的なボラティリティこそが、グリッド戦略に最も適した相場です。
1.3 2つの収益源
上記の分析に基づき、2つの独立した利益経路を設計できます。
| 収益源 | 対応ツール | 利益を得る条件 |
|---|---|---|
| トレンド下落 | ベースショートポジション | 価格が全体的に下落 |
| ボラティリティの価格差 | ショートグリッド | 価格が一定範囲内で反復変動 |
両者を組み合わせることで、戦略は上場廃止相場で強力な収益力を持ちます。たとえ価格が大幅に反発しても、グリッド部分は継続的に価格差を収穫できます。そして全体的なトレンドが下落している限り、ベースポジションは継続的に利益を生みます。
二、監視の仕組み:上場廃止シグナルをいち早く発見する方法
契約情報の監視に関して、本戦略はより直接的な方法を採用しています。Binanceの契約エンドポイントのデータ変化を直接監視します。
2.1 deliveryDateフィールドの秘密
Binanceのfapi/v1/exchangeInfoエンドポイントは、すべての契約の詳細情報を返します。その中にdeliveryDateというフィールドがあり、契約の受渡し時刻を示します。
無期限先物の場合、このフィールドは通常、遠い将来のタイムスタンプに設定されています。
4133404800000 → 2100年12月31日
これは「永久に期限切れにならない」プレースホルダーです。
重要なのは:Binanceがある無期限先物の上場廃止を決定したとき、発表と同時に該当契約のdeliveryDateを実際の上場廃止時刻のタイムスタンプに変更します。
通常の無期限先物: deliveryDate = 4133404800000(永久に期限切れなし)
上場廃止予定契約: deliveryDate = 1744106400000(2026-04-08 17:00:00)
この変更は即座にエンドポイントデータに反映され、発表ページのレンダリングより速く、構造化もされているため、HTMLの解析は不要です。
2.2 監視コードの実装
15秒ごとにエンドポイントを呼び出し、deliveryDateが実際のタイムスタンプに変わったUSDT無期限先物をフィルタリングします。
python
def fetch_delist_symbols():
body = HttpQuery("https://fapi.binance.com/fapi/v1/exchangeInfo")
data = json.loads(body)
now_ms = get_now_ms()
result = {}
for s in data.get("symbols", []):
if not s["symbol"].endswith("USDT"):
continue
if s.get("contractType") != "PERPETUAL":
continue
dd = s.get("deliveryDate", PERPETUAL_END)
if dd < PERPETUAL_END and dd > now_ms:
result[s["symbol"]] = dd
return result
戻り値の例:
python
{
"HIPPOUSDT": 1744106400000, # 2026-04-08 17:00:00
"OLUSDT": 1744106400000,
"RLSUSDT": 1744106400000,
"PUFFERUSDT":1744106400000,
}
注意: 実際の取引テストでは若干の遅延がありました。より迅速な検証方法を選択することもできます。
三、戦略アーキテクチャ
全体の戦略は2つの並行して実行されるモジュールで構成されています。
新しい契約が発見されると、各契約に対して独立したtaskオブジェクトが作成され、その契約のすべての状態が含まれます。
python
task = {
"symbol": "HIPPO_USDT",
"delist_time_ms": 1744106400000,
"fund_per_task": 250.0, # 割り当て資金
"base_short_qty": 1500000, # ベースポジションの枚数
"range_high": 0.0005287, # グリッド上限
"range_low": 0.0004758, # グリッド下限
"grid_width": 0.0000529, # グリッド幅(固定)
"grids": [...], # 10個のグリッドの状態
"shift_count": 0, # 移動回数
...
}
複数の契約のtaskは互いに独立し、干渉せず、並行して実行されます。
四、資金配分
N個の上場廃止契約が発見された後、アカウントの利用可能在庫を動的に均等に分割します。
各契約への割り当て資金 = 利用可能在庫 × 80% / N
20%を証拠金バッファとして残し、価格の短期的な反発による強制清算を防ぎます。
重要な詳細: 複数の契約を順次初期化する際、各契約の初期化ごとにアカウントの利用可能在庫が減少します(ベースポジションが証拠金を占有)。そのため、ループ開始前にすべての契約の割り当て資金を一括計算することはできません。各初期化の前に、再度クエリを実行する必要があります。
python
for idx, (binance_sym, delist_ms) in enumerate(delist_map.items()):
update_global_account()
remaining_count = total_new - idx
available_now = total_balance - margin_used
fund_per_task = available_now * 0.8 / remaining_count
task = init_task(binance_sym, delist_ms, fund_per_task)
これにより、各コントラクトが適切な資金配分を受けられるようになり、前のコントラクトが証拠金を大量に消費して後続のコントラクトの資金が不足することを防げます。
五、底倉とグリッドの詳細解説
5.1 底倉の空売り
発表が出た直後、初期化時にすぐに成行で空売りを入れ、グリッドを待ちません。
底倉名目ポジション = 割当資金 × 50% × レバレッジ倍率
例:割当資金250USDT、レバレッジ10倍
底倉名目ポジション = 250 × 50% × 10 = 1250U
底倉は全期間保有し、グリッドによる繰り返しの建玉・決済には参加せず、上場廃止前の強制決済時に一緒に決済します。
底倉は戦略全体の中で最も収益が大きい部分です。もし上場廃止銘柄が発表から廃止までに50%下落した場合、底倉はこの50%の空売り収益(レバレッジ倍)を貢献します。
5.2 空売りグリッド設定
現在価格を上限とし、そこから10%下がったところを下限として、均等に10分割します。
例(現在価格 0.0005287、区間幅10%):
上限 = 0.0005287
下限 = 0.0005287 × (1 - 10%) = 0.0004758
グリッド幅 = (0.0005287 - 0.0004758) / 10 = 0.0000053
グリッド9: 空売り@0.0005287 → 買い戻し@0.0005234
グリッド8: 空売り@0.0005234 → 買い戻し@0.0005181
グリッド7: 空売り@0.0005181 → 買い戻し@0.0005128
...
グリッド0: 空売り@0.0004811 → 買い戻し@0.0004758
各グリッドの資金は均等配分で、ロジックはシンプルです。価格が空売り価格まで戻ったら、注文が約定して空売り建玉。価格が買い戻し価格まで下落したら、注文が約定して買い戻し決済。1往復完了後、再び空売り注文を出し、次の反発を待ちます。
5.3 起動時の注文戦略
起動時には、空売り価格が現在価格 以上 のグリッドすべてに注文を出します。
現在価格 0.0005287
グリッド9 空売り価格 = 0.0005287 ≥ 0.0005287 → 注文 ✅
グリッド8 空売り価格 = 0.0005234 < 0.0005287 → skip_below(価格は既に通過)
グリッド7 以下 すべて skip_below
現在価格より高い全グリッドに注文を出す理由は、下落相場でも価格が予想以上の反発を起こす可能性があるためです。すべてのグリッドを事前に設定しておくことで、反発による空売り機会を確実に捉えられます。
六、動的区間移動
これは戦略全体で最も中核となるメカニズムです。価格が初期区間に留まり続けることはなく、グリッドは価格の動きに追随して差益を捉え続ける必要があります。
6.1 下方移動(下限を下回った場合)
価格がグリッド下限を下回った場合、下落幅が現在の区間のカバー範囲を超えたことを意味するため、区間全体を下方に移動させます。
旧区間: 0.0004758 ~ 0.0005287
現在価格: 0.0004500(下限0.0004758を下回った)
新しい区間を計算(移動ステップ5%):
shift_step = 0.0004500 × 5% = 0.0000225
新上限 = 0.0005287 - 0.0000225 = 0.0005062
新下限 = 0.0005062 - 0.0000529 = 0.0004533
新区間: 0.0004533 ~ 0.0005062
6.2 上方移動(上限を超えた場合)
価格がグリッド上限を超えて反発した場合、区間も追随して上方移動します。
旧区間: 0.0004494 ~ 0.0005023
現在価格: 0.0005100(上限0.0005023を超えた)
新区間を上方移動し、現在価格が新区間内に収まるようにする
新区間: 0.0004758 ~ 0.0005287
このメカニズムにより、価格がどのように変動しても、グリッドは常に価格に追随し、価格が区間から外れて全グリッドが空になる状況を防ぎます。
6.3 区間幅は不変
移動のたびに区間の位置のみを変更し、区間幅は変更しません。
python
grid_width = round(range_high - range_low, 8) # 初期化時に固定
# 下方移動時
range_high = fp(task, range_high - shift_step)
range_low = fp(task, range_high - grid_width) # 固定幅で計算
これにより、浮動小数点誤差の累積で区間が狭まったり広がったりする問題を回避します。
6.4 ポジション保護メカニズム
区間移動時には、すべての注文がキャンセルされ、グリッドが再構築されます。しかし、既に空売りが成立し買い戻し待ちのグリッドはどう扱うべきでしょうか。
単純に再構築すると、これらのグリッドのポジションが「行方不明」になります。すなわち、空売りポジションはあるが対応する買い戻し注文がなく、裸ポジションとなり、反発リスクに完全に晒されます。
解決策は次の通りです。移動前に保有中の全グリッドのコントラクト数を記録し、移動後の新区間の最下限グリッドに改めて買い戻し注文を出します。
python
# 移動前に保有ポジションを集計
holding_contracts = sum(
g.get("sell_contracts", 0)
for g in task["grids"]
if g["status"] in ("pending_cover", "holding_no_cover")
)
cancel_all_orders(task)
activate_grids(task, new_high, new_low)
# 移動後、最下限グリッドに買い戻し保護注文
if holding_contracts > 0:
_place_grid_cover(task, 0, holding_contracts)
これにより、区間がどのように移動しても、既に空売りしたポジションの追跡が失われることはありません。
七、複数コントラクトの並行管理
7.1 新規コントラクト発見時の処理ロジック
旧コントラクトの決済により解放された資金は再分配され、新規コントラクトに十分な資金が確保されるようにします。
7.2 ライフサイクル管理
各コントラクトのライフサイクル:
八、いくつかの重要な詳細
8.1 小価格通貨の精度の落とし穴
HIPPOUSDTのように価格が0.0003程度の通貨では、区間移動ステップの計算時に精度問題が発生します。
shift_step = 0.0003 × 5% = 0.000015
PricePrecision = 4(小数点以下4桁)の場合
round(0.000015, 4) = 0.0 ← ステップが0になる!
→ whileループが永遠に終わらず、無限ループ
解決策としては、ステップに対して精度丸めを行わず、最小ステップを設定して安全策を取ります。
python
shift_step = price * SHIFT_STEP_PCT
min_step = 10 ** (-PricePrecision)
shift_step = max(shift_step, min_step) # 少なくとも最小精度単位以上にする
8.2 底倉空売り失敗時の処理
成行空売りは、資金不足やネットワーク問題により失敗する可能性があります。その場合、グリッドを構築し続けると、底倉のない裸グリッドになってしまいます。
python
def open_base_short(task):
oid = place_market_short(task, usdt_amount)
Sleep(1000)
amt, _, _ = get_short_position(task)
task["base_short_qty"] = amt
if amt <= 0:
Log(f"底倉空売り失敗、当該コントラクトをスキップ")
return False
return True
# init_task 内
if not open_base_short(task):
return None # 初期化失敗、tasksに追加しない
8.3 強制決済のタイミングと方法
上場廃止の60分前(バイナンスが新規注文を禁止するタイミング)ではなく、60分前を選択するのは、決済に十分な時間的余裕を持たせるためです。廃止が近づくほど流動性が低下し、決済が困難になります。
決済時には、成行注文ではなく、市場価格よりやや高い指値注文を使用します。流動性が極端に低い場合の悪質な約定を避けるためです。
python
buy_p = fp(task, price * 1.005) # 市場価格より0.5%高い
exchange.CreateOrder(swapcode, "closesell", buy_p, fc)
一度で決済できない場合は、最大10回リトライし、毎回最新価格を取得します。
8.4 資金調達レートによる追加収益
下落相場では、資金調達レートは通常、空売り側に有利です(空売り側が受け取る)。これは底倉保有による追加収益であり、グリッドの差益統計には現れませんが、アカウントの純資産増加として反映されます。
九、パラメータ設定の推奨事項
python
LEVERAGE = 10 # レバレッジ倍率、推奨5~10、高すぎないこと
GRID_WIDTH_PCT = 0.10 # グリッド幅10%、通常の変動幅をカバー
SHIFT_STEP_PCT = 0.05 # 移動ステップ5%、グリッド幅の約半分
GRID_COUNT = 10 # グリッド数、数が多いほど各グリッドの資金が少なくなる
BASE_SHORT_RATIO = 0.5 # ベースポジション50%、グリッド40%、緩衝用残り10%
FORCE_CLOSE_MINS = 60 # 60分前に強制決済
MONITOR_INTERVAL = 15000 # 15秒ごとに監視、即時性と頻度制限のバランス
グリッド幅の選択:幅が広いほどカバーする変動範囲が大きくなりますが、各グリッドの間隔も広がり、刈り取り頻度が低下します。当該通貨ペアの過去のボラティリティに基づいて調整することを推奨し、通常10%が合理的な出発点です。
グリッド数の選択:グリッド数が多いほど間隔が狭くなり刈り取り頻度は上がりますが、各グリッドの資金が少なくなり、1回あたりの利益も小さくなります。グリッド数が多すぎると、各グリッドの資金が最小注文数量を下回る問題も発生します。10グリッドはバランスの取れた選択です。
十、リスク注意事項
本ストラテジーを使用する前に、以下のリスクを十分に理解する必要があります。
反発リスク:ニュースがすでに市場にプライスインされている場合、発表後に「悪材料出尽くし」の反発が起こる可能性があり、ベースポジションは一時的に損失となります。グリッド部分は反発時にも差益を刈り取ることができますが、全体として一時的なドローダウンが発生する可能性があります。
流動性リスク:上場廃止時期に近づくほど、先物の流動性は低下し、買値と売値のスプレッドが拡大し、決済時のスリッページが増加します。ストラテジーでは0.5%のプレミアムと10回のリトライを設定して対処していますが、極端な状況では全量決済できない可能性もあります。
偽シグナルリスク:ごくまれにバイナンスが上場廃止計画を取り消したり延期したりする場合があり、その場合ストラテジーは手動介入または次回の監視更新まで空売りポジションを保持し続けます。
高レバレッジリスク:上場廃止対象通貨の変動は非常に激しく、10倍レバレッジでは10%の反発でもほぼ全額の損失につながる可能性があります。自身のリスク許容度に応じてレバレッジを調整し、全体のポジション規模を管理することを推奨します。
ストラテジーの適時開始および停止:実践的な取引で、一部の銘柄は変動しながら下落する過程で1日程度経過すると価格が徐々に発表前の状態に戻ることがあり、その際はストラテジーを適時に停止する必要があります。
実行時間:ストラテジーは機会を発見するまでに比較的長い待機時間が必要であり、辛抱強く待つ必要があります。
十一、まとめ
本ストラテジーの中核的価値は、情報優位性(上場廃止シグナルをいち早く発見)を取引優位性(自動実行)に変換し、かつベースポジション+グリッドの二重構造により、一方向の下落相場でトレンド収益と変動差益の両方を捉える点にあります。
システム全体の主要設計ポイント:
| モジュール | 中核設計 | 解決する課題 |
|---|---|---|
| deliveryDate監視 | インターフェースのフィールド変化を直接読み取り | 秒単位で上場廃止シグナルを発見 |
| 動的資金配分 | 初期化のたびに残高を再確認 | 複数銘柄間で資金配分を均衡化 |
| ベースポジション成行売り建て | 発表直後に即時実行 | 最初の急落を取り逃がさない |
| 全グリッド注文 | 現在価格より高い全グリッドに指値 | 想定以上の反発を取り逃がさない |
| グリッド幅固定 | 移動時も幅を維持 | 浮動小数点誤差の防止 |
| ポジション保護 | 移動後に空売り注文を再設定 | 裸ポジションの防止 |
| 60分前決済 | 十分な決済時間枠を確保 | 低流動性への対応 |
上場廃止相場は毎日発生するわけではありませんが、発生すれば比較的確度の高い取引機会です。プログラムによる自動監視と実行により、相場を張り付かずに安定的にこうした機会に参加できます。
ストラテジーソースコード: 上場廃止銘柄グリッドストラテジー
- 1







