Trong bài viết trước đây, chúng tôi đã nghĩ và thiết kế một chiến lược lưới đa loài đơn giản cùng nhau. Tiếp theo, chúng tôi sẽ tiếp tục học và tiến lên trên con đường giao dịch định lượng. Trong bài viết này, chúng tôi sẽ khám phá một thiết kế chiến lược phức tạp hơn - thiết kế các chiến lược phòng ngừa rủi ro. Bài viết này dự định thiết kế một chiến lược phòng ngừa rủi ro liên thời gian đa loài. Khi nói đến các chiến lược phòng ngừa rủi ro liên thời gian, những người quen thuộc với giao dịch tương lai phải quen thuộc với nó. Đối với người mới bắt đầu, họ có thể không hiểu các khái niệm này, vì vậy hãy bắt đầu với một lời giải thích ngắn gọn về khái niệm phòng ngừa rủi ro liên thời gian.
Nói một cách đơn giản, phòng ngừa rủi ro giữa thời gian là mua dài hợp đồng, mua ngắn hợp đồng và chờ ba tình huống (dài và ngắn) để đóng vị trí cùng một lúc:
Trong các trường hợp khác là tổn thất lơ lửng, mang hoặc tiếp tục tăng tỷ lệ trong vị trí (vì biến động chênh lệch là ôn hòa hơn so với biến động đơn phương, rủi ro tương đối nhỏ hơn, lưu ý rằng chỉ tương đối!)
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.
Bởi vì sàn giao dịch tiền điện tử có cả hợp đồng giao hàng và hợp đồng vĩnh cửu. Và giá của hợp đồng vĩnh cửu luôn gần với giá ngay lập tức do tỷ lệ tài trợ. Sau đó chúng tôi chọn sử dụng hợp đồng giao hàng và hợp đồng vĩnh cửu để điều khoản phòng hộ. Hợp đồng giao hàng chọn hợp đồng dài hạn hơn, do đó hợp đồng phòng hộ không cần phải được đặt thường xuyên.
Một khi bạn đã quen thuộc với các nguyên tắc cơ bản, bạn không cần phải vội vàng viết các chiến lược. Trước hết, bạn có thể có được một thống kê lan rộng, vẽ biểu đồ và quan sát sự lan rộng.
Chúng tôi thiết kế dựa trênHợp đồng OKEX. Nó rất đơn giản để vẽ trên FMZ. Nó rất dễ dàng để sử dụng các chức năng đóng gói để vẽ. thư viện biểu đồ làBiểu đồ cao. Mô tả chức năng vẽ trên tài liệu API:https://www.fmz.com/api#chart...
Vì nó là một đa loài, trước hết, nó là cần thiết để xác định sự khác biệt giá của các loài đó trước khi vẽ.
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
Bắt đầu cấu hình biểu đồ theo mã hợp đồng được thiết lập ở đây. cấu hình biểu đồ này chắc chắn không thể được mã hóa cứng, bởi vì bạn không biết loại nào và bao nhiêu loại để làm (đây được xác định bởi các giá trị của arrDeliveryContractType và arrSwapContractType), vì vậy cấu hình biểu đồ được trả về bởi một hàm.
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 ...
}
Tiếp theo, hãy chuẩn bị dữ liệu. Chúng tôi sử dụng giao diện thị trường tổng hợp của hợp đồng OKEX:
Hợp đồng vĩnh viễn USDT:
https://www.okex.com/api/v5/market/tickers?instType=SWAP
Hợp đồng giao hàng bằng USDT:
https://www.okex.com/api/v5/market/tickers?instType=FUTURES
Chúng ta viết một hàm để xử lý các cuộc gọi của hai giao diện này và đưa dữ liệu vào một định dạng:
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
}
Viết một hàm khác để xử lý mã hợp đồng
function formatSymbol(originalSymbol) {
var arr = originalSymbol.split("-")
return [arr[0] + "_" + arr[1], arr[0], arr[1]]
}
Tất cả những gì còn lại là ghép nối dữ liệu thu được lặp đi lặp lại, tính toán chênh lệch, biểu đồ đầu ra, vv Thử nghiệm ở đây là chênh lệch giữa hợp đồng quý hai 210924 và hợp đồng vĩnh viễn. Mã đầy đủ:
// 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)
}
}
Chạy một thời gian~
Quan sát sự lây lan và sau đó nói về nó!