Sumber daya yang dimuat... Pemuatan...

Pengantar ke Lead-Lag Arbitrage dalam Cryptocurrency (3)

Penulis:FMZ~Lydia, Dibuat: 2024-12-25 16:04:11, Diperbarui:

Dalam artikel sebelumnya, kami memperkenalkan cross-exchange brick moving arbitrage. Dalam artikel ini, kami akan melihat secara mendalam bagaimana menerapkan efek Lead-Lag untuk perdagangan frekuensi tinggi, yang membutuhkan menangkap perbedaan harga kecil dalam waktu yang sangat singkat dan menghasilkan keuntungan dengan cepat. Efek Lead-Lag menyediakan pedagang dengan informasi prediktif untuk membantu mereka menilai tren harga jangka pendek dan mencapai arbitrage antara pertukaran yang berbeda.

Berikut adalah:penyederhanaan kode publikdan dikonversi ke FMZ API. Prinsip kode dari strategi asli ini sangat sederhana dan pernah sangat menguntungkan.

Prinsip Strategi Frekuensi Tinggi Lead-Lag

Yang disebut Lead-Lag dapat dipahami sebagai harga (atau indikator tertentu) dari bursa tertentu akan lebih leading dalam perubahan pasar secara keseluruhan, sementara bursa lain atau indikator lain akan relatif lagging. Dalam strategi ini, Price_1, Price_2, Price_3 mewakili kondisi pasar dari bursa yang berbeda masing-masing. Mereka adalah bursa arus utama. Karena mereka lebih sensitif terhadap berita pasar, atau kedalaman perdagangan mereka dan jenis peserta berbeda, begitu ada pesanan beli atau jual besar, harga bursa ini akan berfluktuasi terlebih dahulu. Bursa perdagangan yang sebenarnya akan sedikit tertinggal dalam fluktuasi harga karena faktor-faktor seperti mekanisme pencocokan dan kelompok perdagangan. Pada saat ini, keadaan bursa memimpin, beberapa lag muncul.

Penelusuran Buku Pemesanan Multi-Exchange

Strategi ini memperoleh data buku pesanan dari bursa yang berbeda hampir secara sinkron, seperti harga penawaran, harga permintaan, volume pesanan yang menunggu, dll. Kemudian harga tengah (yaitu rata-rata harga penawaran dan harga permintaan) dari bursa yang berbeda dibandingkan untuk menyimpulkan dinamika pasar.

Penghakiman Sinyal Tren

Strategi ini terutama berfokus pada perubahan harga dari tiga bursa eksternal (okex, binance, huobipro):

Di sini, setiap tren X ditentukan oleh perbedaan antara harga saat ini dan harga sebelumnya melebihi ambang batas tertentu (level * price_increment). Setelah menambahkan sinyal up/down dari tiga bursa, jika tren keseluruhan > 0, itu berarti bahwa pasar umumnya naik, dan strategi adalah untuk membeli; jika tren < 0, itu berarti bahwa pasar umumnya jatuh, dan strategi adalah untuk menjual.

Perintah dan Pengendalian Risiko Unidirection

Strategi ini hanya membeli atau menjual setelah tren dikonfirmasi, dan membatalkan order sebelumnya sebelum menempatkan setiap order (yaitu, menghindari pesanan yang menunggu secara tidak sengaja yang menyebabkan akumulasi risiko). Pada saat yang sama, skrip juga mengatur modul seperti leverage, operasi batch, dan pemantauan kontrol risiko, yang berarti bahwa beberapa akun dan beberapa pasangan mata uang digunakan secara bersamaan dalam perdagangan langsung, sehingga memperluas strategi s frequency trading dan efisiensi pemanfaatan modal.

Selain itu, strategi ini adalah strategi frekuensi tinggi. Anda tidak perlu memperhatikan keuntungan atau kerugian dari setiap order, juga Anda tidak perlu menghentikan kerugian. Anda dapat melanjutkan selama ada probabilitas menghasilkan keuntungan.

Pelaksanaan Strategi FMZ

Pengaturan parameter

// Hyperparameter settings
const SYMBOL = "BTC_USDT"; // Trading pair
const PRICE_INCREMENT = 0.1; // Price increment
const LEVEL = 10; // Sensitivity of trend judgment
const RATIO = 10; // Order price adjustment ratio
const INTERVAL = 200; // Time interval (milliseconds)
const S_AMOUNT = 0.02; // Default transaction volume
const MIN_AMOUNT = 0.005; // Minimum transaction volume

// Initial state
let buyOrders = [];
let sellOrders = [];
let previousPrices = [0, 0, 0]; // Store the previous price
let loop = 0;

Logika inti: memperoleh data dan menilai tren

// Get order book data
function fetchOrderBooks() {
    let orderBooks = [];
    let tasks = [];

    // Start asynchronous order book acquisition tasks for all exchanges
    for (let i = 0; i < exchanges.length; i++) {
        // Assume that each exchange object can call the Go method
        let task = exchanges[i].Go("GetDepth");
        tasks.push({ index: i, task: task });
    }

    // Wait for all tasks to complete and collect results
    for (let i = 0; i < tasks.length; i++) {
        let { index, task } = tasks[i];
        try {
            // Waiting for an asynchronous task to return a result
            let depth = task.wait(1000);

            // Check if the returned data is valid
            if (!depth || !depth.Bids || !depth.Asks) {
                throw new Error("The returned order book data is invalid");
            }

            // Add valid order book data to the result array
            orderBooks[index] = depth;
        } catch (error) {
            // Recording error logs
            Log(`Failed to obtain the order book of exchange ${index}: ${error.message}`);

            // Added default order book data to avoid crashes
            orderBooks[index] = {
                Bids: [[0, 0]],
                Asks: [[0, 0]]
            };
        }
    }

    return orderBooks;
}


// Judge the trends
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); // Upward trend
        } else if (midPrice < previousPrices[i] - LEVEL * PRICE_INCREMENT) {
            trends.push(-1); // Downward trend
        } else {
            trends.push(0); // No significant trend
        }
        previousPrices[i] = midPrice; // Update price record
    }
    return trends.reduce((a, b) => a + b, 0); // Return to overall trend
}

Penempatan dan pembatalan pesanan

// Cancel all pending orders
function cancelOrders(orders) {
    for (let orderId of orders) {
        try {
            exchanges[0].CancelOrder(orderId); // Use the main exchange by default
            Log(`Cancel order: ${orderId}`);
        } catch (error) {
            Log(`Failed to cancel order: ${error.message}`);
        }
    }
}

// Create a buy order
function createBuyOrder(price, amount) {
    try {
        const orderId = exchanges[0].Buy(price, amount);
        buyOrders.push(orderId);
        Log(`Create a buy order: price ${price}, quantity ${amount}`);
    } catch (error) {
        Log(`Failed to create buy order: ${error.message}`);
    }
}

// Create a sell order
function createSellOrder(price, amount) {
    try {
        const orderId = exchanges[0].Sell(price, amount);
        sellOrders.push(orderId);
        Log(`Create a sell order: price ${price}, quantity ${amount}`);
    } catch (error) {
        Log(`Failed to create sell order: ${error.message}`);
    }
}

Logika strategi utama

function main() {
    while (true) {
        try {
            // Get order book data
            const orderBooks = fetchOrderBooks();

            // Calculate trends
            const trend = calculateTrend(orderBooks);
            Log(`Current trend: ${trend}`);

            // Cancel pending order
            cancelOrders(buyOrders);
            cancelOrders(sellOrders);
            buyOrders = [];
            sellOrders = [];

            // Order based on trends
            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 count and interval
            loop++;
            Sleep(INTERVAL);

        } catch (error) {
            Log(`Main logic error: ${error.message}`);
        }
    }
}

Analisis Alasan Kegagalan Strategi

Pasar menjadi efisien

Ketika semakin banyak strategi kuantitatif atau frekuensi tinggi yang terlibat dan menemukan hubungan Lead-Lag yang sama, sejumlah besar dana akan menghilangkan perbedaan harga dengan cepat.

Pembatasan nilai tukar atau perubahan biaya

Karena struktur biaya dari berbagai bursa berubah, begitu biaya biaya melebihi keuntungan arbitrase, profitabilitas strategi perdagangan frekuensi tinggi akan sangat berkurang. Atau jika bursa mempercepat kecepatan pencocokan, membatasi frekuensi dan kuantitas, dan mengurangi keterlambatan, itu juga akan membatalkan strategi yang awalnya bergantung pada keterlambatan yang tidak konsisten.

Kebocoran likuiditas dan slippage

Ketika volume pasar tidak cukup, strategi frekuensi tinggi sering mengalami kemiringan yang lebih parah; atau pesanan besar akan mendorong harga naik dengan cepat, menyebabkan beli rendah dan jual tinggi yang awalnya diharapkan dipengaruhi oleh pesanan mereka sendiri, yang mengakibatkan penurunan pengembalian.

Perubahan volatilitas pasar

Beberapa strategi bekerja dengan sangat baik di bawah volatilitas tinggi atau periode tertentu. Ketika pasar rata atau volatilitas menurun dan leverage berkurang, strategi kehilangan lingkungan yang cocok dan bahkan dapat menimbulkan kerugian yang sering.

Ringkasan

Titik kunci dari strategi perdagangan frekuensi tinggi terletak pada penangkapan harga dari beberapa bursa dan penilaian sintesis tren. Ia pernah mewujudkan metode perdagangan entri dan keluar yang sangat frekuensi tinggi dan cepat berdasarkan prinsip Lead-Lag: mengamati bursa mana yang bergerak terlebih dahulu, dan kemudian mendorong bursa lain untuk mengikuti, sehingga menangkap perbedaan harga instan atau tren jangka pendek. Namun, seperti yang dikatakan penulis, perubahan lingkungan pasar, homogenitas strategi, biaya penanganan dan batas frekuensi telah membuat strategi ini yang bergantung pada gerak pertama dan kemudian pergeseran perbedaan harga menjadi kurang berguna secara bertahap, dan bahkan kehilangan profitabilitas. Bagi mereka yang ingin mengeksplorasi jenis strategi Lead-Lag ini lagi, perlu mengoptimalkan modul perdagangan dalam kombinasi dengan aturan manajemen biaya pasar terbaru (likiditas, penanganan algoritma, pencocokan kecepatan), sambil memperhatikan kendali risiko, dalam rangka mempertahankan daya saing yang terus berubah di lingkungan pasar.


Lebih banyak