Hedging 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}]
})
Tampilan informasi akun pertukaran awal dan ticker:
Dalam [2]:
var accA = exchanges[0].GetAccount()
accA
Keluar[2]: { Saldo: 1, FrozenBalance: 0, Stok: 10, FrozenStocks: 0 }
Dalam [3]:
var accB = exchanges[1].GetAccount()
accB
Keluar[3]: { Saldo: 10 000, FrozenSaldo: 0, Saham: 1, FrozenStocks: 0 }
Dalam [4]:
var accC = exchanges[2].GetAccount()
accC
Keluar[4]: { Saldo: 10 000, FrozenSaldo: 0, Saham: 1, FrozenStocks: 0 }
Dalam [5]:
var initSumBTC = accA.Balance + accC.Stocks
initSumBTC
Keluar[5]: 2 (dua)
Dalam [6]:
var initSumETH = accA.Stocks + accB.Stocks
initSumETH
Keluar[6]: 11 orang
Dalam [7]:
var initSumUSDT = accB.Balance + accC.Balance
initSumUSDT
Keluar[7]: 20000
Kita dapat melihat bahwa jumlah total BTC adalah 2, jumlah total ETH adalah 11, dan jumlah total USDT adalah 20000. Sekarang mari kita dapatkan informasi ticker dari setiap pasangan perdagangan saat ini.
Dalam [8]:
var tickerA = exchanges[0].GetTicker()
tickerA
Keluar[8]: { Waktu: 1554831960000, Tinggi: 0.03396501, Sedikit: 0.03396499, Jual: 0.03396501, Beli: 0.03396499, Terakhir: 0.033965, Volume: 4696.555, OpenInterest: 0
Dalam [9]:
var tickerB = exchanges[1].GetTicker()
tickerB
Keluar[9]: { Waktu: 1554831960000, Tinggi: 175.08000001, Sedikit: 175.07999999, Jual: 175.08000001, Beli: 175.07999999, Terakhir: 175.08, Volume: 20730.37, OpenInterest: 0
Dalam [10]:
var tickerC = exchanges[2].GetTicker()
tickerC
Keluar[10]: { Waktu: 1554831960000, Tinggi: 5161.90000001, Sedikit: 5161.89999999, Jual: 5161.90000001, Beli: 5161.89999999, Terakhir: 5161.9, Volume: 2109.9292, OpenInterest: 0
Hal ini dapat dilihat bahwa subjek Exchange A, Exchange B dan transaksi adalah ETH, yaitu, exchange A/B dapat melakukan operasi lindung nilai tidak langsung, tetapi mereka tidak dapat lindung nilai secara langsung karena mata uang penetapan harga berbeda. Mata uang penetapan harga Exchange A adalah BTC, sedangkan Exchange B adalah USDT.
Asumsikan bahwa pertukaran A melakukan transaksi pembelianexchanges[0].Buy(price, amount)
, dan harga yang dijual oleh counterparty digunakan sebagai harga order saat membeli, yaitu,tickerA.Sell
Bursa B melakukan operasi jual untuk lindung nilai, yaitu,exchanges[1].Sell(price, amount)
, dan harga yang ingin dibeli oleh counterparty digunakan sebagai harga order saat menjual, yaitu,tickerB.Buy
Karena pertukaran A dikonsumsiBTC
saat membeli, dan pertukaran B memperoleh USDT saat menjual, pertukaran A perlu menggantiUSDT
dengan BTC untuk menebus BTC yang dikonsumsi oleh pertukaran A, yaitu pertukaran C mengeksekusiexchanges[2].Buy(price, amount)
, dan pertukaranUSDT
denganBTC
Untuk membeli, bursa C perlu melihat harga jual dari counterparty, yaitu,tickerC.Sell
. Harga pembelian bursa A harus lebih rendah dari harga jual bursa B, maka Exchange C dapat membeli kembali BTC yang dikonsumsi oleh Exchange A dengan jumlah USDT yang lebih sedikit. Anda akan mendapatkan perbedaan jumlah USDT.
Jadi ini adalah sebagai 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 Exchange A lebih tinggi dari Exchange B dan Exchange C, dan lindung nilai jelas kehilangan uang. Pertukaran A mengeksekusi operasi jual ETH, Exchange B mengeksekusi operasi beli ETH, dan Exchange C menjual BTC untuk USDT. Mencapai mata uang selalu seimbang, dan hanya USDT yang meningkat atau menurun (yaitu perbedaan 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.
Di [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,
Rata-rata Harga: 0.03396499,
Jenis: 1,
Offset: 0,
Status: 1,
ContractType:
Di [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
Di [16]:
var idB = exchanges[1].Buy(tickerB.Sell, 1)
var nowAccB = exchanges[1].GetAccount()
nowAccB
Keluar[16]: { Saldo: 9824.56983998, FrozenBalance: 0, Stok: 2, FrozenStocks: 0 }
Di [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,
Rata-rata Harga: 175.08000001,
Jenis: 0,
Offset: 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, Saham: 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,
Rata-rata Harga: 5161.89999999,
Jenis: 1,
Offset: 0,
Status: 1,
ContractType:
Di [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
Menghitung informasi total aset setelah 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 orang
Dalam [24]:
var nowSumUSDT = nowAccB.Balance + nowAccC.Balance
nowSumUSDT
Keluar[24]: 19998.69311553
Di [25]:
nowSumBTC - initSumBTC
Keluar[25]: 0.00009705999999987114
Di [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 dapat kita lihat, perbedaan harga ketika lindung nilai adalah diffA2B: 0,000047246531444007644. Biaya untuk tiga lindung nilai, dikonversi ke BTC adalah: feeA + feeB + feeC.
Dalam [29]:
feeA + feeB + feeC
Keluar[29]: 0.0002033654669368496
Hal ini dapat dilihat bahwa untuk lindung nilai segitiga seperti itu, perbedaan harga harus lebih besar darifeeA+feeB+feeC
setidaknya, yang berarti tidak ada kerugian, tidak ada keuntungan, dan untuk membuat keuntungan harus lebih besar dari perbedaan harga.
Saat ini, melalui perbandingan perhitungan akun dan perhitungan perbedaan harga, itu adalah kerugian.
Saya memodifikasi versi, sehingga biaya penanganan yang dihitung oleh parameter biaya penanganan sama persis dengan keuntungan perbedaan harga dari pasar yang diuji dengan model ini untuk observasi komparatif.
Dapat dilihat bahwa di bawah kondisi default biaya penanganan (2 ‰ secara default), ketika perbedaan lindung nilai adalah 0,000047246531444007644 BTC, lindung nilai adalah kerugian, dan kerugian adalah sekitar -0,8058704560025944.
Hedging segitiga (penyesuaian biaya penanganan).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]}]
})
Tampilan informasi akun pertukaran awal dan ticker:
Dalam [2]:
var accA = exchanges[0].GetAccount()
accA
Keluar[2]: { Saldo: 1, FrozenBalance: 0, Stok: 10, FrozenStocks: 0 }
Dalam [3]:
var accB = exchanges[1].GetAccount()
accB
Keluar[3]: { Saldo: 10 000, FrozenSaldo: 0, Saham: 1, FrozenStocks: 0 }
Dalam [4]:
var accC = exchanges[2].GetAccount()
accC
Keluar[4]: { Saldo: 10 000, FrozenSaldo: 0, Saham: 1, FrozenStocks: 0 }
Dalam [5]:
var initSumBTC = accA.Balance + accC.Stocks
initSumBTC
Keluar[5]: 2 (dua)
Dalam [6]:
var initSumETH = accA.Stocks + accB.Stocks
initSumETH
Keluar[6]: 11 orang
Dalam [7]:
var initSumUSDT = accB.Balance + accC.Balance
initSumUSDT
Keluar[7]: 20000
Kita dapat melihat bahwa jumlah total BTC adalah 2, jumlah total ETH adalah 11, dan jumlah total USDT adalah 20000. Sekarang mari kita dapatkan informasi ticker dari setiap pasangan perdagangan saat ini.
Dalam [8]:
var tickerA = exchanges[0].GetTicker()
tickerA
Keluar[8]: { Waktu: 1554831960000, Tinggi: 0.03396501, Sedikit: 0.03396499, Jual: 0.03396501, Beli: 0.03396499, Terakhir: 0.033965, Volume: 4696.555, OpenInterest: 0
Dalam [9]:
var tickerB = exchanges[1].GetTicker()
tickerB
Keluar[9]: { Waktu: 1554831960000, Tinggi: 175.08000001, Sedikit: 175.07999999, Jual: 175.08000001, Beli: 175.07999999, Terakhir: 175.08, Volume: 20730.37, OpenInterest: 0
Dalam [10]:
var tickerC = exchanges[2].GetTicker()
tickerC
Keluar[10]: { Waktu: 1554831960000, Tinggi: 5161.90000001, Sedikit: 5161.89999999, Jual: 5161.90000001, Beli: 5161.89999999, Terakhir: 5161.9, Volume: 2109.9292, OpenInterest: 0
Hal ini dapat dilihat bahwa subjek Exchange A, Exchange B dan transaksi adalah ETH, yaitu, exchange A/B dapat melakukan operasi lindung nilai tidak langsung, tetapi mereka tidak dapat lindung nilai secara langsung karena mata uang penetapan harga berbeda. Mata uang penetapan harga Exchange A adalah BTC, sedangkan Exchange B adalah USDT.
Asumsikan bahwa pertukaran A melakukan transaksi pembelianexchanges[0].Buy(price, amount)
, dan harga yang dijual oleh counterparty digunakan sebagai harga order saat membeli, yaitu,tickerA.Sell
Bursa B melakukan operasi jual untuk lindung nilai, yaitu,exchanges[1].Sell(price, amount)
, dan harga yang ingin dibeli oleh counterparty digunakan sebagai harga order saat menjual, yaitu,tickerB.Buy
Karena pertukaran A dikonsumsiBTC
saat membeli, dan pertukaran B memperoleh USDT saat menjual, pertukaran A perlu menggantiUSDT
dengan BTC untuk menebus BTC yang dikonsumsi oleh pertukaran A, yaitu pertukaran C mengeksekusiexchanges[2].Buy(price, amount)
, dan pertukaranUSDT
denganBTC
Untuk membeli, bursa C perlu melihat harga jual dari counterparty, yaitu,tickerC.Sell
. Harga pembelian bursa A harus lebih rendah dari harga jual bursa B, maka Exchange C dapat membeli kembali BTC yang dikonsumsi oleh Exchange A dengan jumlah USDT yang lebih sedikit. Anda akan mendapatkan perbedaan jumlah USDT.
Jadi ini adalah sebagai 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 Exchange A lebih tinggi dari Exchange B dan Exchange C, dan lindung nilai jelas kehilangan uang. Pertukaran A mengeksekusi operasi jual ETH, Exchange B mengeksekusi operasi beli ETH, dan Exchange C menjual BTC untuk USDT. Mencapai mata uang selalu seimbang, dan hanya USDT yang meningkat atau menurun (yaitu perbedaan 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.
Di [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,
Rata-rata Harga: 0.03396499,
Jenis: 1,
Offset: 0,
Status: 1,
ContractType:
Di [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
Di [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 }
Di [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,
Rata-rata Harga: 175.08000001,
Jenis: 0,
Offset: 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[18]: 0.000013567097387396117
Dalam [19]:
var idC = exchanges[2].Sell(tickerC.Buy, nowAccA.Balance - accA.Balance)
var nowAccC = exchanges[2].GetAccount()
nowAccC
Keluar[19]: { saldo: 10174.91841463, FrozenBalance: 0, Saham: 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,
Rata-rata Harga: 5161.89999999,
Jenis: 1,
Offset: 0,
Status: 1,
ContractType:
Di [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
Menghitung total informasi aset setelah 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 orang
Dalam [24]:
var nowSumUSDT = nowAccB.Balance + nowAccC.Balance
nowSumUSDT
Keluar[24]: 19999.76838261
Di [25]:
nowSumBTC - initSumBTC
Keluar[25]: 0.000051400000000256796 (tidak termasuk bank)
Di [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
Dapat dilihat bahwa perbedaan harga selama lindung nilai adalahdiffA2B
: 0,000047246531444007644.
Biaya penanganan untuk tiga lindung nilai dikonversi ke BTC sebagai:feeA+feeB+feeC
.
Dalam [29]:
feeA + feeB + feeC
Keluar[29]: 0,00004071309338736985
Hal ini dapat dilihat bahwa dalam konfigurasi backtest, biaya penanganan diubah menjadi"fee":[0.04,0.04]
, yaitu 0,04%.feeA+feeB+feeC
adalah sama dengan 0,00004071309338736985, yang pada dasarnya dekat dengan perbedaan harga diffA2B pada saat lindung nilai. Akhirnya, keuntungan dan kerugian yang dihitung sangat kecil, hanya 0,03372495390449328, dan keuntungan dan kerugian yang dihitung melalui perubahan akun pada dasarnya sama dengan yang dihitung melalui perbedaan harga.