avatar of 发明者量化-小小梦 发明者量化-小小梦
집중하다 사신
4
집중하다
1271
수행원

암호화폐 업계의 양적 거래 초보자 여러분, 이 글을 꼭 읽어보세요 - 암호화폐 업계의 양적 거래에 한 걸음 더 다가가기(7부)

만든 날짜: 2021-06-09 14:30:43, 업데이트 날짜: 2023-09-19 21:45:29
comments   3
hits   2623

암호화폐 업계의 양적 거래 초보자 여러분, 이 글을 꼭 읽어보세요 - 암호화폐 업계의 양적 거래에 한 걸음 더 다가가기(7부)

암호화폐 업계의 양적 거래 초보자 여러분, 이 글을 꼭 읽어보세요 - 암호화폐 업계의 양적 거래에 한 걸음 더 다가가기(7부)

이전 기사에서는 다양한 품종을 활용한 간단한 그리드 전략에 대해 고민하고 설계해 보았습니다. 앞으로도 양적 거래의 길에서 계속해서 학습하고 발전해 나가겠습니다. 이 글에서는 좀 더 복잡한 전략 설계, 즉 헤지 전략 설계에 대해 논의해보겠습니다. 이 글에서는 다양한 교차 기간 헤지 전략을 설계할 계획입니다. 교차 기간 헤지 전략에 대해 말하자면, 선물 거래에 익숙한 사람이라면 이에 대해 잘 알고 있을 것입니다. 초보자는 아직 이러한 개념을 이해하지 못할 수 있으므로, 먼저 기간 간 헤지 개념에 대해 간략하게 설명하겠습니다.

기간 간 헤지

기간 간 헤지거래는 한 계약에 롱 포지션을 취하고, 다른 계약에 숏 포지션을 취한 다음, 다음 세 가지 상황이 발생하여 포지션을 동시에 마감할 때까지 기다리는 것을 의미합니다.

  • 롱 포지션을 취하면 돈을 벌고 숏 포지션을 취하면 돈을 잃습니다. 한 쪽의 이익(속담)이 다른 쪽의 손실(속담)보다 클 때 포지션을 마감합니다. 이익과 손실이 상쇄된 후 , 약간의 이익이 있을 것이다.
  • 롱 포지션을 취하는 사람은 돈을 잃고, 숏 포지션을 취하는 사람은 돈을 벌고, 한 쪽의 수익이 다른 쪽의 손실보다 클 때 포지션을 종료합니다…(위와 동일).
  • 롱 포지션을 취하는 사람은 돈을 벌고, 숏 포지션을 취하는 사람도 돈을 벌죠. 그러면 더 생각할 게 뭐가 있겠어요! 포지션을 종료하세요!

다른 경우에는 변동 손실이 발생하고, 이를 유지하거나 포지션을 계속 늘릴 수 있습니다. (가격 차이 변동은 일방적 변동보다 훨씬 완만하므로 상대적 위험은 더 작습니다. 상대적일 뿐임을 유의하세요!)

设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开仓,搞反了就是相反的了),当然这个是理论上的,实际上还要考虑手续费、滑点等因素。

디지털 화폐 거래소에는 인도 계약과 영구 계약이 모두 있기 때문입니다. 또한, 자금 조달 비율로 인해 영구 계약의 가격은 항상 현물 가격과 가깝습니다. 그러면 헤지와 차익거래를 위해 인도 계약과 영구 계약을 사용하기로 합니다. 자주 헤지 계약을 맺지 않아도 되도록 장기 납품 계약을 선택하세요.

다양한 종류의 가격 차이 통계를 통해 워밍업을 해 보겠습니다.

기본 원칙을 익히면 서둘러 전략을 작성할 필요가 없습니다. 먼저, 가격 차이에 대한 통계를 만들고, 그래프를 그려 가격 차이를 관찰합니다. 다양한 전략 차트를 그리는 방법을 알아보겠습니다.

우리는 ~에 기초하고 있습니다OKEX 계약FMZ에서 디자인하고 그리는 것은 매우 간단합니다. 패키지된 함수를 사용하여 쉽게 그릴 수 있으며 차트 라이브러리는 다음과 같습니다.Highcharts. API 문서에 대한 그리기 함수 설명: https://www.fmz.com/api#chart...

다양한 품종이 있으므로 차트를 그리기 전에 먼저 해당 품종의 가격 차이를 파악하여 인쇄해야 합니다. 먼저, 계약을 나타내는 두 개의 배열을 코드에 작성합니다.

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

여기에 설정된 계약 코드에 따라 차트 구성을 초기화합니다. 이 차트 구성은 하드코딩되어서는 안 됩니다. 어떤 제품을 만들어야 할지 또는 몇 개의 제품을 만들어야 할지 알 수 없기 때문입니다(이는 arrDeliveryContractType 및 arrSwapContractType의 값에 따라 결정됨). 따라서 차트 구성은 함수에서 반환됩니다. .

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()                                  // 初始化图表内容
    
    // 以下省略.....
}

다음으로, 데이터를 준비합시다. OKEX 계약의 통합 시장 인터페이스를 사용합니다.

USDT 영구 계약:

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

USDT 배달 계약:

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

우리는 이 두 인터페이스의 호출을 처리하고 데이터를 다음과 같은 형식으로 정리하는 함수를 작성합니다.

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 formatSymbol(originalSymbol) {
    var arr = originalSymbol.split("-")
    return [arr[0] + "_" + arr[1], arr[0], arr[1]]
}

남은 것은 획득한 데이터를 반복적으로 페어링하고, 가격 차이를 계산하고, 차트를 출력하는 등의 작업입니다. 여기서 테스트하는 것은 다음 분기 계약 210924와 영구 계약 간의 가격 차이입니다. 전체 코드:

// 临时参数
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)
    }
}

실시간 운영

암호화폐 업계의 양적 거래 초보자 여러분, 이 글을 꼭 읽어보세요 - 암호화폐 업계의 양적 거래에 한 걸음 더 다가가기(7부)

잠깐 달려요~

암호화폐 업계의 양적 거래 초보자 여러분, 이 글을 꼭 읽어보세요 - 암호화폐 업계의 양적 거래에 한 걸음 더 다가가기(7부)

먼저 가격 차이를 살펴보세요! /업로드/자산/16a9cc6330dfc9c7fb21.jpg