OKEX合约跨期套利开仓详解

Words
1293
Reading
6 min
Listen
Play
8y

 随着最近一波整体市场的急跌,正常的行情已经没有办法获得可观的利润,因此在这种情况之下呢,研究跨期套利也许能实现小回撤,稳定收益的弯道超车。本期要讲的是关于OKEX上如何进行跨期套利的仓位计算,以及交易成本的问题。

有一天我的老师在群里发了一张这样的图片,然后说它很有意思让我们自己去琢磨琢磨。说实话它确实挺有意思的,虽然我至今不知道他想表达什么内容(开了3个仓,而且多空同开),但是这作为一个跨期套利的开仓单,他的多空持仓量并不相等,而且收益率按照理论上来讲应该爆仓但是并没有爆仓。而且为什么我们选择做期期套利的原因也在这张图里,OKEX的合约交易是可以开X20的杠杆,分摊到多空上面也可以开10倍的杠杆,因为期货合约的波动关于现货设有一个上下限的,所以只要计算好保证金的数量,就可以保证永远不爆仓(跨期套利必须建立在账户的开仓方式为全仓的基础上)。接下来解释一下如何计算仓位,在这里我们要先提一下OKEX计算合约收益率的问题。

与一般的期货交易不同的是,它的合约价值永远=10USD,而且是按照一张一张合约分开来买的,所以计算方式参考上面这个公式。跨期套利的要点是:在跨期合约的价格相差比例一定时,不论现货的价格如何波动,收益不变。但是我们现在要进行的这个跨期套利与一般的跨期套利又有所不同,在OKEX的合约交易中,保证金使用的是当时合约开仓的货币(假设我们这里使用的EOS),因此如果要保证在价格改变的情况下所能换取的USDT不改变,要考虑到保证金EOS的变化(在这里的保证金EOS相当于买了一个EOS的现货多仓)。

因为是要求等比例变化情况下收入不变,所以 当 之后  以上就是对跨期合约仓位计算的理论部分,接下来上代码:

  • 主程序部分
def yield_stimulate(start_cash_price, start_this_week_price, start_quarter_price, end_cash_price, end_this_week_price,

                  end_quarter_price, cash, signal='sell'):

   eos_amount = cash / start_cash_price * 0.998

   amount = okex_caculate_asset(cash_price=start_cash_price, this_week_price=start_this_week_price,

                                quarter_price=start_quarter_price, cash=cash, signal=signal)

上面先是对USDT到EOS进行了一个转换,然后进入了计算多空合约数量的部分,在这里我把现货当成了一个买多的合约带入了上面那个公式,先计算现货跟卖空合约的关系,再把总合约里的这部分卖空合约减掉。

def okex_caculate_asset(cash_price, this_week_price, quarter_price, cash, signal):

   eos_amount = int(cash / cash_price)

   cash = cash * 20 * 0.998

   contract_amount = int(cash / 10) - 3

然后对contract数量进行一个初始化,合约数量不能完全接近其最大合约数量,OKEX有一个规定就是保证金率必须大于90%(保证金率详情请见OKEX官网),所以-3保证交易成功。

if signal == 'buy':

       this_week_amount =int(cash / 20 / 10 * (this_week_price / cash_price) ** 2)

       contract_amount = contract_amount - this_week_amount

       quarter_amount =  contract_amount * (quarter_price ** 2) /( (this_week_price ** 2)+ (quarter_price ** 2))

       this_week_amount = this_week_amount + contract_amount - quarter_amount

       amount = (quarter_amount, this_week_amount)

当要进行的操作为买多季度合约,卖空当周合约时,signal=‘buy’然后进行如上计算。cash/20/10是先让cash变回现金,然后再计算现金相当于的合约数量。

elif signal == 'sell':

       quarter_amount = int(cash / 20 / 10 * (quarter_price / cash_price) ** 2)

       contract_amount = contract_amount - quarter_amount

       this_week_amount = contract_amount * (this_week_price ** 2) / ((this_week_price ** 2)+ (quarter_price ** 2))

       quarter_amount = quarter_amount + contract_amount - this_week_amount

       amount = (this_week_amount, quarter_amount)

   return amount

此操作为买多当周合约,卖空季度合约时的计算,返回值为一个元组,amount[0]为买多合约的数量,amount[1]为卖空合约的数量,回到了原来的计算收益率的部分。

if signal =='sell':

   buy_profit = amount[0] * (10 / start_this_week_price - 10 / end_this_week_price) * end_this_week_price

   sell_profit = amount[1] * (10 / end_quarter_price - 10 / start_quarter_price) * end_quarter_price

elif signal =='buy':

   buy_profit = amount[0] * (10 / start_this_week_price - 10 / end_this_week_price) * end_quarter_price

   sell_profit = amount[1] * (10 / end_quarter_price - 10 / start_quarter_price) * end_this_week_price

eos_amount = eos_amount - 0.0005 * (amount[0] + amount[1]) * 10 / start_cash_price - 0.0005 * (

amount[0] + amount[1]) * 10 / end_cash_price

end_cash = eos_amount * end_cash_price * 0.998

yield_rate = (end_cash + buy_profit + sell_profit) / cash

后面除了原来计算开空跟开多的部分以外,还要在最后结算的时候减去手续费,合约手续费在市价单时一次交易为0.05%,币币交易市价单手续费为0.2%。此时返回的yield_rate即为一次交易所得到的收益率。今天的讲解就到此结束了,希望大家能学到点知识。 

OKEX合约跨期套利开仓详解 | Ecency