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:
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.Sell
Bursa 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.Buy
Kerana pertukaran A dimakan.BTC
apabila membeli, dan pertukaran B memperoleh USDT apabila menjual, pertukaran A perlu menggantikanUSDT
dengan BTC untuk menggantikan BTC yang digunakan oleh pertukaran A, iaitu pertukaran C melaksanakanexchanges[2].Buy(price, amount)
, dan pertukaranUSDT
denganBTC
Untuk 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.Buy
operasi 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:
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:
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:
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+feeC
sekurang-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.
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:
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.Sell
Bursa 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.Buy
Kerana pertukaran A dimakan.BTC
apabila membeli, dan pertukaran B memperoleh USDT apabila menjual, pertukaran A perlu menggantikanUSDT
dengan BTC untuk menggantikan BTC yang digunakan oleh pertukaran A, iaitu pertukaran C melaksanakanexchanges[2].Buy(price, amount)
, dan pertukaranUSDT
denganBTC
Untuk 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.Buy
operasi 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:
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:
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:
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+feeC
adalah 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.