随着最近一波整体市场的急跌,正常的行情已经没有办法获得可观的利润,因此在这种情况之下呢,研究跨期套利也许能实现小回撤,稳定收益的弯道超车。本期要讲的是关于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即为一次交易所得到的收益率。今天的讲解就到此结束了,希望大家能学到点知识。