
En el artículo anterior, presentamos el arbitraje “de arbitraje” entre bolsas. Esta vez, analizaremos en profundidad cómo aplicar el efecto Lead-Lag al trading de alta frecuencia, lo que requiere capturar pequeñas diferencias de precios en un período de tiempo muy corto y obtener ganancias rápidas. El efecto Lead-Lag proporciona a los traders información predictiva, ayudándolos a determinar la tendencia de precios a corto plazo y así lograr arbitraje entre diferentes intercambios.
Los siguientes sonSimplificación del código público, y convertido a API basada en FMZ. El principio del código de esta estrategia original es muy simple y en su momento fue muy rentable. Actualmente no está disponible y es solo para referencia.
El llamado “Lead-Lag” puede entenderse como que los precios (o ciertos indicadores) de algunas bolsas serán más “lideres” en los cambios generales del mercado, mientras que otras bolsas u otros indicadores serán relativamente “rezagados” (Lag). . En esta estrategia, “Precio_1, Precio_2, Precio_3” representan las condiciones del mercado de diferentes bolsas. Son bolsas tradicionales, que son más sensibles a las noticias del mercado, o a su profundidad de negociación y tipos de participantes. Una vez que hay una gran orden de compra o venta, Los precios de estos intercambios fluctuarán primero. Las fluctuaciones de precios de los intercambios comerciales reales se retrasarán ligeramente debido a factores como los mecanismos de coincidencia y los grupos comerciales. En este punto surge una situación de “algunos van por delante y otros van por detrás”.
La estrategia obtiene datos de la cartera de órdenes de diferentes bolsas casi sincrónicamente, como el mejor precio de oferta, el mejor precio de demanda, el volumen de órdenes pendientes, etc. Luego se comparan los precios medios (es decir, el promedio de los precios de oferta y demanda) de diferentes bolsas para inferir la dinámica del mercado.
La estrategia se centra principalmente en los cambios de precios de tres intercambios externos (okex, binance, huobipro):
Aquí, cada tendenciaX está determinada por la diferencia entre el “precio actual” y el “precio pasado” que excede un cierto umbral (nivel * incremento_de_precio). Después de sumar las señales “arriba/abajo” de las tres bolsas, si la tendencia general > 0, significa que el mercado está en general en alza y la estrategia es comprar; si la tendencia < 0, significa que el mercado está en general en alza. cayendo, y la estrategia es ir a vender.
La estrategia solo compra o vende después de que se confirma la tendencia y cancela la orden anterior antes de colocar cada orden (es decir, para evitar órdenes pendientes accidentales que conducen a la acumulación de riesgos). Al mismo tiempo, el script también configura módulos como apalancamiento, operación por lotes y monitoreo de control de riesgos, lo que significa que se utilizan múltiples cuentas y múltiples pares de divisas en el comercio real, expandiendo así la “frecuencia comercial” y la “eficiencia de “utilización del capital”.
Además, esta estrategia es de alta frecuencia. No es necesario prestar atención a las ganancias o pérdidas de cada orden, ni tampoco es necesario detener las pérdidas. Puede continuar mientras exista una alta probabilidad de realizar una operación. ganancia.
// 超参设置
const SYMBOL = "BTC_USDT"; // 交易对
const PRICE_INCREMENT = 0.1; // 价格增量
const LEVEL = 10; // 趋势判断的灵敏度
const RATIO = 10; // 下单价格调整比例
const INTERVAL = 200; // 时间间隔(毫秒)
const S_AMOUNT = 0.02; // 默认交易量
const MIN_AMOUNT = 0.005; // 最小交易量
// 初始状态
let buyOrders = [];
let sellOrders = [];
let previousPrices = [0, 0, 0]; // 存储之前的价格
let loop = 0;
// 获取订单簿数据
function fetchOrderBooks() {
let orderBooks = [];
let tasks = [];
// 启动所有交易所的异步获取订单簿任务
for (let i = 0; i < exchanges.length; i++) {
// 假设每个交易所对象都可以调用Go方法
let task = exchanges[i].Go("GetDepth");
tasks.push({ index: i, task: task });
}
// 等待所有任务完成并收集结果
for (let i = 0; i < tasks.length; i++) {
let { index, task } = tasks[i];
try {
// 等待异步任务返回结果
let depth = task.wait(1000);
// 检查返回的数据是否有效
if (!depth || !depth.Bids || !depth.Asks) {
throw new Error("返回的订单簿数据无效");
}
// 将有效的订单簿数据添加到结果数组
orderBooks[index] = depth;
} catch (error) {
// 记录错误日志
Log(`获取交易所${index}订单簿失败: ${error.message}`);
// 添加默认的订单簿数据以避免崩溃
orderBooks[index] = {
Bids: [[0, 0]],
Asks: [[0, 0]]
};
}
}
return orderBooks;
}
// 判断趋势
function calculateTrend(orderBooks) {
let trends = [];
for (let i = 0; i < orderBooks.length; i++) {
const midPrice = (orderBooks[i].Bids[0][0] + orderBooks[i].Asks[0][0]) / 2;
if (midPrice > previousPrices[i] + LEVEL * PRICE_INCREMENT) {
trends.push(1); // 上升趋势
} else if (midPrice < previousPrices[i] - LEVEL * PRICE_INCREMENT) {
trends.push(-1); // 下降趋势
} else {
trends.push(0); // 无显著趋势
}
previousPrices[i] = midPrice; // 更新价格记录
}
return trends.reduce((a, b) => a + b, 0); // 返回总体趋势
}
// 取消所有挂单
function cancelOrders(orders) {
for (let orderId of orders) {
try {
exchanges[0].CancelOrder(orderId); // 默认使用主交易所
Log(`取消订单: ${orderId}`);
} catch (error) {
Log(`取消订单失败: ${error.message}`);
}
}
}
// 创建买单
function createBuyOrder(price, amount) {
try {
const orderId = exchanges[0].Buy(price, amount);
buyOrders.push(orderId);
Log(`创建买单: 价格 ${price}, 数量 ${amount}`);
} catch (error) {
Log(`创建买单失败: ${error.message}`);
}
}
// 创建卖单
function createSellOrder(price, amount) {
try {
const orderId = exchanges[0].Sell(price, amount);
sellOrders.push(orderId);
Log(`创建卖单: 价格 ${price}, 数量 ${amount}`);
} catch (error) {
Log(`创建卖单失败: ${error.message}`);
}
}
function main() {
while (true) {
try {
// 获取订单簿数据
const orderBooks = fetchOrderBooks();
// 计算趋势
const trend = calculateTrend(orderBooks);
Log(`当前趋势: ${trend}`);
// 取消挂单
cancelOrders(buyOrders);
cancelOrders(sellOrders);
buyOrders = [];
sellOrders = [];
// 根据趋势下单
if (trend > 0 && loop > 0) {
const price = _N(orderBooks[0].Bids[0][0] + RATIO * PRICE_INCREMENT, 2);
const amount = _N(Math.max(S_AMOUNT, MIN_AMOUNT), 4);
createBuyOrder(price, amount);
} else if (trend < 0 && loop > 0) {
const price = _N(orderBooks[0].Asks[0][0] - RATIO * PRICE_INCREMENT, 2);
const amount = _N(Math.max(S_AMOUNT, MIN_AMOUNT), 4);
createSellOrder(price, amount);
}
// 循环计数与间隔
loop++;
Sleep(INTERVAL);
} catch (error) {
Log(`主逻辑错误: ${error.message}`);
}
}
}
Los mercados se vuelven eficientes
Cuando se involucran cada vez más estrategias cuantitativas o de alta frecuencia y descubren la misma relación Lead-Lag, una gran cantidad de fondos eliminará rápidamente la diferencia de precio. A medida que los mercados se vuelven cada vez más “sincronizados”, se hace cada vez más difícil para las estrategias lograr un arbitraje “libre de riesgos” o de corto plazo a partir de pequeñas diferencias de precios.
Restricciones de cambio o cambios de tarifas
A medida que cambia la estructura de tarifas de los diferentes intercambios, una vez que los costos de las tarifas exceden las ganancias del arbitraje, la rentabilidad de las estrategias comerciales de alta frecuencia se reducirá en gran medida. Alternativamente, si el intercambio acelera el proceso de coincidencia, limita la frecuencia y la cantidad y reduce la latencia, las estrategias que se basan en una latencia inconsistente se volverán ineficaces.
Caída y deslizamiento de la liquidez
Cuando el volumen del mercado es insuficiente, las estrategias de alta frecuencia a menudo encuentran un deslizamiento más severo; o los pedidos grandes harán subir rápidamente los precios, lo que hará que la “compra barata y venta cara” esperada originalmente se vea afectada por sus propios pedidos, lo que resulta en una disminución de los retornos. .
Cambios en la volatilidad del mercado
Algunas estrategias funcionan muy bien en condiciones de “alta volatilidad” o “ciclos específicos”. Cuando el mercado está estancado o la volatilidad disminuye y el apalancamiento se reduce, la estrategia pierde su entorno adecuado e incluso puede incurrir en pérdidas frecuentes.
El punto clave de esta estrategia de trading de alta frecuencia radica en la captura de precios de múltiples bolsas y el juicio de “síntesis de tendencias”. Una vez implementó un método de negociación de entrada y salida rápida y de frecuencia ultra alta basado en el principio Lead-Lag: observar qué precio de bolsa se mueve primero y luego impulsar los precios de otras bolsas para que lo sigan, capturando así las diferencias de precios instantáneas o las tendencias a corto plazo. . Sin embargo, como dice el autor, los cambios en el entorno del mercado, la homogeneidad de la estrategia, las tarifas y los límites de frecuencia han hecho que esta estrategia que se basa en el spread “primer movimiento, último movimiento” sea gradualmente menos útil e incluso pierda su rentabilidad. Para aquellos que quieran explorar este tipo de estrategia Lead-Lag, necesitan optimizar el módulo de negociación en combinación con la última estructura del mercado (liquidez, reglas de tarifas, velocidad de coincidencia del algoritmo) y prestar atención a la gestión del control de riesgos, a fin de Sobrevivir en un entorno de mercado cambiante. Mantener una competitividad continua.