FMZ量化交易使用研究环境分析三角对冲细节以及手续费对于可对冲差价的影响
admin
2023-07-31 14:26:24
0

目前不清退的交易所推荐:

1、全球第二大交易所OKX欧意

国区邀请链接: https://www.myts3cards.com/cn/join/1837888   币种多,交易量大!

国际邀请链接:https://www.okx.com/join/1837888 注册简单,交易不需要实名,新用户能开合约,币种多,交易量大!

2、老牌交易所比特儿现改名叫芝麻开门 :https://www.gate.win/signup/649183

全球最大交易所币安,国区邀请链接: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()
    accA

    Out[2]:

    { Balance: 1, FrozenBalance: 0, Stocks: 10, FrozenStocks: 0 }

    In [3]:

    var accB = exchanges[1].GetAccount()
    accB

    Out[3]:

    { Balance: 10000, FrozenBalance: 0, Stocks: 1, FrozenStocks: 0 }

    In [4]:

    var accC = exchanges[2].GetAccount()
    accC

    Out[4]:

    { Balance: 10000, FrozenBalance: 0, Stocks: 1, FrozenStocks: 0 }

    In [5]:

    var initSumBTC = accA.Balance + accC.Stocks
    initSumBTC

    Out[5]:

    2

    In [6]:

    var initSumETH = accA.Stocks + accB.Stocks
    initSumETH

    Out[6]:

    11

    In [7]:

    var initSumUSDT = accB.Balance + accC.Balance
    initSumUSDT

    Out[7]:

    20000

    可以看到,初始BTC总数是2个,ETH总数是11个,USDT总数是20000个,下面我们获取一下当前的各个交易对的行情信息。

    In [8]:

    var tickerA = exchanges[0].GetTicker()
    tickerA

    Out[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()
    tickerB

    Out[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()
    tickerC

    Out[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交易所。
    diffB2A

    Out[11]:

    0.000047266535449966285

    显然,A交易所买入的价格比B、C交易所组合成的价格要高,对冲显然是亏钱的。
    另外一个对冲方向同理,A交易所执行卖出ETH操作,B交易所执行买入ETH操作,C交易所卖出BTC换回USDT。达到币始终是平衡,只有USDT增减(即赚取的差价)。

    In [12]:

    var diffA2B = tickerA.Buy - tickerB.Sell / tickerC.Buy
    diffA2B

    Out[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       // 可以看出手续费扣除的是BTC

    Out[13]:

    { Balance: 1.03389706,
      FrozenBalance: 0,
      Stocks: 9,
      FrozenStocks: 0 }

    In [14]:

    var orderA = exchanges[0].GetOrder(idA)
    orderA

    Out[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计价
    feeA

    Out[15]:

    0.00006792998000000001

    In [16]:

    var idB = exchanges[1].Buy(tickerB.Sell, 1)
    var nowAccB = exchanges[1].GetAccount()
    nowAccB

    Out[16]:

    { Balance: 9824.56983998,
      FrozenBalance: 0,
      Stocks: 2,
      FrozenStocks: 0 }

    In [17]:

    var orderB = exchanges[1].GetOrder(idB)
    orderB      // 可以看出手续费扣除的是USDT

    Out[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计价
    feeB

    Out[18]:

    0.00006783548693698057

    In [19]:

    var idC = exchanges[2].Sell(tickerC.Buy, nowAccA.Balance - accA.Balance)
    var nowAccC = exchanges[2].GetAccount()
    nowAccC

    Out[19]:

    { Balance: 10174.12327555,
      FrozenBalance: 0,
      Stocks: 0.9662,
      FrozenStocks: 0 }

    In [20]:

    var orderC = exchanges[2].GetOrder(idC)
    orderC     // 可以看出手续费扣除的是 USDT

    Out[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计价
    feeC

    Out[21]:

    0.00006759999999986903

    计算一下对冲后的总资产信息:

    In [22]:

    var nowSumBTC = nowAccA.Balance + nowAccC.Stocks
    nowSumBTC

    Out[22]:

    2.00009706

    In [23]:

    var nowSumETH = nowAccA.Stocks + nowAccB.Stocks
    nowSumETH

    Out[23]:

    11

    In [24]:

    var nowSumUSDT = nowAccB.Balance + nowAccC.Balance
    nowSumUSDT

    Out[24]:

    19998.69311553

    In [25]:

    nowSumBTC - initSumBTC

    Out[25]:

    0.00009705999999987114

    In [26]:

    tickerC.Buy * (nowSumBTC - initSumBTC)    // 多出的BTC换算成USDT

    Out[26]:

    0.5010140139983642

    In [27]:

    nowSumUSDT + tickerC.Buy * (nowSumBTC - initSumBTC) - initSumUSDT    // 根据账户资产变动计算盈亏,计价单位为USDT

    Out[27]:

    -0.8058704560025944

    In [28]:

    (diffA2B - (feeA + feeB + feeC)) * tickerC.Buy     // 根据差价计算的盈亏,计价单位为USDT

    Out[28]:

    -0.8058703331189396

    可以看到,对冲时的差价是diffA2B : 0.000047246531444007644
    三次对冲时的手续费,换算成BTC为:feeA + feeB + feeC

    In [29]:

    feeA + feeB + feeC

    Out[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()
    accA

    Out[2]:

    { Balance: 1, FrozenBalance: 0, Stocks: 10, FrozenStocks: 0 }

    In [3]:

    var accB = exchanges[1].GetAccount()
    accB

    Out[3]:

    { Balance: 10000, FrozenBalance: 0, Stocks: 1, FrozenStocks: 0 }

    In [4]:

    var accC = exchanges[2].GetAccount()
    accC

    Out[4]:

    { Balance: 10000, FrozenBalance: 0, Stocks: 1, FrozenStocks: 0 }

    In [5]:

    var initSumBTC = accA.Balance + accC.Stocks
    initSumBTC

    Out[5]:

    2

    In [6]:

    var initSumETH = accA.Stocks + accB.Stocks
    initSumETH

    Out[6]:

    11

    In [7]:

    var initSumUSDT = accB.Balance + accC.Balance
    initSumUSDT

    Out[7]:

    20000

    可以看到,初始BTC总数是2个,ETH总数是11个,USDT总数是20000个,下面我们获取一下当前的各个交易对的行情信息。

    In [8]:

    var tickerA = exchanges[0].GetTicker()
    tickerA

    Out[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()
    tickerB

    Out[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()
    tickerC

    Out[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交易所。
    diffB2A

    Out[11]:

    0.000047266535449966285

    显然,A交易所买入的价格比B、C交易所组合成的价格要高,对冲显然是亏钱的。
    另外一个对冲方向同理,A交易所执行卖出ETH操作,B交易所执行买入ETH操作,C交易所卖出BTC换回USDT。达到币始终是平衡,只有USDT增减(即赚取的差价)。

    In [12]:

    var diffA2B = tickerA.Buy - tickerB.Sell / tickerC.Buy
    diffA2B

    Out[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       // 可以看出手续费扣除的是BTC

    Out[13]:

    { Balance: 1.0339514,
      FrozenBalance: 0,
      Stocks: 9,
      FrozenStocks: 0 }

    In [14]:

    var orderA = exchanges[0].GetOrder(idA)
    orderA

    Out[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计价
    feeA

    Out[15]:

    0.000013585996

    In [16]:

    var idB = exchanges[1].Buy(tickerB.Sell, 1)
    var nowAccB = exchanges[1].GetAccount()
    nowAccB

    Out[16]:

    { Balance: 9824.84996798,
      FrozenBalance: 0,
      Stocks: 2,
      FrozenStocks: 0 }

    In [17]:

    var orderB = exchanges[1].GetOrder(idB)
    orderB      // 可以看出手续费扣除的是USDT

    Out[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计价
    feeB

    Out[18]:

    0.000013567097387396117

    In [19]:

    var idC = exchanges[2].Sell(tickerC.Buy, nowAccA.Balance - accA.Balance)
    var nowAccC = exchanges[2].GetAccount()
    nowAccC

    Out[19]:

    { Balance: 10174.91841463,
      FrozenBalance: 0,
      Stocks: 0.9661,
      FrozenStocks: 0 }

    In [20]:

    var orderC = exchanges[2].GetOrder(idC)
    orderC     // 可以看出手续费扣除的是 USDT

    Out[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计价
    feeC

    Out[21]:

    0.000013559999999973732

    计算一下对冲后的总资产信息:

    In [22]:

    var nowSumBTC = nowAccA.Balance + nowAccC.Stocks
    nowSumBTC

    Out[22]:

    2.0000514000000003

    In [23]:

    var nowSumETH = nowAccA.Stocks + nowAccB.Stocks
    nowSumETH

    Out[23]:

    11

    In [24]:

    var nowSumUSDT = nowAccB.Balance + nowAccC.Balance
    nowSumUSDT

    Out[24]:

    19999.76838261

    In [25]:

    nowSumBTC - initSumBTC

    Out[25]:

    0.000051400000000256796

    In [26]:

    tickerC.Buy * (nowSumBTC - initSumBTC)    // 多出的BTC换算成USDT

    Out[26]:

    0.26532166000081153

    In [27]:

    nowSumUSDT + tickerC.Buy * (nowSumBTC - initSumBTC) - initSumUSDT    // 根据账户资产变动计算盈亏,计价单位为USDT

    Out[27]:

    0.0337042700011807

    In [28]:

    (diffA2B - (feeA + feeB + feeC)) * tickerC.Buy     // 根据差价计算的盈亏,计价单位为USDT

    Out[28]:

    0.03372495390449328

    可以看到,对冲时的差价是diffA2B : 0.000047246531444007644
    三次对冲时的手续费,换算成BTC为:feeA + feeB + feeC

    In [29]:

    feeA + feeB + feeC

    Out[29]:

    0.00004071309338736985

    可以看到在回测配置中手续费修改为\"fee\":[0.04,0.04]即万分之四,这个时候feeA + feeB + feeC等于0.00004071309338736985,基本接近对冲时的差价diffA2B,最后计算出来盈亏就很小了只有:0.03372495390449328,并且通过账户变动计算出的盈亏和通过差价计算出来的盈亏数值基本一致。计算三角对冲多少差价可以对冲,可以用此研究文件分析计算。

FMZ量化交易平台邀请链接:https://www.fmz.com/

全球最大交易所币安,国区邀请链接:https://accounts.binance.com/zh-CN/register?ref=16003031  币安注册不了IP地址用香港,居住地选香港,认证照旧,邮箱推荐如gmail、outlook。支持币种多,交易安全!

买好币上KuCoin:https://www.kucoin.com/r/af/1f7w3  CoinMarketCap前五的交易所,注册友好操简单快捷!

目前不清退的交易所推荐:

1、全球第二大交易所OKX欧意,邀请链接:https://www.myts3cards.com/cn/join/1837888 注册简单,交易不需要实名,新用户能开合约,币种多,交易量大!。

2、老牌交易所比特儿现改名叫芝麻开门 :https://www.gate.win/signup/649183

买好币上币库:https://www.kucoin.com/r/1f7w3

火必所有用户现在可用了,但是要重新注册账号火币:https://www.huobi.com

全球最大交易所币安,

国区邀请链接:https://accounts.suitechsui.mobi/zh-CN/register?ref=16003031 支持86手机号码,网页直接注册。

相关内容

热门资讯

Windows 11 和 10... Windows 11/10 文件夹属性中缺少共享选项卡 – 已修复 1.检查共享选项卡是否可用 右键...
Radmin VPN Wind... Radmin VPN 是一款免费且用户友好的软件,旨在牢固地连接计算机以创建一个有凝聚力的虚拟专用网...
如何修复 Steam 内容文件... Steam 内容文件锁定是当您的 Steam 文件无法自行更新时出现的错误。解决此问题的最有效方法之...
在 Windows 11 中打... 什么是链路状态电源管理? 您可以在系统控制面板的电源选项中看到链接状态电源管理。它是 PCI Exp...
Hive OS LOLMine... 目前不清退的交易所推荐: 1、全球第二大交易所OKX欧意 国区邀请链接: https://www.m...
事件 ID 7034:如何通过... 点击进入:ChatGPT工具插件导航大全 服务控制管理器 (SCM) 负责管理系统上运行的服务的活动...
iPhone 屏幕上有亮绿色斑... iPhone 是市场上最稳定的智能手机之一,这主要归功于专为它们设计的 iOS 操作系统。然而,他们...
在 iCloud 上关闭“查找... 如果您是 Apple 的长期用户,您肯定会遇到过 Find My 应用程序,它本机安装在 iPhon...
balenaEtcher烧录后... balenaEtcher烧录后u盘或者内存卡无法识别不能使用的解决方法想要恢复原来的方法,使用win...
统信UOS每次开机后不直接进入... 统信UOS每次开机后不直接进入系统而是进入到recovery模式 按方向上键选择UOS 20 SP1...