
前回の記事では、取引所間「アービトラージ」裁定取引について紹介しました。今回は、非常に短い時間でわずかな価格差を捉えて素早く利益を上げることが求められる高頻度取引にリード・ラグ効果をどのように応用するかを詳しく見ていきます。リードラグ効果はトレーダーに予測情報を提供し、短期的な価格動向を判断して異なる取引所間で裁定取引を行うのに役立ちます。
以下は公開コードの簡素化FMZ API ベースに変換されました。このオリジナル戦略のコード原理は非常にシンプルで、かつては非常に利益を上げていました。現在は利用できず、参照のみを目的としています。
いわゆる「リード・ラグ」とは、一部の取引所の価格(または特定の指標)が市場全体の変化に「先行」し、他の取引所や他の指標が比較的「遅れる」(ラグ)という意味です。 。この戦略では、「Price_1、Price_2、Price_3」は、異なる取引所の市場状況を表します。これらは、市場ニュースや取引の深さ、参加者の種類に敏感な主流の取引所です。大規模な買い注文または売り注文があると、これらの取引所の価格が最初に変動します。実際の取引所の価格変動は、マッチングの仕組みや取引グループなどの要因により若干遅れます。この時点で、「一部が先行し、一部が遅れている」という状況が生まれます。
この戦略は、最良入札価格、最良売り価格、保留注文量などの注文簿データをさまざまな取引所からほぼ同期して取得します。次に、さまざまな取引所の仲値(つまり、ビッド価格とアスク価格の平均)を比較して、市場の動向を推測します。
この戦略は主に、3つの外部取引所(okex、binance、huobipro)の価格変動に焦点を当てています。
ここで、各 trendX は、「現在の価格」と「過去の価格」の差が特定のしきい値 (level * price_increment) を超えることによって決定されます。 3つの取引所からの「上昇/下降」シグナルを合計した後、全体的なトレンドが0より大きい場合、市場は一般的に上昇していることを意味し、戦略は買いです。トレンドの場合、市場は一般的に下落しており、戦略としては売りに行くことです。
この戦略では、トレンドが確認された後にのみ売買を行い、各注文を出す前に前回の注文をキャンセルします(つまり、リスクの蓄積につながる偶発的な保留中の注文を回避するためです)。同時に、スクリプトはレバレッジ、バッチ操作、リスク管理監視などのモジュールも設定します。つまり、実際の取引では複数のアカウントと複数の通貨ペアが使用され、「取引頻度」と「取引効率」が拡大します。 「資本の活用」。
また、この戦略は高頻度戦略です。各注文の損益を気にする必要はなく、損切りも必要ありません。利益が出る可能性が高い限り継続できます。利益。
// 超参设置
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}`);
}
}
}
市場は効率化する
より多くの定量的または高頻度の戦略が関与し、同じリード・ラグ関係を発見すると、大量の資金がすぐに価格差を解消します。市場がますます「同期化」するにつれて、小さな価格差から「リスクフリー」または短期的な裁定取引を行う戦略がますます困難になります。
交換制限または手数料の変更
さまざまな取引所の手数料体系が変化すると、手数料コストが裁定利益を上回ると、高頻度取引戦略の収益性は大幅に低下します。あるいは、取引所がマッチングプロセスを高速化し、頻度と量を制限し、レイテンシを削減すると、一貫性のないレイテンシに依存する戦略は効果を発揮しなくなります。
流動性の減少とスリッページ
市場の取引量が不十分な場合、高頻度取引戦略ではより深刻なスリッページが発生することが多く、または大口注文によって価格が急上昇し、当初予想されていた「安く買って高く売る」という行動が自らの注文の影響を受け、収益が減少する。 。
変化する市場のボラティリティ
一部の戦略は、「高ボラティリティ」または「特定のサイクル」で非常にうまく機能します。市場が横ばい、またはボラティリティが低下してレバレッジが削減されると、戦略は適切な環境を失い、頻繁に損失が発生する可能性もあります。
この高頻度取引戦略のポイントは、複数の取引所からの価格の捕捉と「トレンド合成」の判断にあります。かつては、リードラグ原理に基づく超高頻度、高速エントリーおよびエグジット取引手法を実装していました。どの取引所の価格が最初に動くかを観察し、次に他の取引所の価格を追従させることで、瞬間的な価格差や短期的なトレンドを捉えるというものです。 。しかし、著者が言うように、市場環境の変化、戦略の均一性、手数料、頻度の制限により、「最初の動き、最後の動き」のスプレッドに依存するこの戦略は徐々に有用性が低下し、収益性も失われています。このタイプのリードラグ戦略を探求したい人は、最新の市場構造(流動性、手数料ルール、アルゴリズムのマッチング速度)と組み合わせて取引モジュールを最適化し、リスク管理に注意を払う必要があります。変化する市場環境で生き残り、継続的な競争力を維持します。