
В первой статье мы кратко рассказали, как арбитражировать с использованием феномена Lead-Lag. В этой статье мы в основном рассмотрим арбитраж по «перемещению кирпичей» между биржами. Основной принцип заключается в использовании феномена ценового запаздывания (Lead-Lag effect) между различными биржами. Поскольку ликвидность рынка, скорость транзакций и сетевая задержка каждой биржи различны, цена одной и той же валюты на разных биржах часто отличается. синхронный . Арбитражеры могут отслеживать такие запаздывающие изменения цен и быстро проводить арбитраж, чтобы получать прибыль без риска.
Во-первых, арбитражерам необходимо отслеживать разницу в ценах между различными биржами в режиме реального времени, особенно между ценой спроса и ценой спроса. Отслеживая цену предложения на бирже A и цену предложения на бирже B, можно сделать вывод, что если цена предложения на бирже A ниже цены предложения на бирже B, то можно считать, что существует возможность арбитража. Например, цена предложения биржи A составляет 10 000 USDT, а цена предложения биржи B составляет 10 100 USDT. Разница в цене составляет 100 USDT, что является потенциальной возможностью арбитража. Конечно, нам также необходимо учитывать недавний исторический диапазон разницы цен в качестве ориентира для разницы цен открытия и закрытия, а время ожидания также является одной из статей расходов.
Как только найдена возможность арбитража, арбитражер должен купить актив на бирже с более низкой ценой спроса (например, на бирже A) и продать его на бирже с более высокой ценой спроса (например, на бирже B). Этот процесс можно автоматизировать с помощью API, что гарантирует быстрое исполнение и максимально эффективное использование разницы цен. Однако при совершении сделок необходимо учитывать транзакционные издержки (такие как комиссии и проскальзывание), а также ценовые шоки. Предположим, что комиссия за транзакцию на бирже A составляет 0,1%, а комиссия за транзакцию на бирже B — 0,2%, и на рынке наблюдается проскальзывание. Например, при покупке 1 биткоина на бирже А фактическая цена транзакции может увеличиться из-за исполнения крупных ордеров, если предположить, что проскальзывание составляет 0,1%. Тогда фактическая цена сделки будет на 0,1% выше ожидаемой, что приведет к увеличению стоимости покупки.
Если учесть проскальзывание и комиссии, фактическая стоимость покупки и доход от продажи будут отличаться от ожиданий.
Последний шаг арбитража — закрытие позиции. Например, если через некоторое время цена покупки на бирже A составляет 10 100 USDT, а цена продажи на бирже B — 10 150 USDT, и разница в цене сокращается со 100 USDT до 50 USDT, программа автоматически закроет позицию и получить прибыль. Конечно, в некоторых случаях спред может продолжать расширяться, и вы можете продолжать открывать позиции до тех пор, пока ваши средства не будут исчерпаны. Арбитражеры вносят основной вклад в то, почему разница в ценах на бирже не может быть сохранена.
Благодаря наличию большого количества арбитражеров и маркет-мейкеров, разница в ценах между разными биржами не будет сильно отличаться или же быстро выровняется. Это самая большая проблема, с которой сталкивается торговля на бирже.
Распространенной проблемой является неспособность захватить ордера. Когда программа находит разницу в цене и размещает арбитражный ордер, фактическая разница в цене транзакции не так уж велика и часто приводит к убыткам. В это время решающее значение имеют максимально быстрая реакция и скорость выполнения.
Односторонняя транзакция — это транзакция, в которой одна сторона завершает транзакцию, а другая сторона не завершает транзакцию, что обычно происходит, когда рынок быстро колеблется. Если только одна сторона ордера окажется успешной, арбитражер столкнется с риском потери позиции.
Если разница в ценах сохраняется в течение длительного времени, средства определенной биржи будут быстро скуплены, и арбитражеры не смогут продолжать свои арбитражные операции. В это время арбитражерам необходимо быстро перевести средства или скорректировать свои позиции.
Код не является настоящим кодом и предназначен только для демонстрационных целей. Он не учитывает такие вопросы, как количество рынков, сбои доступа к API, асинхронное ускорение заказов и т. д.
// symbol 是套利的交易对,比如 BTC/USDT
let symbol = "BTC_USDT";
exchanges[0].SetCurrency(symbol);
exchanges[0].SetPrecision(2, 4); //设置精度
exchanges[1].SetCurrency(symbol);
exchanges[1].SetPrecision(2, 4);
// 设置手续费、滑点、开仓和平仓的利润率
let fee = 0.1 / 100; // 0.1% 手续费
let slippage = 0.1 / 100; // 0.1% 滑点
let entryThreshold = 0.005; // 开仓阈值:价差大于0.5%时开仓
let exitThreshold = 0.001; // 平仓阈值:价差回归到0.1%时平仓
// 每次循环执行的具体操作
function OnTick() {
// 获取各个交易所的行情数据
let tickers = exchanges.map(exchange => exchange.GetTicker(symbol));
//容错处理
if(!tickers[1] || !tickers[0]){
return;
}
// 计算套利机会(基于利润率)
// profitAB: 从交易所0买入,从交易所1卖出
const profitAB = (tickers[1].Buy - tickers[0].Sell) / tickers[0].Sell - fee * 2 - slippage * 2;
// profitBA: 从交易所1买入,从交易所0卖出
const profitBA = (tickers[0].Buy - tickers[1].Sell) / tickers[1].Sell - fee * 2 - slippage * 2;
// 打印日志
Log(`Tickers: Exchange0 Buy: ${tickers[0].Sell}, Exchange1 Sell: ${tickers[1].Buy}, Profit AB: ${profitAB} USDT`);
Log(`Tickers: Exchange1 Buy: ${tickers[1].Sell}, Exchange0 Sell: ${tickers[0].Buy}, Profit BA: ${profitBA} USDT`);
// 根据利润判断是否执行套利操作
if (profitAB > entryThreshold) { // 当利润大于开仓阈值时开仓
Log(`套利机会:从交易所0买入BTC,从交易所1卖出,利润:${profitAB} USDT`);
executeArbitrage(0, 1, tickers[0].Sell, tickers[1].Buy, profitAB); // 从交易所0买入并在交易所1卖出
} else if (profitBA > entryThreshold) {
Log(`套利机会:从交易所1买入BTC,从交易所0卖出,利润:${profitBA} USDT`);
executeArbitrage(1, 0, tickers[1].Sell, tickers[0].Buy, profitBA); // 从交易所1买入并在交易所0卖出
} else if (profitAB < exitThreshold) { // 如果价差回归,平仓
Log(`平仓:从交易所0买入并在交易所1卖出的套利机会,利润已回归至平仓阈值`);
closeArbitrage(0, 1, tickers[0].Sell, tickers[1].Buy); // 执行平仓操作
} else if (profitBA < exitThreshold) {
Log(`平仓:从交易所1买入并在交易所0卖出的套利机会,利润已回归至平仓阈值`);
closeArbitrage(1, 0, tickers[1].Sell, tickers[0].Buy); // 执行平仓操作
} else {
Log("没有足够的利润进行套利或平仓");
}
}
// 执行套利交易
function executeArbitrage(buyExchangeIndex, sellExchangeIndex, buyPrice, sellPrice) {
let buyExchange = exchanges[buyExchangeIndex];
let sellExchange = exchanges[sellExchangeIndex];
// 获取账户余额(假设为BTC余额)
let accountBuy = buyExchange.GetAccount();
let accountSell = sellExchange.GetAccount();
//容错处理
if(!accountBuy || !accountSell){
return;
}
let amountBTC = Math.min(accountBuy.Balance / buyPrice, accountSell.Amount);
// 假设每次交易量为 0.1 BTC
let amount = Math.min(amountBTC, 0.1);
// 确保交易量充足
if (amount <= 0) {
Log("余额不足,无法进行套利");
return;
}
// 在买入交易所下单买入
Log(`在交易所${buyExchangeIndex} 下单买入 ${amount} BTC @ ${buyPrice}`);
buyExchange.Buy(buyPrice * (1 + slippage), amount);
// 在卖出交易所下单卖出
Log(`在交易所${sellExchangeIndex} 下单卖出 ${amount} BTC @ ${sellPrice}`);
sellExchange.Sell(sellPrice * (1 - slippage), amount);
}
// 平仓操作
function closeArbitrage(buyExchangeIndex, sellExchangeIndex, buyPrice, sellPrice) {
let buyExchange = exchanges[buyExchangeIndex];
let sellExchange = exchanges[sellExchangeIndex];
// 获取账户余额(假设为BTC余额)
let accountBuy = buyExchange.GetAccount();
let accountSell = sellExchange.GetAccount();
//容错处理
if(!accountBuy || !accountSell){
return;
}
let amountBTC = Math.min(accountBuy.Balance / buyPrice, accountSell.Amount);
let amount = Math.min(amountBTC, 0.1);
// 在买入交易所吃单卖出
Log(`在交易所${buyExchangeIndex} 平仓卖出 ${amount} BTC @ ${buyPrice}`);
buyExchange.Sell(buyPrice * (1 - slippage), amount);
// 在卖出交易所吃单买入
Log(`在交易所${sellExchangeIndex} 平仓买入 ${amount} BTC @ ${sellPrice}`);
sellExchange.Buy(sellPrice * (1 + slippage), amount);
}
// 主循环
function main() {
while (true) {
OnTick();
Sleep(1000); // 每秒钟执行一次
}
}
Арбитраж Lead-Lag — это стратегия кросс-биржевого арбитража, основанная на реакции рынка на задержку. Благодаря точному анализу ценовых различий на рынке и быстрому исполнению сделок арбитражеры получают стабильную прибыль на рынке криптовалют. Однако успех этой стратегии зависит не только от ее разработки, но и требует хорошего исполнения и тонкого понимания рыночного времени. По мере усиления рыночной конкуренции арбитражерам необходимо постоянно оптимизировать свои стратегии и методы, а также повышать скорость и оперативность реагирования, чтобы поддерживать постоянную эффективность арбитражных возможностей.