Menggunakan persekitaran penyelidikan untuk menganalisis butiran lindung nilai segitiga dan kesan yuran pengendalian pada perbezaan harga lindung nilai

Penulis:Lydia, Dicipta: 2022-12-29 09:46:17, Dikemas kini: 2023-09-20 09:55:09

img

Menggunakan persekitaran penyelidikan untuk menganalisis butiran lindung nilai segitiga dan kesan yuran pengendalian pada perbezaan harga lindung nilai

Versi penyelidikan tanpa penyesuaian yuran pengendalian

Perlindungan segitiga.ipynb

Dalam [1]:

var fmz = require("fmz")                           // Import the talib, TA, and plot libraries automatically after import.
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}]
})

Penampakan maklumat akaun pertukaran awal dan tanda:

  • Pasangan dagangan di Bursa A ialah: ETH_BTC
  • Pasangan dagangan di Bursa B ialah: ETH_USDT
  • Pasangan dagangan di Bursa C ialah: BTC_USDT

Dalam [2]:

var accA = exchanges[0].GetAccount()
accA

Keluar[2]: { Saldo: 1, FrozenBalanse: 0, Stok: 10, FrozenStocks: 0 }

Dalam [3]:

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

Keluar[3]: { Saldo: 10,000, FrozenBalanse: 0, Stok: 1, FrozenStocks: 0 }

Dalam [4]:

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

Keluar[4]: { Saldo: 10,000, FrozenBalanse: 0, Stok: 1, FrozenStocks: 0 }

Dalam [5]:

var initSumBTC = accA.Balance + accC.Stocks
initSumBTC

Keluar[5]: 2.

Dalam [6]:

var initSumETH = accA.Stocks + accB.Stocks
initSumETH

Keluar[6]: 11

Dalam [7]:

var initSumUSDT = accB.Balance + accC.Balance
initSumUSDT

Keluar[7]: 20000

Kita boleh lihat bahawa jumlah BTC adalah 2, jumlah ETH adalah 11, dan jumlah USDT adalah 20000.

Dalam [8]:

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

Keluar[8]: { Waktu: 1554831960000, Tinggi: 0.03396501, rendah: 0.03396499, Jual: 0.03396501, Beli: 0.03396499, Terakhir: 0.033965, Volume: 4696.555, Terbuka Minat: 0 }

Dalam [9]:

var tickerB = exchanges[1].GetTicker()
tickerB

Keluar[9]: { Waktu: 1554831960000, Tinggi: 175.08000001, Rendah: 175.07999999, Jual: 175.08000001, Beli: 175.07999999, Terakhir: 175.08, Volume: 20730.37, Terbuka Minat: 0 }

Dalam [10]:

var tickerC = exchanges[2].GetTicker()
tickerC

Keluar[10]: { Waktu: 1554831960000, Tinggi: 5161.90000001, rendah: 5161.89999999, Jual: 5161.90000001, Beli: 5161.89999999, Terakhir: 5161.9, Volume: 2109.9292, Terbuka Minat: 0 }

Ia dapat dilihat bahawa subjek Bursa A, Bursa B dan urus niaga adalah ETH, iaitu, pertukaran A / B boleh menjalankan operasi lindung nilai tidak langsung, tetapi mereka tidak dapat lindung nilai secara langsung kerana mata wang penetapan harga berbeza. Mata wang penetapan harga Bursa A adalah BTC, sementara Bursa B adalah USDT. Anggap pertukaran A menjalankan operasi beliexchanges[0].Buy(price, amount), dan harga yang dijual oleh pihak lawan digunakan sebagai harga pesanan apabila membeli, iaitu,tickerA.SellBursa B menjalankan operasi jual untuk lindung nilai, iaitu,exchanges[1].Sell(price, amount), dan harga yang pihak lawan mahu beli digunakan sebagai harga pesanan apabila menjual, iaitu,tickerB.BuyKerana pertukaran A dimakan.BTCapabila membeli, dan pertukaran B memperoleh USDT apabila menjual, pertukaran A perlu menggantikanUSDTdengan BTC untuk menggantikan BTC yang digunakan oleh pertukaran A, iaitu pertukaran C melaksanakanexchanges[2].Buy(price, amount), dan pertukaranUSDTdenganBTCUntuk membeli, bursa C perlu melihat harga jualan pihak lawan, iaitu,tickerC.Sell. Harga pembelian pertukaran A mesti lebih rendah daripada harga jualan pertukaran B, maka Exchange C boleh membeli semula BTC yang dimakan oleh Exchange A dengan lebih sedikit USDT. Anda akan memperoleh perbezaan jumlah USDT. Jadi ia adalah seperti berikut:

Dalam [11]:

var diffB2A = tickerA.Sell - tickerB.Buy / tickerC.Sell    // diffB2A means that Exchange B sells ETH coins and Exchange A buys ETH coins, which is logically equivalent to the transfer of ETH from Exchange B to Exchange A.
diffB2A

Keluar [11]: 0.000047266535449966285

Jelas, harga pembelian Bursa A lebih tinggi daripada Bursa B dan Bursa C, dan lindung nilai jelas kehilangan wang. Arah lindung nilai yang lain adalah sama. Bursa A melaksanakan operasi menjual ETH, Bursa B melaksanakan operasi membeli ETH, dan Bursa C menjual BTC untuk USDT. Mencapai mata wang selalu seimbang, dan hanya USDT meningkat atau menurun (iaitu perbezaan yang diperoleh).

Dalam [12]:

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

Keluar[12]: 0.000047246531444007644

Mari kita lakukantickerA.Buy - tickerB.Sell / tickerC.Buyoperasi lindung nilai untuk mengetahui bagaimana setiap nilai berubah.

Dalam [13]:

var idA = exchanges[0].Sell(tickerA.Buy, 1)
var nowAccA = exchanges[0].GetAccount()
nowAccA       // We can see that the fee is deducted from the BTC.

Keluar[13]: { Saldo: 1.03389706, FrozenBalance: 0, Stok: 9, FrozenStocks: 0

Dalam [14]:

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

Keluar[14]: { Id: 1, Harga: 0.03396499, Jumlah: 1, DealAmount: 1, Purata Harga: 0.03396499, Jenis: 1, Penghujung: 0, Status: 1, Jenis Kontrak: ETH_BTC_Huobi }

Dalam [15]:

var feeRatioA = 0.002      // The default fee for backtesting is 0.2%, i.e. 0.002.
var feeA = orderA.DealAmount * orderA.AvgPrice * feeRatioA   // Exchange A trading fees, BTC denominated.
feeA

Keluar[15]: 0.00006792998000000001

Dalam [16]:

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

Keluar[16]: { Sisa: 9824.56983998, FrozenBalance: 0, Stok: 2, FrozenStocks: 0

Dalam [17]:

var orderB = exchanges[1].GetOrder(idB)
orderB      // We can see that the fee is deducted from the USDT.

Keluar[17]: { Id: 1, Harga: 175.08000001, Jumlah: 1, DealAmount: 1, Purata Harga: 175.08000001, Jenis: 0, Penghujung: 0, Status: 1, ContractType: ETH_USDT_OKEX }

Dalam [18]:

var feeRatioB = 0.002
var feeB = orderB.DealAmount * orderB.AvgPrice * feeRatioB / tickerC.Last    // B exchange fees, converted to BTC denomination.
feeB

Keluar[18]: 0.00006783548693698057

Dalam [19]:

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

Keluar[19]: { Saldo: 10174.12327555, FrozenBalance: 0, Stok: 0.9662, FrozenStocks: 0

Dalam [20]:

var orderC = exchanges[2].GetOrder(idC)
orderC     // We can see that the fee is deducted from the USDT.

Keluar[20]: { Id: 1, Harga: 5161.89999999, Jumlah: 0.0338, DealAmount: 0.0338, Purata Harga: 5161.89999999, Jenis: 1, Penghujung: 0, Status: 1, Jenis Kontrak: BTC_USDT_OKEX }

Dalam [21]:

var feeRatioC = 0.002
var feeC = orderC.DealAmount * orderC.AvgPrice * feeRatioC / tickerC.Last      // Fees for C exchange transactions, BTC denominated.
feeC

Keluar[21]: 0.00006759999999986903

Mengira jumlah maklumat aset selepas lindung nilai:

Dalam [22]:

var nowSumBTC = nowAccA.Balance + nowAccC.Stocks
nowSumBTC

Keluar[22]: 2.00009706

Dalam [23]:

var nowSumETH = nowAccA.Stocks + nowAccB.Stocks
nowSumETH

Keluar[23]: 11

Dalam [24]:

var nowSumUSDT = nowAccB.Balance + nowAccC.Balance
nowSumUSDT

Keluar[24]: 19998.69311553

Dalam [25]:

nowSumBTC - initSumBTC

Keluar[25]: 0.00009705999999987114

Dalam [26]:

tickerC.Buy * (nowSumBTC - initSumBTC)    // Excess BTC converted to USDT

Keluar[26]: 0.5010140139983642

Dalam [27]:

nowSumUSDT + tickerC.Buy * (nowSumBTC - initSumBTC) - initSumUSDT    // Profit and loss are calculated based on the movement of the account assets and both are denominated in USDT.

Keluar[27]: -0.8058704560025944

Dalam [28]:

(diffA2B - (feeA + feeB + feeC)) * tickerC.Buy     // Profit and loss based on price difference, denominated in USDT.

Keluar[28]: -0.8058703331189396

Seperti yang kita lihat, perbezaan harga apabila lindung nilai adalah diffA2B: 0.000047246531444007644. Bayaran untuk tiga lindung nilai, ditukar kepada BTC adalah: feeA + feeB + feeC.

Dalam [29]:

feeA + feeB + feeC

Keluar[29]: 0.0002033654669368496

Ia dapat dilihat bahawa untuk lindung nilai segitiga sedemikian, perbezaan harga mesti lebih besar daripadafeeA+feeB+feeCsekurang-kurangnya, yang bermaksud tiada kerugian, tiada keuntungan, dan untuk membuat keuntungan mesti lebih besar daripada perbezaan harga. Pada masa ini, melalui perbandingan perhitungan akaun dan pengiraan perbezaan harga, ia adalah kerugian. Saya mengubahsuai versi, supaya yuran pengendalian yang dikira oleh parameter yuran pengendalian sama persis dengan keuntungan perbezaan harga pasaran yang diuji oleh model ini untuk pemerhatian perbandingan.

Dapat dilihat bahawa di bawah syarat lalai yuran pengendalian (2 ‰ secara lalai), apabila perbezaan lindung nilai adalah 0.000047246531444007644 BTC, lindung nilai adalah kerugian, dan kerugian adalah kira-kira -0.8058704560025944.

Versi penyelidikan penyesuaian yuran pengendalian

Penjimatan segitiga (penyesuaian yuran pengendalian).ipynb

Dalam [1]:

var fmz = require("fmz")                           // Import talib, TA, plot libraries automatically after introduction.
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]}]
})

Penampakan maklumat akaun pertukaran awal dan ticker:

  • Pasangan dagangan di Bursa A ialah: ETH_BTC
  • Pasangan dagangan di Bursa B ialah: ETH_USDT
  • Pasangan dagangan di Bursa C ialah: BTC_USDT

Dalam [2]:

var accA = exchanges[0].GetAccount()
accA

Keluar[2]: { Saldo: 1, FrozenBalanse: 0, Stok: 10, FrozenStocks: 0 }

Dalam [3]:

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

Keluar[3]: { Saldo: 10,000, FrozenBalanse: 0, Stok: 1, FrozenStocks: 0 }

Dalam [4]:

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

Keluar[4]: { Saldo: 10,000, FrozenBalanse: 0, Stok: 1, FrozenStocks: 0 }

Dalam [5]:

var initSumBTC = accA.Balance + accC.Stocks
initSumBTC

Keluar[5]: 2.

Dalam [6]:

var initSumETH = accA.Stocks + accB.Stocks
initSumETH

Keluar[6]: 11

Dalam [7]:

var initSumUSDT = accB.Balance + accC.Balance
initSumUSDT

Keluar[7]: 20000

Kita boleh lihat bahawa jumlah BTC adalah 2, jumlah ETH adalah 11, dan jumlah USDT adalah 20000.

Dalam [8]:

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

Keluar[8]: { Waktu: 1554831960000, Tinggi: 0.03396501, rendah: 0.03396499, Jual: 0.03396501, Beli: 0.03396499, Terakhir: 0.033965, Volume: 4696.555, Terbuka Minat: 0 }

Dalam [9]:

var tickerB = exchanges[1].GetTicker()
tickerB

Keluar[9]: { Waktu: 1554831960000, Tinggi: 175.08000001, Rendah: 175.07999999, Jual: 175.08000001, Beli: 175.07999999, Terakhir: 175.08, Volume: 20730.37, Terbuka Minat: 0 }

Dalam [10]:

var tickerC = exchanges[2].GetTicker()
tickerC

Keluar[10]: { Waktu: 1554831960000, Tinggi: 5161.90000001, rendah: 5161.89999999, Jual: 5161.90000001, Beli: 5161.89999999, Terakhir: 5161.9, Volume: 2109.9292, Terbuka Minat: 0 }

Ia dapat dilihat bahawa subjek Bursa A, Bursa B dan urus niaga adalah ETH, iaitu, pertukaran A / B boleh menjalankan operasi lindung nilai tidak langsung, tetapi mereka tidak dapat lindung nilai secara langsung kerana mata wang penetapan harga berbeza. Mata wang penetapan harga Bursa A adalah BTC, sementara Bursa B adalah USDT. Anggap pertukaran A menjalankan operasi beliexchanges[0].Buy(price, amount), dan harga yang dijual oleh pihak lawan digunakan sebagai harga pesanan apabila membeli, iaitu,tickerA.SellBursa B menjalankan operasi jual untuk lindung nilai, iaitu,exchanges[1].Sell(price, amount), dan harga yang pihak lawan mahu beli digunakan sebagai harga pesanan apabila menjual, iaitu,tickerB.BuyKerana pertukaran A dimakan.BTCapabila membeli, dan pertukaran B memperoleh USDT apabila menjual, pertukaran A perlu menggantikanUSDTdengan BTC untuk menggantikan BTC yang digunakan oleh pertukaran A, iaitu pertukaran C melaksanakanexchanges[2].Buy(price, amount), dan pertukaranUSDTdenganBTCUntuk membeli, bursa C perlu melihat harga jualan pihak lawan, iaitu,tickerC.Sell. Harga pembelian pertukaran A mesti lebih rendah daripada harga jualan pertukaran B, maka Exchange C boleh membeli semula BTC yang dimakan oleh Exchange A dengan lebih sedikit USDT. Anda akan memperoleh perbezaan jumlah USDT. Jadi ia adalah seperti berikut:

Dalam [11]:

var diffB2A = tickerA.Sell - tickerB.Buy / tickerC.Sell    // DiffB2A means that Exchange B sells ETH coins and Exchange A buys ETH coins, which is logically equivalent to the transfer of ETH from Exchange B to Exchange A.
diffB2A

Keluar [11]: 0.000047266535449966285

Jelas, harga pembelian Bursa A lebih tinggi daripada Bursa B dan Bursa C, dan lindung nilai jelas kehilangan wang. Arah lindung nilai yang lain adalah sama. Bursa A melaksanakan operasi menjual ETH, Bursa B melaksanakan operasi membeli ETH, dan Bursa C menjual BTC untuk USDT. Mencapai mata wang selalu seimbang, dan hanya USDT meningkat atau menurun (iaitu perbezaan yang diperoleh).

Dalam [12]:

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

Keluar[12]: 0.000047246531444007644

Mari kita lakukantickerA.Buy - tickerB.Sell / tickerC.Buyoperasi lindung nilai untuk mengetahui bagaimana setiap nilai berubah.

Dalam [13]:

var idA = exchanges[0].Sell(tickerA.Buy, 1)
var nowAccA = exchanges[0].GetAccount()
nowAccA       // We can see that the handling fee is deducted from the BTC.

Keluar[13]: { Saldo: 1.0339514, FrozenBalance: 0, Stok: 9, FrozenStocks: 0

Dalam [14]:

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

Keluar[14]: { Id: 1, Harga: 0.03396499, Jumlah: 1, DealAmount: 1, Purata Harga: 0.03396499, Jenis: 1, Penghujung: 0, Status: 1, Jenis Kontrak: ETH_BTC_Huobi }

Dalam [15]:

var feeRatioA = 0.0004      // The default handling fee for backtesting is 0.2%, i.e. 0.002.
var feeA = orderA.DealAmount * orderA.AvgPrice * feeRatioA   // Exchange A trading handling fees, BTC denominated.
feeA

Keluar[15]: 0.000013585996

Dalam [16]:

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

Keluar[16]: { Saldo: 9824.84996798, FrozenBalance: 0, Stok: 2, FrozenStocks: 0

Dalam [17]:

var orderB = exchanges[1].GetOrder(idB)
orderB      // We can see that the handling fee is deducted from the USDT.

Keluar[17]: { Id: 1, Harga: 175.08000001, Jumlah: 1, DealAmount: 1, Purata Harga: 175.08000001, Jenis: 0, Penghujung: 0, Status: 1, ContractType: ETH_USDT_OKEX }

Dalam [18]:

var feeRatioB = 0.0004
var feeB = orderB.DealAmount * orderB.AvgPrice * feeRatioB / tickerC.Last    // Exchange B handling fees, converted to BTC denomination.
feeB

Keluar [1]: 0.000013567097387396117

Dalam [19]:

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

Keluar[19]: { baki: 10174.91841463, FrozenBalance: 0, Stok: 0.9661, FrozenStocks: 0

Dalam [20]:

var orderC = exchanges[2].GetOrder(idC)
orderC     // We can see that the handling fee is deducted from the USDT.

Keluar[20]: { Id: 1, Harga: 5161.89999999, Jumlah: 0.0339, DealAmount: 0.0339, Purata Harga: 5161.89999999, Jenis: 1, Penghujung: 0, Status: 1, Jenis Kontrak: BTC_USDT_OKEX

Dalam [21]:

var feeRatioC = 0.0004
var feeC = orderC.DealAmount * orderC.AvgPrice * feeRatioC / tickerC.Last      // Exchange C trading handling fees, BTC denominated.
feeC

Keluar[21]: 0.000013559999999973732

Mengira jumlah maklumat aset selepas lindung nilai.

Dalam [22]:

var nowSumBTC = nowAccA.Balance + nowAccC.Stocks
nowSumBTC

Keluar[22]: 2.0000514000000003

Dalam [23]:

var nowSumETH = nowAccA.Stocks + nowAccB.Stocks
nowSumETH

Keluar[23]: 11

Dalam [24]:

var nowSumUSDT = nowAccB.Balance + nowAccC.Balance
nowSumUSDT

Keluar[24]: 19999.76838261

Dalam [25]:

nowSumBTC - initSumBTC

Keluar[25]: 0.000051400000000256796

Dalam [26]:

tickerC.Buy * (nowSumBTC - initSumBTC)    // The extra BTC is converted to USDT.

Keluar[26]: 0.26532166000081153

Dalam [27]:

nowSumUSDT + tickerC.Buy * (nowSumBTC - initSumBTC) - initSumUSDT    // Profit and loss is calculated based on the changes of the account assets and is denominated in USDT.

Keluar[27]: 0.0337042700011807

Dalam [28]:

(diffA2B - (feeA + feeB + feeC)) * tickerC.Buy     // Profit and loss based on price difference, denominated in USDT.

Keluar[28]: 0.03372495390449328

Ia boleh dilihat bahawa perbezaan harga semasa lindung nilai adalahdiffA2B: 0.000047246531444007644. Bayaran pengendalian untuk tiga lindung nilai ditukar kepada BTC sebagai:feeA+feeB+feeC.

Dalam [29]:

feeA + feeB + feeC

Keluar[29]: 0.00004071309338736985

Ia boleh dilihat bahawa dalam konfigurasi backtest, yuran pengendalian diubah menjadi"fee":[0.04,0.04], iaitu 0.04%.feeA+feeB+feeCadalah sama dengan 0.00004071309338736985, yang pada dasarnya hampir dengan perbezaan harga diffA2B pada masa lindung nilai. Akhirnya, keuntungan dan kerugian yang dikira sangat kecil, hanya 0.03372495390449328, dan keuntungan dan kerugian yang dikira melalui perubahan akaun pada dasarnya sama dengan yang dikira melalui perbezaan harga. Dokumen penyelidikan ini boleh digunakan untuk mengira berapa banyak perbezaan yang boleh dilindung nilai untuk lindung nilai segitiga.


Berkaitan

Lebih lanjut