त्रिकोणीय हेजिंग.ipynb
में [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}]
})
आरंभिक विनिमय खाते की जानकारी और टिकर प्रदर्शित करना:
[2] मेंः
var accA = exchanges[0].GetAccount()
accA
बाहर[2]: { बैलेंसः 1, फ्रोजन बैलेंसः 0, स्टॉकः 10, फ्रोजन स्टॉकः 0 }
[3] मेंः
var accB = exchanges[1].GetAccount()
accB
बाहर[3]: { बैलेंस: 10000, फ्रोजन बैलेंस: 0, स्टॉक: 1, फ्रोजन स्टॉक: 0 }
[4] मेंः
var accC = exchanges[2].GetAccount()
accC
बाहर[4]: { बैलेंस: 10,000, फ्रोजन बैलेंस: 0, स्टॉक: 1, फ्रोजन स्टॉक: 0 }
[5] मेंः
var initSumBTC = accA.Balance + accC.Stocks
initSumBTC
बाहर[5]: 2.
[6] मेंः
var initSumETH = accA.Stocks + accB.Stocks
initSumETH
बाहर[6]: 11
[7] मेंः
var initSumUSDT = accB.Balance + accC.Balance
initSumUSDT
बाहर[7]: 20000
यह देखा जा सकता है कि बीटीसी की प्रारंभिक कुल संख्या 2 है, ईटीएच की कुल संख्या 11 है, और यूएसडीटी की कुल संख्या 20000 है। अब चलो प्रत्येक वर्तमान व्यापारिक जोड़ी की टिकर जानकारी प्राप्त करते हैं।
[8] मेंः
var tickerA = exchanges[0].GetTicker()
tickerA
बाहर[8]: { समयः 1554831960000, उच्चः 0.03396501, निम्नः 0.03396499, बेचेंः 0.03396501, खरीदेंः 0.03396499, अंतिमः 0.033965, मात्राः 4696.555, ओपनइंटेरेस्ट: 0 }
[9] मेंः
var tickerB = exchanges[1].GetTicker()
tickerB
बाहर[9]: { समयः 1554831960000, उच्चः 175.08000001, निम्नः 175.07999999, बेचनाः 175.08000001, खरीदेंः 175.07999999, अंतिमः 175.08, मात्राः 20730.37, ओपनइंटेरेस्ट: 0 }
[10] मेंः
var tickerC = exchanges[2].GetTicker()
tickerC
बाहर[10]: समयः 1554831960000, उच्चः 5161.90000001, कमः 5161.89999999, बेचनाः 5161.90000001, खरीदें: 5161.89999999, अंतिमः 5161.9, मात्राः 2109.9292, ओपनइंटेरेस्ट: 0 }
यह देखा जा सकता है कि एक्सचेंज ए, एक्सचेंज बी और लेनदेन का विषय ईटीएच है, यानी एक्सचेंज ए / बी अप्रत्यक्ष हेजिंग संचालन कर सकते हैं, लेकिन वे सीधे हेज नहीं कर सकते हैं क्योंकि मूल्य निर्धारण मुद्राएं अलग हैं। एक्सचेंज ए की मूल्य निर्धारण मुद्रा बीटीसी है, जबकि एक्सचेंज बी की यूएसडीटी है।
मान लीजिए कि एक्सचेंज ए एक खरीद ऑपरेशन करता हैexchanges[0].Buy(price, amount)
, और प्रतिपक्ष द्वारा बेची गई कीमत का उपयोग खरीद के समय आदेश मूल्य के रूप में किया जाता है, अर्थात,tickerA.Sell
एक्सचेंज बी हेजिंग के लिए एक बिक्री ऑपरेशन करती है, अर्थातexchanges[1].Sell(price, amount)
, और जिस कीमत को प्रतिपक्ष खरीदना चाहता है, उसका उपयोग बिक्री के समय ऑर्डर मूल्य के रूप में किया जाता है, अर्थात,tickerB.Buy
. क्योंकि विनिमय एक खपतBTC
खरीदते समय, और एक्सचेंज बी प्राप्त USDT बेचते समय, एक्सचेंज ए को बदलने की जरूरत हैUSDT
BTC के साथ विनिमय ए द्वारा खपत BTC के लिए बनाने के लिए, यानी, विनिमय सी निष्पादित करता हैexchanges[2].Buy(price, amount)
, और विनिमयUSDT
के साथBTC
. खरीदने के लिए, एक्सचेंज सी को प्रतिपक्ष की बिक्री मूल्य देखने की आवश्यकता है, अर्थात,tickerC.Sell
. एक्सचेंज A की खरीद कीमत एक्सचेंज B की बिक्री मूल्य से कम होनी चाहिए, तब एक्सचेंज C कम USDT के साथ एक्सचेंज A द्वारा खपत BTC को वापस खरीद सकता है। आप USDT राशि का अंतर कमाएंगे।
तो यह इस प्रकार हैः
[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
बाहर[11]: 0.000047266535449966285
जाहिर है, एक्सचेंज ए की खरीद कीमत एक्सचेंज बी और एक्सचेंज सी की तुलना में अधिक है, और हेजिंग स्पष्ट रूप से पैसा खो रही है। दूसरी हेजिंग दिशा समान है। एक्सचेंज ए ईटीएच बेचने का ऑपरेशन निष्पादित करता है, एक्सचेंज बी ईटीएच खरीदने का ऑपरेशन निष्पादित करता है, और एक्सचेंज सी यूएसडीटी के लिए बीटीसी बेचता है। मुद्रा प्राप्त करना हमेशा संतुलित होता है, और केवल यूएसडीटी बढ़ता है या घटता है (यानी अर्जित अंतर) ।
[12] मेंः
var diffA2B = tickerA.Buy - tickerB.Sell / tickerC.Buy
diffA2B
बाहर[12]: 0.000047246531444007644
चलो एक प्रदर्शन करते हैंtickerA.Buy - tickerB.Sell / tickerC.Buy
हेजिंग ऑपरेशन यह पता लगाने के लिए कि प्रत्येक मूल्य कैसे बदलता है।
[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.
बाहर[13]: { शेष राशिः 1.03389706, जमे हुए बैलेंसः 0, स्टॉक: 9 फ्रोजनस्टॉक्स: 0 }
[14] मेंः
var orderA = exchanges[0].GetOrder(idA)
orderA
बाहर[14]:
{ आईडीः 1,
कीमतः 0.03396499,
राशिः 1
सौदा राशिः 1,
औसत मूल्यः 0.03396499,
प्रकारः 1,
ऑफसेटः 0
स्थितिः 1,
अनुबंध प्रकारः
[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
बाहर[15]: 0.00006792998000000001
[16] मेंः
var idB = exchanges[1].Buy(tickerB.Sell, 1)
var nowAccB = exchanges[1].GetAccount()
nowAccB
बाहर[16]: { शेषः 9824.56983998, जमे हुए बैलेंसः 0, भंडारः 2, फ्रोजनस्टॉक्स: 0 }
[17] मेंः
var orderB = exchanges[1].GetOrder(idB)
orderB // We can see that the fee is deducted from the USDT.
बाहर[17]:
{ आईडीः 1,
मूल्यः 175.08000001,
राशिः 1
सौदा राशिः 1,
औसत मूल्यः 175.08000001,
प्रकारः 0,
ऑफसेटः 0,
स्थितिः 1,
अनुबंध प्रकारः
[18] मेंः
var feeRatioB = 0.002
var feeB = orderB.DealAmount * orderB.AvgPrice * feeRatioB / tickerC.Last // B exchange fees, converted to BTC denomination.
feeB
बाहर[18]: 0.00006783548693698057
[19] मेंः
var idC = exchanges[2].Sell(tickerC.Buy, nowAccA.Balance - accA.Balance)
var nowAccC = exchanges[2].GetAccount()
nowAccC
बाहर[19]: { शेष राशिः 10174.12327555, जमे हुए बैलेंसः 0, स्टॉकः 0.9662, जमे हुए स्टॉक्स: 0 }
[20] मेंः
var orderC = exchanges[2].GetOrder(idC)
orderC // We can see that the fee is deducted from the USDT.
बाहर[20]:
{ आईडीः 1,
कीमतः 5161.89999999,
राशिः 0.0338,
सौदा राशिः 0.0338,
औसत मूल्यः 5161.89999999,
प्रकारः 1,
ऑफसेटः 0,
स्थितिः 1,
अनुबंध प्रकारः
[21] मेंः
var feeRatioC = 0.002
var feeC = orderC.DealAmount * orderC.AvgPrice * feeRatioC / tickerC.Last // Fees for C exchange transactions, BTC denominated.
feeC
बाहर[21]: 0.00006759999999986903
हेजिंग के बाद कुल परिसंपत्ति सूचना की गणना करें:
[22] मेंः
var nowSumBTC = nowAccA.Balance + nowAccC.Stocks
nowSumBTC
बाहर[22]: 2.00009706
[23] मेंः
var nowSumETH = nowAccA.Stocks + nowAccB.Stocks
nowSumETH
बाहर[23]: 11
[24] मेंः
var nowSumUSDT = nowAccB.Balance + nowAccC.Balance
nowSumUSDT
बाहर[24]: 19998.69311553
[25] मेंः
nowSumBTC - initSumBTC
बाहर[1]: 0.00009705999999987114
[26] मेंः
tickerC.Buy * (nowSumBTC - initSumBTC) // Excess BTC converted to USDT
बाहर[26]: 0.5010140139983642
[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.
बाहर[27]: -0.8058704560025944
[२८] मेंः
(diffA2B - (feeA + feeB + feeC)) * tickerC.Buy // Profit and loss based on price difference, denominated in USDT.
बाहर[1]: -0.8058703331189396
जैसा कि हम देख सकते हैं, हेजिंग के समय मूल्य अंतर diffA2B हैः 0.000047246531444007644 है। बीटीसी में परिवर्तित तीनों हेज के लिए शुल्कः feeA + feeB + feeC हैं।
[29] मेंः
feeA + feeB + feeC
बाहर[1]: 0.0002033654669368496
यह देखा जा सकता है कि इस तरह के त्रिकोण हेजिंग के लिए, मूल्य अंतर से अधिक होना चाहिएfeeA+feeB+feeC
कम से कम, जिसका अर्थ है कोई हानि नहीं, कोई लाभ नहीं, और लाभ बनाने के लिए मूल्य अंतर से अधिक होना चाहिए।
वर्तमान में, खाता तुलना गणना और मूल्य अंतर गणना के माध्यम से, यह एक हानि है। हानि लगभग -0.8058704560025944 है।
मैंने एक संस्करण को संशोधित किया है, ताकि प्रसंस्करण शुल्क पैरामीटर द्वारा गणना की गई प्रसंस्करण शुल्क, तुलनात्मक अवलोकन के लिए इस मॉडल द्वारा परीक्षण किए गए बाजार के मूल्य अंतर लाभ के बराबर हो।
यह देखा जा सकता है कि हैंडलिंग फीस की डिफ़ॉल्ट शर्त (2 ‰ डिफ़ॉल्ट रूप से) के तहत, जब हेजिंग अंतर 0.000047246531444007644 BTC है, तो हेजिंग हानि है, और हानि लगभग -0.8058704560025944 है।
त्रिकोणीय हेजिंग (प्रसंस्करण शुल्क को समायोजित करना)
में [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]}]
})
प्रारंभिक विनिमय खाते की जानकारी और टिकर का प्रदर्शनः
[2] मेंः
var accA = exchanges[0].GetAccount()
accA
बाहर[2]: { बैलेंसः 1, फ्रोजन बैलेंसः 0, स्टॉकः 10, फ्रोजन स्टॉकः 0 }
[3] मेंः
var accB = exchanges[1].GetAccount()
accB
बाहर[3]: { बैलेंस: 10000, फ्रोजन बैलेंस: 0, स्टॉक: 1, फ्रोजन स्टॉक: 0 }
[4] मेंः
var accC = exchanges[2].GetAccount()
accC
बाहर[4]: { बैलेंस: 10,000, फ्रोजन बैलेंस: 0, स्टॉक: 1, फ्रोजन स्टॉक: 0 }
[5] मेंः
var initSumBTC = accA.Balance + accC.Stocks
initSumBTC
बाहर[5]: 2.
[6] मेंः
var initSumETH = accA.Stocks + accB.Stocks
initSumETH
बाहर[6]: 11
[7] मेंः
var initSumUSDT = accB.Balance + accC.Balance
initSumUSDT
बाहर[7]: 20000
यह देखा जा सकता है कि बीटीसी की प्रारंभिक कुल संख्या 2 है, ईटीएच की कुल संख्या 11 है, और यूएसडीटी की कुल संख्या 20000 है। अब चलो प्रत्येक वर्तमान व्यापारिक जोड़ी की टिकर जानकारी प्राप्त करते हैं।
[8] मेंः
var tickerA = exchanges[0].GetTicker()
tickerA
बाहर[8]: { समयः 1554831960000, उच्चः 0.03396501, निम्नः 0.03396499, बेचेंः 0.03396501, खरीदेंः 0.03396499, अंतिमः 0.033965, मात्राः 4696.555, ओपनइंटेरेस्ट: 0 }
[9] मेंः
var tickerB = exchanges[1].GetTicker()
tickerB
बाहर[9]: { समयः 1554831960000, उच्चः 175.08000001, निम्नः 175.07999999, बेचनाः 175.08000001, खरीदेंः 175.07999999, अंतिमः 175.08, मात्राः 20730.37, ओपनइंटेरेस्ट: 0 }
[10] मेंः
var tickerC = exchanges[2].GetTicker()
tickerC
बाहर[10]: समयः 1554831960000, उच्चः 5161.90000001, कमः 5161.89999999, बेचनाः 5161.90000001, खरीदें: 5161.89999999, अंतिमः 5161.9, मात्राः 2109.9292, ओपनइंटेरेस्ट: 0 }
यह देखा जा सकता है कि एक्सचेंज ए, एक्सचेंज बी और लेनदेन का विषय ईटीएच है, यानी एक्सचेंज ए / बी अप्रत्यक्ष हेजिंग संचालन कर सकते हैं, लेकिन वे सीधे हेज नहीं कर सकते हैं क्योंकि मूल्य निर्धारण मुद्राएं अलग हैं। एक्सचेंज ए की मूल्य निर्धारण मुद्रा बीटीसी है, जबकि एक्सचेंज बी की यूएसडीटी है।
मान लीजिए कि एक्सचेंज ए एक खरीद ऑपरेशन करता हैexchanges[0].Buy(price, amount)
, और प्रतिपक्ष द्वारा बेची गई कीमत का उपयोग खरीद के समय आदेश मूल्य के रूप में किया जाता है, अर्थात,tickerA.Sell
एक्सचेंज बी हेजिंग के लिए एक बिक्री ऑपरेशन करती है, अर्थातexchanges[1].Sell(price, amount)
, और जिस कीमत को प्रतिपक्ष खरीदना चाहता है, उसका उपयोग बिक्री के समय ऑर्डर मूल्य के रूप में किया जाता है, अर्थात,tickerB.Buy
. क्योंकि विनिमय एक खपतBTC
खरीदते समय, और एक्सचेंज बी प्राप्त USDT बेचते समय, एक्सचेंज ए को बदलने की जरूरत हैUSDT
BTC के साथ विनिमय ए द्वारा खपत BTC के लिए बनाने के लिए, यानी, विनिमय सी निष्पादित करता हैexchanges[2].Buy(price, amount)
, और विनिमयUSDT
के साथBTC
. खरीदने के लिए, एक्सचेंज सी को प्रतिपक्ष की बिक्री मूल्य देखने की आवश्यकता है, अर्थात,tickerC.Sell
. एक्सचेंज A की खरीद कीमत एक्सचेंज B की बिक्री मूल्य से कम होनी चाहिए, तब एक्सचेंज C कम USDT के साथ एक्सचेंज A द्वारा खपत BTC को वापस खरीद सकता है। आप USDT राशि का अंतर कमाएंगे।
तो यह इस प्रकार हैः
[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
बाहर[11]: 0.000047266535449966285
जाहिर है, एक्सचेंज ए की खरीद कीमत एक्सचेंज बी और एक्सचेंज सी की तुलना में अधिक है, और हेजिंग स्पष्ट रूप से पैसा खो रही है। दूसरी हेजिंग दिशा समान है। एक्सचेंज ए ईटीएच बेचने का ऑपरेशन निष्पादित करता है, एक्सचेंज बी ईटीएच खरीदने का ऑपरेशन निष्पादित करता है, और एक्सचेंज सी यूएसडीटी के लिए बीटीसी बेचता है। मुद्रा प्राप्त करना हमेशा संतुलित होता है, और केवल यूएसडीटी बढ़ता है या घटता है (यानी अर्जित अंतर) ।
[12] मेंः
var diffA2B = tickerA.Buy - tickerB.Sell / tickerC.Buy
diffA2B
बाहर[12]: 0.000047246531444007644
चलो एक प्रदर्शन करते हैंtickerA.Buy - tickerB.Sell / tickerC.Buy
हेजिंग ऑपरेशन यह पता लगाने के लिए कि प्रत्येक मूल्य कैसे बदलता है।
[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.
बाहर[13]: { शेषः 1.0339514, जमे हुए बैलेंसः 0, स्टॉक: 9 फ्रोजनस्टॉक्स: 0 }
[14] मेंः
var orderA = exchanges[0].GetOrder(idA)
orderA
बाहर[14]:
{ आईडीः 1,
कीमतः 0.03396499,
राशिः 1
सौदा राशिः 1,
औसत मूल्यः 0.03396499,
प्रकारः 1,
ऑफसेटः 0
स्थितिः 1,
अनुबंध प्रकारः
[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
बाहर[15]: 0.000013585996
[16] मेंः
var idB = exchanges[1].Buy(tickerB.Sell, 1)
var nowAccB = exchanges[1].GetAccount()
nowAccB
बाहर[16]: { शेषः 9824.84996798, जमे हुए बैलेंसः 0, भंडारः 2, फ्रोजनस्टॉक्स: 0 }
[17] मेंः
var orderB = exchanges[1].GetOrder(idB)
orderB // We can see that the handling fee is deducted from the USDT.
बाहर[17]:
{ आईडीः 1,
मूल्यः 175.08000001,
राशिः 1
सौदा राशिः 1,
औसत मूल्यः 175.08000001,
प्रकारः 0,
ऑफसेटः 0,
स्थितिः 1,
अनुबंध प्रकारः
[18] मेंः
var feeRatioB = 0.0004
var feeB = orderB.DealAmount * orderB.AvgPrice * feeRatioB / tickerC.Last // Exchange B handling fees, converted to BTC denomination.
feeB
बाहर[18]: 0.000013567097387396117
[19] मेंः
var idC = exchanges[2].Sell(tickerC.Buy, nowAccA.Balance - accA.Balance)
var nowAccC = exchanges[2].GetAccount()
nowAccC
बाहर[19]: { शेष राशिः 10174.91841463, जमे हुए बैलेंसः 0, स्टॉकः 0.9661, फ्रोजनस्टॉक्स: 0 }
[20] मेंः
var orderC = exchanges[2].GetOrder(idC)
orderC // We can see that the handling fee is deducted from the USDT.
बाहर[20]:
{ आईडीः 1,
कीमतः 5161.89999999,
राशिः 0.0339,
सौदा राशिः 0.0339,
औसत मूल्यः 5161.89999999,
प्रकारः 1,
ऑफसेटः 0,
स्थितिः 1,
अनुबंध प्रकारः
[21] मेंः
var feeRatioC = 0.0004
var feeC = orderC.DealAmount * orderC.AvgPrice * feeRatioC / tickerC.Last // Exchange C trading handling fees, BTC denominated.
feeC
बाहर[21]: 0.000013559999999973732
हेजिंग के बाद कुल परिसंपत्ति सूचना की गणना करें।
[22] मेंः
var nowSumBTC = nowAccA.Balance + nowAccC.Stocks
nowSumBTC
बाहर[22]: 2.0000514000000003
[23] मेंः
var nowSumETH = nowAccA.Stocks + nowAccB.Stocks
nowSumETH
बाहर[23]: 11
[24] मेंः
var nowSumUSDT = nowAccB.Balance + nowAccC.Balance
nowSumUSDT
बाहर[1]: 19999.76838261
[25] मेंः
nowSumBTC - initSumBTC
बाहर[1]: 0.000051400000000256796
[26] मेंः
tickerC.Buy * (nowSumBTC - initSumBTC) // The extra BTC is converted to USDT.
बाहर[26]: 0.26532166000081153
[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.
बाहर[27]: 0.0337042700011807
[२८] मेंः
(diffA2B - (feeA + feeB + feeC)) * tickerC.Buy // Profit and loss based on price difference, denominated in USDT.
बाहर[28]: 0.03372495390449328
यह देखा जा सकता है कि हेजिंग के दौरान मूल्य अंतरdiffA2B
: 0.000047246531444007644.
तीनों हेजिंग के लिए हैंडलिंग शुल्क को BTC में परिवर्तित किया जाता हैःfeeA+feeB+feeC
.
[29] मेंः
feeA + feeB + feeC
बाहर[1]: 0.00004071309338736985
यह देखा जा सकता है कि बैकटेस्ट कॉन्फ़िगरेशन में, हैंडलिंग शुल्क को बदल दिया जाता है"fee":[0.04,0.04]
, यानी 0.04%. इस समय,feeA+feeB+feeC
यह मूल रूप से हेजिंग के समय मूल्य अंतर diffA2B के करीब है। अंत में, गणना की गई लाभ और हानि बहुत छोटी है, केवल 0.03372495390449328, और खाता परिवर्तन के माध्यम से गणना की गई लाभ और हानि मूल रूप से मूल्य अंतर के माध्यम से गणना की गई समान है। इस शोध दस्तावेज़ का उपयोग यह गणना करने के लिए किया जा सकता है कि त्रिकोण हेजिंग के लिए कितना अंतर हेज किया जा सकता है।