第1記事では,リード・ラグ現象をアービタージに使用する方法について簡潔に紹介しました. 本記事では,主にクロス・エクスチェンジ・
まず,仲介業者は,異なる取引所間の価格差をリアルタイムで監視する必要がある.特に,オード価格とオード価格.Aの交換価格とBの交換価格のオード価格を追跡することによって,もしAの交換価格がBの交換価格よりも低い場合,仲介機会があると考えることができる.例えば,Aの交換価格が10,000USDT,Bの交換価格が10,100USDTである場合,価格差が100USDTである場合,潜在的な仲介機会がある.もちろん,最近の歴史的価格差の範囲も開閉価格差の基準として考慮されるべきであり,待機時間はまたコストの1つです.
アブリテージの機会が発見されたら,アブリテージは,低価格の取引所 (Exchange A) で資産を購入し,より高い価格の取引所 (Exchange B) で売却すべきである.この操作はAPIを通じて自動化され,迅速な実行を確保し,価格差を最大化することができる.しかし,取引を実行する際には,取引コスト (手数料やスリップなど) と価格ショックも考慮する必要があります.Exchange A の手数料が0.1%であり,Exchange B の手数料が0.2%であり,市場でスリップがあると仮定します.例えば,Exchange A で1 Bitcoin を購入する際,大きなスリップが0.1%であると仮定して,実際の取引価格が大きな注文の実行により上昇する可能性があります.その後,実際の取引価格は予想より0.1%高くなり,購入コストの増加が生じる.
スリップと手数料を考慮すると,実際の購入コストと販売収入は予想とは異なる.
アブリテージの最後のステップはポジションを閉じる.例えば,一定の期間を経て,交換Aの購入価格が10,100USDT,交換Bの販売価格が10,150USDTである.価格差が100USDTから50USDTに縮小すると,プログラムは自動的にポジションを閉じて利益を得ます.もちろん,いくつかの場合,価格差が拡大し続け,資金が枯渇するまでポジションを開くことができます.交換の価格差が維持できない理由は,アブリテージが圧倒的多数力を貢献することです.
多くの仲介業者やマーケットメーカーの存在により,異なる取引所の間の価格差はそれほど大きくなく,そうでなければ迅速に平衡される.これは仲介取引が直面する最大の問題である.
解決策: - 価格の違いが自然に形成されるのを待つ:仮想通貨市場は不安定で,短期間の価格差が通常発生します. 忍耐強く待つことは,この問題を解決する最良の方法です.- メーカー戦略を使う交換オーダーブック上の注文を積極的に購入・販売し,価格の変化に伴い注文をキャンセルし,調整する.一方が取引を完了した場合,相手側がオーダーを受け取ります.その結果,取引手数料が低くなり,スプレッドが小さくなり,即時の取引が保証されます.- 取引対を監視する主流通貨だけに焦点を当てるのではなく,それらの仲介機会は通常,多数の仲介業者によって捕らえられ,価格差が狭くなってしまう. 人気のない通貨や新規上場通貨は,流動性の低さや競争が少ないため,価格差が大きい可能性があります.- 小規模な交換を選ぶ:小規模な取引所は,通常流動性が低く,価格調整が遅いため,大きな価格差が発生することを容易にする.この時点で,仲介業者は,利益を得るために注文を提出し,先駆的に実行することを選択することができます.- 高値の取引所を選ぶ韓国の取引所Upbitのような厳しいKYC認証を必要とする取引所もあります.これらの場所は普通のトレーダーがアクセスするのが困難で,仲介の機会が増えています.もちろん,困難を克服する方法を見つけなければなりません.
オーダーを取れないのは一般的な問題である. プログラムが価格差を見つけ,仲介の注文をすると,実際の価格差はそれほど大きくなく,通常損失が発生する. この時点で,最も速い応答と実行速度が重要です.
解決策: - ネットワークとサーバーの位置を最適化遅延を減らすために交換サーバーに近いノードを選択します.例えば,流動性が低い小さな取引所を選択すると,市場の反応速度を低下させ,機会を掴むことができます.- アシンクロン処理とWebソケット:アシンクロンコードとWebソケットを使用して市場状況に接続することで,リアルタイムで価格情報を受信し,情報遅延による機会を逃すのを避けるために迅速に対応できます.
単方向取引とは,注文の片方が完了したが,もう片方は完了しない場合である.通常は急激に変動する市場で起こります.注文の片方が成功した場合,仲介業者は露出リスクに直面します.
解決策: - 合理的なストップ・ロスのメカニズムを設定する一方向取引が起こると,ストップ・ロスを設定できます. ポジションを間に合うように閉じることはリスクを減らす効果的な方法です.- 市場価格で注文する:市場価格が取引を保証できるが 問題なのは 取引価格の差が制御不能で 損失を招く可能性があるということだ
価格差が長期間存在すると,特定の取引所の資金は迅速に買い上げられ,仲介業者は仲介業務を継続することができない場合があります.この時点で,仲介業者は資金を迅速に転送またはポジションを調整する必要があります.
解決策: - 貨幣の送金資金の移転と仲介を継続するために,クロス交換通貨の転送を使用します.この方法で,単一市場での資金の蓄積を避け,資金の流動性を増加することができます.- 価格の差が変わるまで待ってる引き出す時間のコストを考えると 価格差が戻るまで待つことも選択肢です
このコードはライブ・トレード・コードではなく,デモンストレーション目的のみで,市場数,APIアクセス障害,非同期オーダー加速等などの問題を考慮に入れない.
// Symbol is the arbitrage trading pair, such as BTC/USDT
let symbol = "BTC_USDT";
// Set commissions, slippage, profit margins for opening and closing positions
let fee = 0.1 / 100; // 0.1% Fee
let slippage = 0.1 / 100; // 0.1% slippage
let entryThreshold = 0.005; // Opening threshold: Opening a position when the price difference is greater than 0.5%
let exitThreshold = 0.001; // Closing threshold: Closing when the price difference returns to 0.1%
// The specific operations performed in each loop
function OnTick() {
// Get ticker data from various exchanges
let tickers = exchanges.map(exchange => exchange.GetTicker(symbol));
// Calculate arbitrage opportunities (based on profit margins)
// profitAB: Buy from exchange 0, sell from exchange 1
const profitAB = (tickers[1].bid - tickers[0].ask) / tickers[0].ask - fee * 2 - slippage * 2;
// profitBA: Buy from exchange 1, sell from exchange 0
const profitBA = (tickers[0].bid - tickers[1].ask) / tickers[1].ask - fee * 2 - slippage * 2;
// Print log
Log(`Tickers: Exchange0 Buy: ${tickers[0].ask}, Exchange1 Sell: ${tickers[1].bid}, Profit AB: ${profitAB} USDT`);
Log(`Tickers: Exchange1 Buy: ${tickers[1].ask}, Exchange0 Sell: ${tickers[0].bid}, Profit BA: ${profitBA} USDT`);
// Determine whether to perform arbitrage operations based on profits
if (profitAB > entryThreshold) { // Open a position when the profit is greater than the opening threshold
Log(`Arbitrage opportunity: Buy BTC from exchange 0, sell from exchange 1, profit: ${profitAB} USDT`);
executeArbitrage(0, 1, tickers[0].ask, tickers[1].bid, profitAB); // Buy from exchange 0 and sell from exchange 1
} else if (profitBA > entryThreshold) {
Log(`Arbitrage opportunity: Buy BTC from exchange 1, sell from exchange 0, profit: ${profitBA} USDT`);
executeArbitrage(1, 0, tickers[1].ask, tickers[0].bid, profitBA); // Buy from exchange 1 and sell from exchange 0
} else if (profitAB < exitThreshold) { // If the spread reverts, close the position
Log(`Close position: Arbitrage opportunity bought from exchange 0 and sold on exchange 1, profit has returned to the close threshold`);
closeArbitrage(0, 1, tickers[0].ask, tickers[1].bid); // Execute the closing operation
} else if (profitBA < exitThreshold) {
Log(`Close position: Arbitrage opportunity bought from exchange 1 and sold on exchange 0, profit has returned to the closing threshold`);
closeArbitrage(1, 0, tickers[1].ask, tickers[0].bid); // Execute the closing operation
} else {
Log("Not enough profit to take profit or close the position");
}
}
// Executing arbitrage trades
function executeArbitrage(buyExchangeIndex, sellExchangeIndex, buyPrice, sellPrice) {
let buyExchange = exchanges[buyExchangeIndex];
let sellExchange = exchanges[sellExchangeIndex];
// Get account balance (assuming BTC balance)
let accountBuy = buyExchange.GetAccount();
let accountSell = sellExchange.GetAccount();
let amountBTC = Math.min(accountBuy.Balance / buyPrice, accountSell.Amount);
// Assume that the transaction volume is 0.1 BTC per transaction
let amount = Math.min(amountBTC, 0.1);
// Ensure sufficient trading volume
if (amount <= 0) {
Log("Insufficient balance to conduct arbitrage");
return;
}
// Place a buy order on the buying exchange
Log(`Place an order to buy ${amount} BTC @ ${buyPrice} on exchange ${buyExchangeIndex}`);
buyExchange.Buy(symbol, buyPrice * (1 + slippage), amount);
// Place a sell order on the selling exchange
Log(`Place an order to sell ${amount} BTC @ ${sellPrice} on exchange ${sellExchangeIndex}`);
sellExchange.Sell(symbol, sellPrice * (1 - slippage), amount);
}
// Closing position operation
function closeArbitrage(buyExchangeIndex, sellExchangeIndex, buyPrice, sellPrice) {
let buyExchange = exchanges[buyExchangeIndex];
let sellExchange = exchanges[sellExchangeIndex];
// Get account balance (assuming BTC balance)
let accountBuy = buyExchange.GetAccount();
let accountSell = sellExchange.GetAccount();
let amountBTC = Math.min(accountBuy.Balance / buyPrice, accountSell.Amount);
let amount = Math.min(amountBTC, 0.1);
// Place a sell order on the buying exchange
Log(`Close and sell ${amount} BTC @ ${buyPrice} on exchange ${buyExchangeIndex}`);
buyExchange.Sell(symbol, buyPrice * (1 - slippage), amount);
// Place a buy order on the selling exchange
Log(`Close buy ${amount} BTC @ ${sellPrice} on exchange ${sellExchangeIndex}`);
sellExchange.Buy(symbol, sellPrice * (1 + slippage), amount);
}
// Main loop
function main() {
while (true) {
OnTick();
Sleep(1000); // Execute once every second
}
}
リード・ラグ・ブロック・ムービング・アービタージ (Lead-Lag brick-moving arbitrage) は,市場遅れ反応に基づくクロス・エクスチェンジ・アービタージ戦略である.市場における価格差を正確に分析し,取引を迅速に実行することで,アービタジャーは仮想通貨市場で安定した利益を得ることができる.しかし,戦略の成功は戦略そのものの設計だけでなく,適切な実行と市場タイミングの敏感な把握にも依存する.市場競争が激化するにつれて,アービタジャーは,アービタージ機会の継続的な有効性を維持するために,戦略と技術を継続的に最適化し,速度と応答性を向上させる必要がある.