目前不清退的交易所推荐:
1、全球第二大交易所OKX欧意
国区邀请链接: https://www.jsqkmfytwpn.com/join/1837888 币种多,交易量大!
国际邀请链接:https://www.okx.com/join/1837888 注册简单,交易不需要实名,新用户能开合约,币种多,交易量大!
2、老牌交易所比特儿现改名叫芝麻开门 :https://www.gateport.business/share/XgRDAQ8
全球最大交易所币安,国区邀请链接:https://accounts.binance.com/zh-CN/register?ref=16003031 币安注册不了IP地址用香港,居住地选香港,认证照旧,邮箱推荐如gmail、outlook。支持币种多,交易安全!
买好币上KuCoin:https://www.kucoin.com/r/af/1f7w3 CoinMarketCap前五的交易所,注册友好操简单快捷!
FMZ量化交易平台邀请链接:https://www.fmz.com/
使用研究环境分析三角对冲细节以及手续费对于可对冲差价的影响
-
没有调整手续费的研究版本
三角对冲.ipynb下载In [1]:var fmz = require("fmz") // 引入后自动导入 talib, TA, plot 库 var task = fmz.VCtx({ start: '2019-04-09 17:49:00', end: '2019-04-09 18:00:00', period: '1m', exchanges: [{"eid":"Huobi","currency":"ETH_BTC", "balance":1, "stocks":10},{"eid":"OKEX","currency":"ETH_USDT","balance":10000,"stocks":1}, {"eid":"OKEX","currency":"BTC_USDT","balance":10000,"stocks":1}] })显示最初交易所账户信息和行情:
- A交易所交易对为:ETH_BTC
- B交易所交易对为:ETH_USDT
- C交易所交易对为:BTC_USDT
In [2]:var accA = exchanges[0].GetAccount() accAOut[2]:{ Balance: 1, FrozenBalance: 0, Stocks: 10, FrozenStocks: 0 }In [3]:var accB = exchanges[1].GetAccount() accBOut[3]:{ Balance: 10000, FrozenBalance: 0, Stocks: 1, FrozenStocks: 0 }In [4]:var accC = exchanges[2].GetAccount() accCOut[4]:{ Balance: 10000, FrozenBalance: 0, Stocks: 1, FrozenStocks: 0 }In [5]:var initSumBTC = accA.Balance + accC.Stocks initSumBTCOut[5]:2
In [6]:var initSumETH = accA.Stocks + accB.Stocks initSumETHOut[6]:11
In [7]:var initSumUSDT = accB.Balance + accC.Balance initSumUSDTOut[7]:20000
可以看到,初始BTC总数是2个,ETH总数是11个,USDT总数是20000个,下面我们获取一下当前的各个交易对的行情信息。
In [8]:var tickerA = exchanges[0].GetTicker() tickerAOut[8]:{ Time: 1554831960000, High: 0.03396501, Low: 0.03396499, Sell: 0.03396501, Buy: 0.03396499, Last: 0.033965, Volume: 4696.555, OpenInterest: 0 }In [9]:var tickerB = exchanges[1].GetTicker() tickerBOut[9]:{ Time: 1554831960000, High: 175.08000001, Low: 175.07999999, Sell: 175.08000001, Buy: 175.07999999, Last: 175.08, Volume: 20730.37, OpenInterest: 0 }In [10]:var tickerC = exchanges[2].GetTicker() tickerCOut[10]:{ Time: 1554831960000, High: 5161.90000001, Low: 5161.89999999, Sell: 5161.90000001, Buy: 5161.89999999, Last: 5161.9, Volume: 2109.9292, OpenInterest: 0 }可以看到A交易所,B交易所,交易的标的物都是ETH,即A/B交易所可以进行间接对冲操作,无法直接对冲是因为,计价币种不同。A交易所计价币种是BTC,B交易所的计价币种是USDT。
假设对于A交易所做买入操作exchanges[0].Buy(price, amount),买入时根据对手卖出的价格作为下单价格,即tickerA.Sell,B交易所为了对冲,就要进行卖出操作,即exchanges[1].Sell(price, amount),卖出时根据对手要买入的价格作为下单价格,即:tickerB.Buy。因为A交易所买入时消耗了BTC,B交易所卖出时得到了USDT,需要把USDT换成BTC,补缺A交易所消耗使用的BTC,即C交易所执行exchanges[2].Buy(price, amount),把USDT换成BTC,C交易所要买入,需要看对手的卖出价格,即tickerC.Sell,A交易所买入的价格一定要比B交易所卖出的价格低,那么C交易所只用花少一些的USDT就能买回来A交易所消耗掉的BTC。就赚到了USDT金额差。
所以如下:In [11]:var diffB2A = tickerA.Sell - tickerB.Buy / tickerC.Sell // diffB2A 即 B交易所卖出ETH币,A交易所买入ETH币,逻辑上相当于ETH从B交易所转移到A交易所。 diffB2AOut[11]:0.000047266535449966285
显然,A交易所买入的价格比B、C交易所组合成的价格要高,对冲显然是亏钱的。
另外一个对冲方向同理,A交易所执行卖出ETH操作,B交易所执行买入ETH操作,C交易所卖出BTC换回USDT。达到币始终是平衡,只有USDT增减(即赚取的差价)。In [12]:var diffA2B = tickerA.Buy - tickerB.Sell / tickerC.Buy diffA2BOut[12]:0.000047246531444007644
我们执行一次
tickerA.Buy - tickerB.Sell / tickerC.Buy的对冲操作,对其中的各个数值变化一探究竟。In [13]:var idA = exchanges[0].Sell(tickerA.Buy, 1) var nowAccA = exchanges[0].GetAccount() nowAccA // 可以看出手续费扣除的是BTCOut[13]:{ Balance: 1.03389706, FrozenBalance: 0, Stocks: 9, FrozenStocks: 0 }In [14]:var orderA = exchanges[0].GetOrder(idA) orderAOut[14]:{ Id: 1, Price: 0.03396499, Amount: 1, DealAmount: 1, AvgPrice: 0.03396499, Type: 1, Offset: 0, Status: 1, ContractType: 'ETH_BTC_Huobi' }In [15]:var feeRatioA = 0.002 // 回测默认的手续费是 千分之2,即 0.002 var feeA = orderA.DealAmount * orderA.AvgPrice * feeRatioA // A交易所交易的手续费,BTC计价 feeAOut[15]:0.00006792998000000001
In [16]:var idB = exchanges[1].Buy(tickerB.Sell, 1) var nowAccB = exchanges[1].GetAccount() nowAccBOut[16]:{ Balance: 9824.56983998, FrozenBalance: 0, Stocks: 2, FrozenStocks: 0 }In [17]:var orderB = exchanges[1].GetOrder(idB) orderB // 可以看出手续费扣除的是USDTOut[17]:{ Id: 1, Price: 175.08000001, Amount: 1, DealAmount: 1, AvgPrice: 175.08000001, Type: 0, Offset: 0, Status: 1, ContractType: 'ETH_USDT_OKEX' }In [18]:var feeRatioB = 0.002 var feeB = orderB.DealAmount * orderB.AvgPrice * feeRatioB / tickerC.Last // B交易所的手续费,换算成BTC计价 feeBOut[18]:0.00006783548693698057
In [19]:var idC = exchanges[2].Sell(tickerC.Buy, nowAccA.Balance - accA.Balance) var nowAccC = exchanges[2].GetAccount() nowAccCOut[19]:{ Balance: 10174.12327555, FrozenBalance: 0, Stocks: 0.9662, FrozenStocks: 0 }In [20]:var orderC = exchanges[2].GetOrder(idC) orderC // 可以看出手续费扣除的是 USDTOut[20]:{ Id: 1, Price: 5161.89999999, Amount: 0.0338, DealAmount: 0.0338, AvgPrice: 5161.89999999, Type: 1, Offset: 0, Status: 1, ContractType: 'BTC_USDT_OKEX' }In [21]:var feeRatioC = 0.002 var feeC = orderC.DealAmount * orderC.AvgPrice * feeRatioC / tickerC.Last // C交易所交易的手续费,BTC计价 feeCOut[21]:0.00006759999999986903
计算一下对冲后的总资产信息:
In [22]:var nowSumBTC = nowAccA.Balance + nowAccC.Stocks nowSumBTCOut[22]:2.00009706
In [23]:var nowSumETH = nowAccA.Stocks + nowAccB.Stocks nowSumETHOut[23]:11
In [24]:var nowSumUSDT = nowAccB.Balance + nowAccC.Balance nowSumUSDTOut[24]:19998.69311553
In [25]:nowSumBTC - initSumBTCOut[25]:0.00009705999999987114
In [26]:tickerC.Buy * (nowSumBTC - initSumBTC) // 多出的BTC换算成USDTOut[26]:0.5010140139983642
In [27]:nowSumUSDT + tickerC.Buy * (nowSumBTC - initSumBTC) - initSumUSDT // 根据账户资产变动计算盈亏,计价单位为USDTOut[27]:-0.8058704560025944
In [28]:(diffA2B - (feeA + feeB + feeC)) * tickerC.Buy // 根据差价计算的盈亏,计价单位为USDTOut[28]:-0.8058703331189396
可以看到,对冲时的差价是
diffA2B: 0.000047246531444007644
三次对冲时的手续费,换算成BTC为:feeA + feeB + feeCIn [29]:feeA + feeB + feeCOut[29]:0.0002033654669368496
可以看出这样的三角对冲,差价至少要大于
feeA + feeB + feeC才是不亏不赚,要盈利就必须大于这个差价。
目前通过账户对比计算、通过差价计算,都是亏损,亏损大概为:-0.8058704560025944
我修改了一个版本,让手续费参数计算出的手续费正好等于这个模型测试的行情时的差价盈利,用于对比观察。可以看到,在手续费默认的情况下(默认为千分之2),对冲差价为:0.000047246531444007644 BTC时,对冲是亏钱的,大概亏损:-0.8058704560025944
-
调整手续费的研究版本
三角对冲(调整手续费率).ipynb下载In [1]:var fmz = require("fmz") // 引入后自动导入 talib, TA, plot 库 var task = fmz.VCtx({ start: '2019-04-09 17:49:00', end: '2019-04-09 18:00:00', period: '1m', exchanges: [{"eid":"Huobi","currency":"ETH_BTC", "balance":1, "stocks":10,"fee":[0.04,0.04]},{"eid":"OKEX","currency":"ETH_USDT","balance":10000,"stocks":1,"fee":[0.04,0.04]}, {"eid":"OKEX","currency":"BTC_USDT","balance":10000,"stocks":1,"fee":[0.04,0.04]}] })显示最初交易所账户信息和行情:
- A交易所交易对为:ETH_BTC
- B交易所交易对为:ETH_USDT
- C交易所交易对为:BTC_USDT
In [2]:var accA = exchanges[0].GetAccount() accAOut[2]:{ Balance: 1, FrozenBalance: 0, Stocks: 10, FrozenStocks: 0 }In [3]:var accB = exchanges[1].GetAccount() accBOut[3]:{ Balance: 10000, FrozenBalance: 0, Stocks: 1, FrozenStocks: 0 }In [4]:var accC = exchanges[2].GetAccount() accCOut[4]:{ Balance: 10000, FrozenBalance: 0, Stocks: 1, FrozenStocks: 0 }In [5]:var initSumBTC = accA.Balance + accC.Stocks initSumBTCOut[5]:2
In [6]:var initSumETH = accA.Stocks + accB.Stocks initSumETHOut[6]:11
In [7]:var initSumUSDT = accB.Balance + accC.Balance initSumUSDTOut[7]:20000
可以看到,初始BTC总数是2个,ETH总数是11个,USDT总数是20000个,下面我们获取一下当前的各个交易对的行情信息。
In [8]:var tickerA = exchanges[0].GetTicker() tickerAOut[8]:{ Time: 1554831960000, High: 0.03396501, Low: 0.03396499, Sell: 0.03396501, Buy: 0.03396499, Last: 0.033965, Volume: 4696.555, OpenInterest: 0 }In [9]:var tickerB = exchanges[1].GetTicker() tickerBOut[9]:{ Time: 1554831960000, High: 175.08000001, Low: 175.07999999, Sell: 175.08000001, Buy: 175.07999999, Last: 175.08, Volume: 20730.37, OpenInterest: 0 }In [10]:var tickerC = exchanges[2].GetTicker() tickerCOut[10]:{ Time: 1554831960000, High: 5161.90000001, Low: 5161.89999999, Sell: 5161.90000001, Buy: 5161.89999999, Last: 5161.9, Volume: 2109.9292, OpenInterest: 0 }可以看到A交易所,B交易所,交易的标的物都是ETH,即A/B交易所可以进行间接对冲操作,无法直接对冲是因为,计价币种不同。A交易所计价币种是BTC,B交易所的计价币种是USDT。
假设对于A交易所做买入操作exchanges[0].Buy(price, amount),买入时根据对手卖出的价格作为下单价格,即tickerA.Sell,B交易所为了对冲,就要进行卖出操作,即exchanges[1].Sell(price, amount),卖出时根据对手要买入的价格作为下单价格,即:tickerB.Buy。因为A交易所买入时消耗了BTC,B交易所卖出时得到了USDT,需要把USDT换成BTC,补缺A交易所消耗使用的BTC,即C交易所执行exchanges[2].Buy(price, amount),把USDT换成BTC,C交易所要买入,需要看对手的卖出价格,即tickerC.Sell,A交易所买入的价格一定要比B交易所卖出的价格低,那么C交易所只用花少一些的USDT就能买回来A交易所消耗掉的BTC。就赚到了USDT金额差。
所以如下:In [11]:var diffB2A = tickerA.Sell - tickerB.Buy / tickerC.Sell // diffB2A 即 B交易所卖出ETH币,A交易所买入ETH币,逻辑上相当于ETH从B交易所转移到A交易所。 diffB2AOut[11]:0.000047266535449966285
显然,A交易所买入的价格比B、C交易所组合成的价格要高,对冲显然是亏钱的。
另外一个对冲方向同理,A交易所执行卖出ETH操作,B交易所执行买入ETH操作,C交易所卖出BTC换回USDT。达到币始终是平衡,只有USDT增减(即赚取的差价)。In [12]:var diffA2B = tickerA.Buy - tickerB.Sell / tickerC.Buy diffA2BOut[12]:0.000047246531444007644
我们执行一次
tickerA.Buy - tickerB.Sell / tickerC.Buy的对冲操作,对其中的各个数值变化一探究竟。In [13]:var idA = exchanges[0].Sell(tickerA.Buy, 1) var nowAccA = exchanges[0].GetAccount() nowAccA // 可以看出手续费扣除的是BTCOut[13]:{ Balance: 1.0339514, FrozenBalance: 0, Stocks: 9, FrozenStocks: 0 }In [14]:var orderA = exchanges[0].GetOrder(idA) orderAOut[14]:{ Id: 1, Price: 0.03396499, Amount: 1, DealAmount: 1, AvgPrice: 0.03396499, Type: 1, Offset: 0, Status: 1, ContractType: 'ETH_BTC_Huobi' }In [15]:var feeRatioA = 0.0004 // 回测默认的手续费是 千分之2,即 0.002 var feeA = orderA.DealAmount * orderA.AvgPrice * feeRatioA // A交易所交易的手续费,BTC计价 feeAOut[15]:0.000013585996
In [16]:var idB = exchanges[1].Buy(tickerB.Sell, 1) var nowAccB = exchanges[1].GetAccount() nowAccBOut[16]:{ Balance: 9824.84996798, FrozenBalance: 0, Stocks: 2, FrozenStocks: 0 }In [17]:var orderB = exchanges[1].GetOrder(idB) orderB // 可以看出手续费扣除的是USDTOut[17]:{ Id: 1, Price: 175.08000001, Amount: 1, DealAmount: 1, AvgPrice: 175.08000001, Type: 0, Offset: 0, Status: 1, ContractType: 'ETH_USDT_OKEX' }In [18]:var feeRatioB = 0.0004 var feeB = orderB.DealAmount * orderB.AvgPrice * feeRatioB / tickerC.Last // B交易所的手续费,换算成BTC计价 feeBOut[18]:0.000013567097387396117
In [19]:var idC = exchanges[2].Sell(tickerC.Buy, nowAccA.Balance - accA.Balance) var nowAccC = exchanges[2].GetAccount() nowAccCOut[19]:{ Balance: 10174.91841463, FrozenBalance: 0, Stocks: 0.9661, FrozenStocks: 0 }In [20]:var orderC = exchanges[2].GetOrder(idC) orderC // 可以看出手续费扣除的是 USDTOut[20]:{ Id: 1, Price: 5161.89999999, Amount: 0.0339, DealAmount: 0.0339, AvgPrice: 5161.89999999, Type: 1, Offset: 0, Status: 1, ContractType: 'BTC_USDT_OKEX' }In [21]:var feeRatioC = 0.0004 var feeC = orderC.DealAmount * orderC.AvgPrice * feeRatioC / tickerC.Last // C交易所交易的手续费,BTC计价 feeCOut[21]:0.000013559999999973732
计算一下对冲后的总资产信息:
In [22]:var nowSumBTC = nowAccA.Balance + nowAccC.Stocks nowSumBTCOut[22]:2.0000514000000003
In [23]:var nowSumETH = nowAccA.Stocks + nowAccB.Stocks nowSumETHOut[23]:11
In [24]:var nowSumUSDT = nowAccB.Balance + nowAccC.Balance nowSumUSDTOut[24]:19999.76838261
In [25]:nowSumBTC - initSumBTCOut[25]:0.000051400000000256796
In [26]:tickerC.Buy * (nowSumBTC - initSumBTC) // 多出的BTC换算成USDTOut[26]:0.26532166000081153
In [27]:nowSumUSDT + tickerC.Buy * (nowSumBTC - initSumBTC) - initSumUSDT // 根据账户资产变动计算盈亏,计价单位为USDTOut[27]:0.0337042700011807
In [28]:(diffA2B - (feeA + feeB + feeC)) * tickerC.Buy // 根据差价计算的盈亏,计价单位为USDTOut[28]:0.03372495390449328
可以看到,对冲时的差价是
diffA2B: 0.000047246531444007644
三次对冲时的手续费,换算成BTC为:feeA + feeB + feeCIn [29]:feeA + feeB + feeCOut[29]:0.00004071309338736985
可以看到在回测配置中手续费修改为
"fee":[0.04,0.04]即万分之四,这个时候feeA + feeB + feeC等于0.00004071309338736985,基本接近对冲时的差价diffA2B,最后计算出来盈亏就很小了只有:0.03372495390449328,并且通过账户变动计算出的盈亏和通过差价计算出来的盈亏数值基本一致。计算三角对冲多少差价可以对冲,可以用此研究文件分析计算。
2026币圈信息集合









