通过合约对冲策略实现资产移动的思考

Author: 康德, Created: 2020-10-20 16:48:32, Updated: 2023-09-26 20:59:29

img

通过合约对冲策略实现资产移动的思考

最近币圈可谓新闻不断,交易所的新闻也是满天飞。一时间各个币友人心惶惶,纷纷担心自己的区块链资产安全。各个币圈群也不少9折、8折收闲置二手币的小广告。各种“求一边稳定亏钱,一边稳定赚钱的策略”者甚多。也不少币友纷纷调侃“要是有稳定赚钱的,还要那个稳定亏钱的干嘛!” 确实,稳定赚钱、稳定亏钱的东西都是money printer,并不好找到。 原谅我这蹩脚的英语。

但是,不稳定的还是有的,例如通过合约对冲,实现尽量一边亏损,一边盈利。

DEMO策略

/*backtest
start: 2020-09-30 00:00:00
end: 2020-10-19 00:00:00
period: 1d
basePeriod: 1m
exchanges: [{"eid":"Futures_OKCoin","currency":"BTC_USD"},{"eid":"Futures_HuobiDM","currency":"BTC_USD"}]
*/

var step = 20    // 加仓价格步长

function main() {
    var pos1 = []
    var pos2 = []
    var ct = "quarter"                         // 例如用季度合约
    exchanges[0].SetContractType(ct)
    exchanges[1].SetContractType(ct)
    var diff = 0

    while (true) {
        var r1 = exchanges[0].Go("GetDepth")   // A交易所
        var r2 = exchanges[1].Go("GetDepth")   // B交易所
        var depth1 = r1.wait()
        var depth2 = r2.wait()

        if(depth1.Bids[0].Price - depth2.Asks[0].Price > diff) {
            if(pos1.length == 0 && pos2.length == 0) {
                var info1 = $.OpenShort(exchanges[0], ct, 10)
                var info2 = $.OpenLong(exchanges[1], ct, 10)
                pos1 = _C(exchanges[0].GetPosition)
                pos2 = _C(exchanges[1].GetPosition)
                diff = depth1.Bids[0].Price - depth2.Asks[0].Price
            } else if(depth1.Bids[0].Price - depth2.Asks[0].Price > diff + step) {
                var info1 = $.OpenShort(exchanges[0], ct, 10)
                var info2 = $.OpenLong(exchanges[1], ct, 10)
                pos1 = _C(exchanges[0].GetPosition)
                pos2 = _C(exchanges[1].GetPosition)
                diff = depth1.Bids[0].Price - depth2.Asks[0].Price
            }
        }
        
        if(pos1.length != 0 && pos1[0].Profit < -0.001) {
            var info1 = $.CoverShort(exchanges[0], ct, pos1[0].Amount)
            var info2 = $.CoverLong(exchanges[1], ct, pos2[0].Amount)
            pos1 = _C(exchanges[0].GetPosition)
            pos2 = _C(exchanges[1].GetPosition)
            diff = 0
        }
        LogStatus(_D(), diff)
        Sleep(500)
    }
}

img

img

策略逻辑: 策略开始初始化持仓变量pos1、pos2为空数组。策略进入主循环,每次循环开始获取两个交易所的合约的深度数据(订单薄数据),计算差价。差价如果继续扩大超过至“上次差价加一个步长”则继续对冲加仓。当持仓时,检测第一个交易所的持仓亏损超过一定数值(例如:-0.001),则平仓。如此往复执行。

原理实际是很简单的,就是差价大了,反对冲。等待期待亏损的交易所持仓亏损时平仓,如果差价继续扩大,就继续加仓对冲,直到所期待亏损的交易所持仓亏损。比较重要的几个参数就是:亏损多少平仓、加仓差价步长、对冲量这些。

策略比较简陋,仅仅是验证一下思路,实盘并非可用。实盘还有很多问题需要考虑,例如要交易的合约是币本位,还是U本位,A、B交易所的不同合约乘数是否相同等。

这样就实现了一个交易所亏钱,亏的部分大约变为另一个交易所赚的部分(差价问题,可能会有对冲亏损,即亏的比赚的多)。策略使用了一个期货交易类库,$.CoverShort,$.OpenShort这些就是模板的接口函数,上面的DEMO要回测运行,需要引用上这个类库才行。

以上策略原型仅仅是个最简单的小探索,具体实际操作时可能还有更多细节需要考虑,比如加仓量可以设计成递增的。这里只是抛砖引玉,类似策略应该可以有更多的优化,欢迎高手给出建议。


Related

More

骨刀 请尽快实装吧,要是管用我想租用,把我的游戏币提出来

小小梦 作者开头其实说了,不稳定,搞不好是有可能反搬回去的。