avatar of 发明者量化-小小梦 发明者量化-小小梦
fokus pada Pesan pribadi
4
fokus pada
1271
Pengikut

Bagi para pemula dalam Perdagangan Kuantitatif di Dunia Kripto, silakan simak ini - Membawa Anda Lebih Dekat ke Perdagangan Kuantitatif di Dunia Kripto (Bagian 7)

Dibuat di: 2021-06-09 14:30:43, diperbarui pada: 2023-09-19 21:45:29
comments   3
hits   2623

Bagi para pemula dalam Perdagangan Kuantitatif di Dunia Kripto, silakan simak ini - Membawa Anda Lebih Dekat ke Perdagangan Kuantitatif di Dunia Kripto (Bagian 7)

Bagi para pemula dalam Perdagangan Kuantitatif di Dunia Kripto, silakan simak ini - Membawa Anda Lebih Dekat ke Perdagangan Kuantitatif di Dunia Kripto (Bagian 7)

Pada artikel sebelumnya, kita memikirkan dan merancang strategi grid multivariasi yang sederhana. Selanjutnya, kita akan terus belajar dan bergerak maju di jalan perdagangan kuantitatif. Dalam artikel ini, kita akan membahas desain strategi yang lebih kompleks - desain strategi lindung nilai. Artikel ini berencana untuk merancang strategi lindung nilai lintas periode yang beragam. Berbicara tentang strategi lindung nilai lintas periode, mereka yang familier dengan perdagangan berjangka pasti sudah familier dengan strategi ini. Pemula mungkin belum memahami konsep ini, jadi mari kita jelaskan secara singkat konsep lindung nilai antar-periode.

Lindung nilai lintas periode

Lindung nilai lintas periode berarti mengambil posisi long pada satu kontrak, short pada kontrak lain, dan menunggu tiga situasi berikut untuk menutup posisi secara bersamaan:

  • Anda menghasilkan uang saat Anda melakukan long dan kehilangan uang saat Anda melakukan short. Ketika keuntungan di satu sisi (pepatah) lebih besar daripada kerugian di sisi lain (pepatah), tutup posisi tersebut. Setelah keuntungan dan kerugian diimbangi , akan ada keuntungan.
  • Mereka yang mengambil posisi panjang kehilangan uang, mereka yang mengambil posisi pendek mendapat uang, dan Anda menutup posisi Anda ketika keuntungan di satu sisi lebih besar daripada kerugian di sisi lain….(sama seperti di atas).
  • Mereka yang melakukan long (beli) menghasilkan uang, dan mereka yang melakukan short (jual) juga menghasilkan uang, jadi apa lagi yang perlu dipikirkan! Tutup posisi!

Dalam kasus lain, terdapat kerugian mengambang dan Anda dapat mempertahankannya atau terus meningkatkan posisi Anda. (Karena fluktuasi perbedaan harga jauh lebih ringan daripada fluktuasi unilateral, risiko relatifnya lebih kecil. Harap dicatat bahwa ini hanya relatif!)

设A1为合约A在1时刻的价格,设B1为合约B在1时刻的价格,此时做空A合约,做空价格A1,做多B合约,做多价格B1。
设A2为合约A在2时刻的价格,设B2为合约B在2时刻的价格,此时平仓A合约(平空),平空价格A2,平仓B合约(平多),平多价格B2。

1时刻的差价:A1 - B1 = X 
2时刻的差价:A2 - B2 = Y 
X - Y = A1 - B1 - (A2 - B2)
X - Y = A1 - B1 - A2 + B2
X - Y = A1 - A2 + B2 - B1

可以看到,A1 - A2 就是A合约平仓的盈利差价。
B2 - B1就是B合约平仓的盈利差价。只要这两个平仓总体是正数,即:A1 - A2 + B2 - B1 > 0 就是盈利的。也就是说只要X - Y > 0。
因为:X - Y = A1 - A2 + B2 - B1

得出结论,只要开仓时的差价X大于平仓时的差价Y就是盈利的(注意是做空A,做多B开仓,搞反了就是相反的了),当然这个是理论上的,实际上还要考虑手续费、滑点等因素。

Karena pertukaran mata uang digital memiliki kontrak pengiriman dan kontrak abadi. Selain itu, karena tingkat pendanaan, harga kontrak abadi selalu mendekati harga spot. Kemudian kami memilih menggunakan kontrak pengiriman dan kontrak abadi untuk lindung nilai dan arbitrase. Pilih kontrak jangka panjang untuk pengiriman sehingga Anda tidak perlu sering membuat kontrak lindung nilai.

Mari kita pemanasan dengan melakukan statistik perbedaan harga multi-variasi

Setelah Anda memahami prinsip dasar, Anda tidak perlu terburu-buru menulis strategi. Pertama, buatlah statistik tentang perbedaan harga, gambarkan grafik, dan amati perbedaan harganya. Mari belajar cara menggambar diagram strategi multi-variasi.

Kami berbasis padaKontrak OKEXUntuk mendesain, menggambar di FMZ sangatlah mudah, Anda dapat dengan mudah menggambar menggunakan fungsi yang dikemas, pustaka grafiknyaHighcharts. Deskripsi fungsi menggambar pada dokumentasi API: https://www.fmz.com/api#chart...

Karena terdapat banyak jenisnya, Anda harus terlebih dahulu menentukan perbedaan harga dari jenis-jenis tersebut untuk dicetak sebelum menggambar diagram. Pertama tulis dua array dalam kode untuk mewakili kontrak yang akan dibuat.

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"]  // 交割合约

Inisialisasi konfigurasi bagan sesuai dengan kode kontrak yang ditetapkan di sini. Konfigurasi grafik ini tidak boleh di-hardcode, karena Anda tidak tahu produk apa yang akan dibuat atau berapa banyak produk yang akan dibuat (ini ditentukan oleh nilai arrDeliveryContractType dan arrSwapContractType), jadi konfigurasi grafik dikembalikan oleh fungsi .

function createCfg(symbol) {
    var cfg = {
        extension: {
            // 不参于分组,单独显示,默认为分组 'group'
            layout: 'single', 
            // 指定高度,可以设置为字符串,"300px",设置数值300会自动替换为"300px"
            height: 300,      
            // 指定宽度占的单元值,总值为12
            col: 6
        },
        title: {
            text: symbol
        },
        xAxis: {
            type: 'datetime'
        },
        series: [{
            name: 'plus',
            data: []
        }]
    }

    return cfg
}

function main() {
    // 声明arrCfg
    var arrCfg = []                                    // 声明一个数组,用来存放图表配置信息
    _.each(arrSwapContractType, function(ct) {         // 迭代记录永续合约代码的数组,用合约名称XXX-USDT部分作为参数传给createCfg函数,构造图表配置信息,返回
        arrCfg.push(createCfg(formatSymbol(ct)[0]))    // createCfg返回的图表配置信息push进arrCfg数组
    })
    var objCharts = Chart(arrCfg)                      // 调用FMZ平台的图表函数Chart,创建图表控制对象objCharts
    objCharts.reset()                                  // 初始化图表内容
    
    // 以下省略.....
}

Selanjutnya, mari kita persiapkan datanya. Kami menggunakan antarmuka pasar agregat dari kontrak OKEX:

Kontrak Perpetual USDT:

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

Kontrak pengiriman USDT:

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

Kami menulis fungsi untuk menangani panggilan kedua antarmuka ini dan memasukkan data ke 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),             // 买一价
                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 
}

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 memasangkan data yang diperoleh secara berulang, menghitung perbedaan harga, mengeluarkan grafik, dst. Yang diuji di sini adalah perbedaan harga antara kontrak triwulanan berikutnya 210924 dan kontrak abadi. Kode lengkap:

// 临时参数
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: {
            // 不参于分组,单独显示,默认为分组 'group'
            layout: 'single', 
            // 指定高度,可以设置为字符串,"300px",设置数值300会自动替换为"300px"
            height: 300,      
            // 指定宽度占的单元值,总值为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() {
    // 声明arrCfg
    var arrCfg = []
    _.each(arrSwapContractType, function(ct) {
        arrCfg.push(createCfg(formatSymbol(ct)[0]))
    })
    var objCharts = Chart(arrCfg)
    objCharts.reset()
    
    while (true) {
        // 获取行情数据        
        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 : "交割-永续差价",
            cols : ["交易对", "交割", "永续", "正对冲", "反对冲"],
            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)
    }
}

Operasi waktu nyata

Bagi para pemula dalam Perdagangan Kuantitatif di Dunia Kripto, silakan simak ini - Membawa Anda Lebih Dekat ke Perdagangan Kuantitatif di Dunia Kripto (Bagian 7)

Lari sebentar~

Bagi para pemula dalam Perdagangan Kuantitatif di Dunia Kripto, silakan simak ini - Membawa Anda Lebih Dekat ke Perdagangan Kuantitatif di Dunia Kripto (Bagian 7)

Perhatikan dulu perbedaan harganya! /unggah/aset/16a9cc6330dfc9c7fb21.jpg