Sumber daya yang dimuat... Pemuatan...

Cryptocurrency Quantitative Trading for Beginners - Membawa Anda Lebih Dekat dengan Cryptocurrency Quantitative (7)

Penulis:FMZ~Lydia, Dibuat: 2022-08-09 11:15:23, Diperbarui: 2023-09-21 21:00:10

img

Dalam artikel sebelumnya, kami memikirkan dan merancang strategi grid multi-spesies yang sederhana bersama-sama. Selanjutnya, kami akan terus belajar dan bergerak maju di jalur perdagangan kuantitatif. Dalam artikel ini, kami akan mengeksplorasi desain strategi yang lebih kompleks - desain strategi lindung nilai. Artikel ini berencana untuk merancang strategi lindung nilai intertemporal multi-spesies. Ketika datang ke strategi lindung nilai intertemporal, mereka yang akrab dengan perdagangan berjangka harus akrab dengannya. Bagi pemula, mereka mungkin tidak memahami konsep ini, jadi mari kita mulai dengan penjelasan singkat tentang konsep lindung nilai intertemporal.

Hedging intertemporal

Sederhananya, lindung nilai intertemporal adalah untuk pergi panjang kontrak, pergi pendek kontrak, dan menunggu tiga situasi (panjang dan pendek) untuk menutup posisi pada saat yang sama:

  • Jika Anda menghasilkan uang dengan pergi panjang dan kehilangan uang dengan pergi pendek, dan menutup posisi Anda ketika keuntungan (seperti yang dikatakan) lebih dari kerugian (seperti yang dikatakan), Anda akan membuat keuntungan setelah keseimbangan keuntungan / kerugian.
  • Posisi panjang kehilangan uang, posisi pendek menghasilkan uang, dan menutup posisi ketika yang satu lebih menguntungkan daripada yang kalah,... (sama seperti di atas).
  • Dapatkan uang jika Anda pergi panjang, dan menghasilkan uang jika Anda pergi pendek, jadi apa ragu-ragu? Tutup posisi Anda!

Dalam kasus lain adalah kerugian mengambang, membawa atau terus skala dalam posisi. (Karena fluktuasi spread lebih moderat daripada fluktuasi sepihak, risiko relatif lebih kecil, perhatikan bahwa hanya relatif!)

Let A1 be the price of contract A at moment 1, and set B1 to be the price of contract B at moment 1. At this time, short contract A, short price A1, long contract B, and long price B1.
Let A2 be the price of contract A at moment 2, and set B2 to be the price of contract B at moment 2. At this time, close the position contract A (short), close short A2, close the position B contract (long), and close long price B2.

Moment 1 difference:A1 - B1 = X 
Moment 2 difference:A2 - B2 = Y 
X - Y = A1 - B1 - (A2 - B2)
X - Y = A1 - B1 - A2 + B2
X - Y = A1 - A2 + B2 - B1

It can be seen that A1 - A2 is the profit difference in closing the position of contract A.
B2 - B1 is the profit spread of closing the position of contract B. As long as the two closed positions are overall positive, ie: A1 - A2 + B2 - B1 > 0 is profitable. That is, as long as X - Y > 0.
Because of: X - Y = A1 - A2 + B2 - B1

It is concluded that as long as the difference X of opening a position is greater than the difference Y of closing a position, it is profitable (note that it is short A, long B to open a position, the reverse will be the opposite), of course, this is theoretical, practical factors such as commission and slippage should also be considered.

Karena bursa cryptocurrency memiliki kontrak pengiriman dan kontrak abadi. Dan harga kontrak abadi selalu dekat dengan harga spot karena tingkat pendanaan. Kemudian kita memilih untuk menggunakan kontrak pengiriman dan kontrak abadi untuk hedge arbitrage. Kontrak pengiriman memilih kontrak jangka panjang, sehingga kontrak lindung nilai tidak perlu ditetapkan sering.

Pemanasan dengan statistik penyebaran multi-spesies pertama

Setelah Anda terbiasa dengan prinsip-prinsip dasar, Anda tidak perlu terburu-buru dalam menulis strategi. Pertama-tama, Anda dapat mendapatkan statistik penyebaran, menggambar grafik dan mengamati penyebaran. Mari kita belajar cara menggambar strategi multi-spesies bersama-sama.

Kami merancang berdasarkanKontrak OKEX. Sangat mudah untuk menggambar pada FMZ. Sangat mudah untuk menggunakan fungsi dikemas untuk menggambar. Perpustakaan grafik adalahHighchart. Deskripsi fungsi gambar pada dokumentasi API:https://www.fmz.com/api#chart...

Karena itu adalah multi-spesies, pertama-tama, perlu untuk menentukan perbedaan harga dari spesies tersebut sebelum menggambar.

var arrSwapContractType = ["BTC-USDT-SWAP", "LTC-USDT-SWAP", "ETH-USDT-SWAP", "ETC-USDT-SWAP"]   // Perpetual contracts
var arrDeliveryContractType = ["BTC-USDT-210924", "LTC-USDT-210924", "ETH-USDT-210924", "ETC-USDT-210924"]  // Delivery contracts

Inisialisasi konfigurasi grafik sesuai dengan kode kontrak yang ditetapkan di sini. Konfigurasi grafik ini tentu tidak dapat dikodekan keras, karena Anda tidak tahu spesies apa dan berapa banyak spesies yang harus dilakukan (ini ditentukan oleh nilai arrDeliveryContractType dan arrSwapContractType), sehingga konfigurasi grafik dikembalikan oleh fungsi.

function createCfg(symbol) {
    var cfg = {
        extension: {
            // No grouping, displayed separately, default is 'group'
            layout: 'single', 
            // Specify the height, which can be set as a string, "300px", and the value 300 will be replaced with "300px" automatically
            height: 300,      
            // The unit value of the specified width, the total value is 12
            col: 6
        },
        title: {
            text: symbol
        },
        xAxis: {
            type: 'datetime'
        },
        series: [{
            name: 'plus',
            data: []
        }]
    }

    return cfg
}

function main() {
    // Declare arrCfg
    var arrCfg = []                                    // Declare an array to store chart configuration information
    _.each(arrSwapContractType, function(ct) {         // Record the array of perpetual contract codes iteratively, pass the XXX-USDT part of the contract name as a parameter to the createCfg function, construct the chart configuration information, and return
        arrCfg.push(createCfg(formatSymbol(ct)[0]))    // The chart configuration information returned by createCfg is pushed into the arrCfg array
    })
    var objCharts = Chart(arrCfg)                      // Call the chart function Chart of the FMZ platform to create the chart control object objCharts
    objCharts.reset()                                  // Initialize chart content
    
    // Hereafter omitted ...
}

Selanjutnya, mari kita siapkan data.

Kontrak abadi USDT:

https://www.okex.com/api/v5/market/tickers?instType=SWAP

Kontrak pengiriman USDT:

https://www.okex.com/api/v5/market/tickers?instType=FUTURES

Kita menulis fungsi untuk menangani panggilan dari dua antarmuka ini dan menempatkan data dalam format:

function getTickers(url) {
    var ret = []
    try {
        var arr = JSON.parse(HttpQuery(url)).data
        _.each(arr, function(ele) {
            ret.push({
                bid1: parseFloat(ele.bidPx),             // Price of stock buy order
                bid1Vol: parseFloat(ele.bidSz),          // Amount for the price of stock buy order
                ask1: parseFloat(ele.askPx),             // Price of stock sell order
                ask1Vol: parseFloat(ele.askSz),          // Amount for the price of stock sell order
                symbol: formatSymbol(ele.instId)[0],     // Formats into trading pairs
                type: "Futures",                         // Type
                originalSymbol: ele.instId               // Original contract code
            })
        })
    } catch (e) {
        return null 
    }
    return ret 
}

Tulis fungsi lain untuk memproses kode kontrak

function formatSymbol(originalSymbol) {
    var arr = originalSymbol.split("-")
    return [arr[0] + "_" + arr[1], arr[0], arr[1]]
}

Yang tersisa adalah untuk memasangkan data yang diperoleh secara iteratif, menghitung spread, grafik output, dll. Tes di sini adalah perbedaan antara kontrak kuartal kedua 210924 dan kontrak abadi. Kode lengkap:

// Temporary parameters
var arrSwapContractType = ["BTC-USDT-SWAP", "LTC-USDT-SWAP", "ETH-USDT-SWAP", "ETC-USDT-SWAP"]
var arrDeliveryContractType = ["BTC-USDT-210924", "LTC-USDT-210924", "ETH-USDT-210924", "ETC-USDT-210924"]
var interval = 2000

function createCfg(symbol) {
    var cfg = {
        extension: {
            // No grouping, displayed separately, default is 'group'
            layout: 'single', 
            // Specify the height, which can be set as a string, "300px", and the value 300 will be replaced with "300px" automatically
            height: 300,      
            // The unit value of the specified width, the total value is 12
            col: 6
        },
        title: {
            text: symbol
        },
        xAxis: {
            type: 'datetime'
        },
        series: [{
            name: 'plus',
            data: []
        }]
    }

    return cfg
}

function formatSymbol(originalSymbol) {
    var arr = originalSymbol.split("-")
    return [arr[0] + "_" + arr[1], arr[0], arr[1]]
}

function getTickers(url) {
    var ret = []
    try {
        var arr = JSON.parse(HttpQuery(url)).data
        _.each(arr, function(ele) {
            ret.push({
                bid1: parseFloat(ele.bidPx), 
                bid1Vol: parseFloat(ele.bidSz), 
                ask1: parseFloat(ele.askPx), 
                ask1Vol: parseFloat(ele.askSz), 
                symbol: formatSymbol(ele.instId)[0], 
                type: "Futures", 
                originalSymbol: ele.instId
            })
        })
    } catch (e) {
        return null 
    }
    return ret 
}

function main() {
    // Declare arrCfg
    var arrCfg = []
    _.each(arrSwapContractType, function(ct) {
        arrCfg.push(createCfg(formatSymbol(ct)[0]))
    })
    var objCharts = Chart(arrCfg)
    objCharts.reset()
    
    while (true) {
        // Obtain market data        
        var deliveryTickers = getTickers("https://www.okex.com/api/v5/market/tickers?instType=FUTURES")
        var swapTickers = getTickers("https://www.okex.com/api/v5/market/tickers?instType=SWAP")
        if (!deliveryTickers || !swapTickers) {
            Sleep(2000)
            continue
        }

        var tbl = {
            type : "table",
            title : "delivery - perpetual spread",
            cols : ["trading pairs", "delivery", "perpetual", "positive hedging", "negative hedging"],
            rows : []
        }
        
        var subscribeDeliveryTickers = []
        var subscribeSwapTickers = []
        _.each(deliveryTickers, function(deliveryTicker) {
            _.each(arrDeliveryContractType, function(symbol) {
                if (deliveryTicker.originalSymbol == symbol) {
                    subscribeDeliveryTickers.push(deliveryTicker)
                }
            })
        })
        _.each(swapTickers, function(swapTicker) {
            _.each(arrSwapContractType, function(symbol) {
                if (swapTicker.originalSymbol == symbol) {
                    subscribeSwapTickers.push(swapTicker)
                }
            })
        })
        
        var pairs = []
        var ts = new Date().getTime()
        _.each(subscribeDeliveryTickers, function(deliveryTicker) {
            _.each(subscribeSwapTickers, function(swapTicker) {
                if (deliveryTicker.symbol == swapTicker.symbol) {
                    var pair = {symbol: swapTicker.symbol, swapTicker: swapTicker, deliveryTicker: deliveryTicker, plusDiff: deliveryTicker.bid1 - swapTicker.ask1, minusDiff: deliveryTicker.ask1 - swapTicker.bid1}
                    pairs.push(pair)
                    tbl.rows.push([pair.symbol, deliveryTicker.originalSymbol, swapTicker.originalSymbol, pair.plusDiff, pair.minusDiff])
                    for (var i = 0 ; i < arrCfg.length ; i++) {
                        if (arrCfg[i].title.text == pair.symbol) {
                            objCharts.add([i, [ts, pair.plusDiff]])
                        }                        
                    }                    
                }
            })
        })

        LogStatus(_D(), "\n`" + JSON.stringify(tbl) + "`")        
        Sleep(interval)
    }
}

Robot nyata berjalan

img

Berlari untuk sementara~

img

Perhatikan penyebaran dan kemudian bicarakan tentang hal itu!img


Berkaitan

Lebih banyak