No primeiro artigo, apresentamos brevemente como fazer arbitragem usando o fenômeno Lead-Lag. Este artigo apresentará principalmente a arbitragem “brick moving” entre bolsas. O princípio básico é usar o fenômeno de defasagem de preço (efeito Lead-Lag) entre diferentes exchanges. Como a liquidez do mercado, a velocidade da transação e o atraso da rede de cada exchange são diferentes, o preço da mesma moeda em diferentes exchanges costuma ser diferente. síncrono . Os arbitradores podem monitorar essas mudanças de preço tardias e conduzir rapidamente a arbitragem para obter lucros sem risco.
Primeiro, os arbitradores precisam monitorar as diferenças de preço entre diferentes bolsas em tempo real, especialmente o preço de venda e o preço de compra. Ao monitorar o preço de venda da bolsa A e o preço de compra da bolsa B, se o preço de venda da bolsa A for menor que o preço de compra da bolsa B, pode-se considerar que há uma oportunidade de arbitragem. Por exemplo, o preço de venda da bolsa A é 10.000 USDT, e o preço de compra da bolsa B é 10.100 USDT. A diferença de preço é 100 USDT, o que é uma oportunidade potencial de arbitragem. Claro, também precisamos considerar a recente variação histórica de preços como referência para as diferenças de preços de abertura e fechamento, e o tempo de espera também é um dos custos.
Uma vez encontrada uma oportunidade de arbitragem, o arbitrador deve comprar o ativo em uma bolsa com um preço de venda mais baixo (como a Bolsa A) e vendê-lo em uma bolsa com um preço de compra mais alto (como a Bolsa B). Isso pode ser automatizado via API, garantindo execução rápida e maximizando o uso de diferenças de preços. Entretanto, ao executar negociações, os custos de transação (como taxas e deslizamentos), bem como choques de preços, devem ser considerados. Suponha que a taxa de transação da bolsa A seja de 0,1%, enquanto a taxa de transação da bolsa B seja de 0,2%, e que haja deslizamento no mercado. Por exemplo, ao comprar 1 Bitcoin na Bolsa A, o preço real da transação pode aumentar devido à execução de grandes ordens, supondo que o deslizamento seja de 0,1%. Então, o preço real da transação será 0,1% maior que o esperado, resultando em um aumento no custo de compra.
Se a derrapagem e as taxas forem levadas em consideração, o custo real de compra e a receita de venda serão diferentes das expectativas.
O passo final na arbitragem é fechar a posição. Por exemplo, após um período de tempo, se o preço de compra da bolsa A for 10.100 USDT e o preço de venda da bolsa B for 10.150 USDT, e a diferença de preço diminuir de 100 USDT para 50 USDT, o programa fechará automaticamente a posição e realizar lucro. É claro que, em alguns casos, o spread pode continuar aumentando, e você pode continuar abrindo posições até que seus fundos se esgotem. Os arbitradores contribuem com a grande maioria dos motivos pelos quais a diferença de preço na bolsa não pode ser mantida.
Devido à existência de um grande número de arbitradores e formadores de mercado, as diferenças de preço entre diferentes bolsas não serão muito diferentes, caso contrário, elas serão niveladas rapidamente. Este é o maior problema enfrentado pelo carry trading.
A falha em pegar ordens é um problema comum. Quando o programa encontra a diferença de preço e coloca uma ordem de arbitragem, a diferença real do preço da transação não é tão grande e frequentemente resulta em perda. Neste momento, a maior rapidez de resposta e velocidade de execução são cruciais.
Uma transação de perna única refere-se a uma transação na qual uma parte conclui a transação enquanto a outra parte não consegue concluí-la, o que geralmente ocorre quando o mercado flutua rapidamente. Se apenas um lado da ordem for bem-sucedido, o arbitrador enfrentará risco de exposição.
Quando a diferença de preço existe por muito tempo, os fundos de uma determinada bolsa serão rapidamente comprados, e os arbitradores podem não conseguir continuar suas operações de arbitragem. Neste momento, os arbitradores precisam transferir fundos rapidamente ou ajustar suas posições.
O código não é um código real e é apenas para fins de demonstração. Ele não leva em conta questões como o número de mercados, falhas de acesso à API, aceleração de ordens assíncronas, etc.
// 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); // 每秒钟执行一次
}
}
Arbitragem Lead-Lag é uma estratégia de arbitragem entre bolsas baseada na reação ao atraso do mercado. Ao analisar com precisão as diferenças de preços no mercado e executar negociações rapidamente, os arbitradores conseguem obter lucros estáveis no mercado de criptomoedas. No entanto, o sucesso dessa estratégia não depende apenas do design da estratégia em si, mas também requer uma boa execução e uma compreensão sensível do momento do mercado. À medida que a competição de mercado se intensifica, os arbitradores precisam otimizar continuamente suas estratégias e técnicas e melhorar sua velocidade e capacidade de resposta para manter a eficácia contínua das oportunidades de arbitragem.