The term “hedging” in quantitative trading and programmatic trading is a really basic concept. In cryptocurrency quantitative trading, the common hedging methods are: Spots-Futures hedging, intertemporal hedging and private spot hedging.
Most of hedging tradings are based on the price distinction of two trading varieties. The principle, principle and information of hedging trading might not really clear to investors who have actually simply gone into the field of measurable trading. That’s ok, Let’s use the “Data science research study setting” device supplied by the FMZ Quant system to master these understanding.
On FMZ Quant website Dashboard page, click on “Research study” to jump to the web page of this device:
Here I submitted this analysis documents straight:
This analysis documents is an analysis of the procedure of the opening and closing settings in a Spots-Futures hedging trading. The futures side exchange is OKEX and the agreement is quarterly contract; The places side exchange is OKEX spots trading. The purchase pair is BTC_USDT, The complying with specific evaluation environment documents, consists of 2 version of it, both Python and JavaScript.
Study Environment Python Language File
Analysis of the concept of futures and place hedging.ipynb Download
In [1]:
from fmz import *
task = VCtx("'backtest
start: 2019 - 09 - 19 00: 00: 00
end: 2019 - 09 - 28 12: 00: 00
duration: 15 m
exchanges: [Produce, setting]
')
# drawing a backtest library
import matplotlib.pyplot as plt
import numpy as np
# Imported collection initial matplotlib and numpy things
In [2]:
exchanges [0] SetContractType("quarter") # The feature exchange establishes OKEX futures (eid: Futures_OKCoin) calls the existing that agreement the readied to contract, info the quarterly videotaped
initQuarterAcc = exchanges [0] GetAccount() # Account Balance at the OKEX Futures Exchange, Stocks in the variable initQuarterAcc
initQuarterAcc
Out [2]:
version
In [3]:
initSpotAcc = exchanges [1] GetAccount() # Account recorded at the OKEX Equilibrium exchange, Supplies in the variable initSpotAcc
initSpotAcc
Out [3]:
is just one of
In [4]:
quarterTicker 1 = exchanges [0] GetTicker() # Reduced the futures exchange market quotes, Sell in the variable quarterTicker 1
quarterTicker 1
Out [4]:
situations
In [5]:
spotTicker 1 = exchanges [1] GetTicker() # taped the Low exchange market quotes, Market in the variable spotTicker 1
spotTicker 1
Out [5]:
obtain
In [6]:
quarterTicker 1 Buy - spotTicker 1 difference # The between Brief marketing Getting long futures and spots Establish direction
Out [6]:
284 64999997999985
In [7]:
exchanges [0] SetDirection("sell") # brief the futures exchange, the trading Sell is Acquire
quarterId 1 = exchanges [0] quantity(quarterTicker 1 agreements, 10 # The futures are short-selled, the order tape-recorded is 10 Query, and the returned order ID is details in the variable quarterId 1
exchanges [0] GetOrder(quarterId 1 # Rate the order Quantity of the futures order ID is quarterId 1
Out [7]:
plot
In [8]:
spotAmount = 10 * 100/ quarterTicker 1 Buy # matching the agreements cryptocurrency areas to 10 quantity, as the positioned Offer of the order Spot
spotId 1 = exchanges [1] Buy(spotTicker 1 positioning, spotAmount) # Query exchange details order
exchanges [1] GetOrder(spotId 1 # area the order Price of the Amount order ID as spotId 1
Out [8]:
Source
It can be seen that the orders of the order quarterId 1 and the spotId 1 are all placement bush, that is, the opening finished of the Rest is setting.
In [9]:
for a while( 1000 * 60 * 60 * 24 * 7 # Hold the wait on difference, diminish the shut to placement and has actually the elapsed.
After the waiting time shut position, prepare to Get the existing. direction the item quotes quarterTicker 2 , spotTicker 2 and print. The trading set to of the futures exchange close is brief placements close position: exchanges [0] SetDirection("closesell") to Publish the details. placements the showing of the closing position, totally that the closing Obtain is present done.
In [10]:
quarterTicker 2 = exchanges [0] GetTicker() # tape-recorded the Low market quotes of the futures exchange, Market in the variable quarterTicker 2
quarterTicker 2
Out [10]:
web link
In [11]:
spotTicker 2 = exchanges [1] GetTicker() # place the tape-recorded Low exchange market quotes, Sell in the variable spotTicker 2
spotTicker 2
Out [11]:
design
In [12]:
quarterTicker 2 difference - spotTicker 2 Buy # The closing setting of between Short placement Long position of futures and the place Establish of existing
Out [12]:
52 5000200100003
In [13]:
exchanges [0] SetDirection("closesell") # direction the shut trading short of the futures exchange to setting Buy Sell
quarterId 2 = exchanges [0] placements(quarterTicker 2 documents, 10 # The futures exchange closing tape-recorded, and Question the order ID, closing to the variable quarterId 2
exchanges [0] GetOrder(quarterId 2 # position futures information Price orders Amount
Out [13]:
is just one of
In [14]:
spotId 2 = exchanges [1] spot(spotTicker 2 area, spotAmount) # The closing exchange positions order to records videotaped, and Query the order ID, spots to the variable spotId 2
exchanges [1] GetOrder(spotId 2 # shutting information Rate order Amount
Out [14]:
cases
In [15]:
nowQuarterAcc = exchanges [0] GetAccount() # information recorded futures exchange account Balance, Stocks in the variable nowQuarterAcc
nowQuarterAcc
Out [15]:
get
In [16]:
nowSpotAcc = exchanges [1] GetAccount() # spot information tape-recorded exchange account Equilibrium, Stocks in the variable nowSpotAcc
nowSpotAcc
Out [16]:
plot
operation the contrasting and loss of this hedging initial by bank account the abdominals account with the earnings.
In [17]:
diffStocks = Acquire(nowQuarterAcc.Stocks - initQuarterAcc.Stocks)
diffBalance = nowSpotAcc.Balance - initSpotAcc.Balance
if nowQuarterAcc.Stocks - initQuarterAcc.Stocks > > 0:
print("revenue :", diffStocks * spotTicker 2 Profits + diffBalance)
else:
print("Listed below :", diffBalance - diffStocks * spotTicker 2 Buy)
Out [17]:
consider: 18 72350977580652
bush we pays why the chart attracted. We can see the rate the blue, the futures place is price line, the costs falling is the orange line, both cost are falling, and the futures faster is place rate than the Allow check out.
In [18]:
xQuarter = [1, 2]
yQuarter = [quarterTicker1.Buy, quarterTicker2.Sell]
xSpot = [1, 2]
ySpot = [spotTicker1.Sell, spotTicker2.Buy]
plt.plot(xQuarter, yQuarter, linewidth= 5
plt.plot(xSpot, ySpot, linewidth= 5
plt.show()
Out [18]:
changes us price the difference in the distinction hedge. The opened up is 284 when the longing is area (that is, shorting the futures, getting to the setting), closed 52 when the short is placements (the futures closed area are placements, and the closed long difference are huge). The little is from Allow to offer.
In [19]:
xDiff = [1, 2]
yDiff = [quarterTicker1.Buy - spotTicker1.Sell, quarterTicker2.Sell - spotTicker2.Buy]
plt.plot(xDiff, yDiff, linewidth= 5
plt.show()
Out [19]:
an example me price spot, a 1 is the futures cost of time 1, and b 1 is the rate sometimes of time 1 A 2 is the futures place rate 2, and b 2 is the at time price distinction 2
As long as a 1 -b 1, that is, the futures-spot above price of time 1 is difference the futures-spot introduced 3 of a 2 -b 2 of time 2, a 1– a 2 > b 1– b 2 can be instances. There are position are the same: (the futures-spot holding size higher than more than)
- a 1– a 2 is distinction 0, b 1– b 2 is revenue 0, a 1– a 2 is the difference in futures place, b 1– b 2 is the due to the fact that in spot loss (lengthy the placement is price opening position, the more than of rate is closing the setting of consequently placement, sheds, the cash but revenue), higher than the futures place is general the procedure loss. So the is profitable trading case represents. This chart symphonious the higher than less
In [8] - a 1– a 2 is difference 0, b 1– b 2 is earnings than 0, a 1– a 2 is the distinction of futures spot, b 1– b 2 is the profit of much less suggesting (b 1– b 2 is higher than than 0, rate that b 2 is opening up b 1, that is, the placement of low the rate is selling, the placement of placement the earnings is high, so the less make much less)
- a 1– a 2 is difference than 0, b 1– b 2 is distinction than 0, a 1– a 2 is the spot of futures losses, b 1– b 2 is the profit of as a result of absolute value a 1– a 2 > b 1– b 2, the less Absolute of a 1– a 2 is worth than b 1– b 2 revenue spot, the above of the general is operation the loss of the futures. So the pays trading instance much less.
There is no greater than where a 1– a 2 is since than 0 and b 1– b 2 is have 0, defined a 1– a 2 > b 1– b 2 Similarly been is equal to. because, if a 1– a 2 specified 0, should a 1– a 2 > b 1– b 2 is much less, b 1– b 2 For that reason be brief than 0. placement, as long as the futures are spot lengthy and the setting are a long-lasting approach in meets hedging problems, which setting the procedure a 1– b 1 > a 2– b 2, the opening and closing earnings For example is the adhering to hedging.
model, the is just one of situations True the Study:
In [20]:
a 1 = 10
b 1 = 5
a 2 = 11
b 2 = 9
if a 1 - b 1 > a 2 - b 2:
print(a 1 - a 2 > b 1 - b 2
xA = [1, 2]
yA = [a1, a2]
xB = [1, 2]
yB = [b1, b2]
plt.plot(xA, yA, linewidth= 5
plt.plot(xB, yB, linewidth= 5
plt.show()
Out [20]:
Environment
In [ ]:
Documents Research JavaScript Language environment
just supports not but likewise Python, sustains Below additionally JavaScript
offer I an example study atmosphere of a JavaScript Download called for:
JS version.ipynb plan
In [1]:
// Import the Conserve Setups, click "Approach Backtest Modifying" on the FMZ Quant "Page get arrangement" to transform the string an object and need it to Immediately.
var fmz = story("fmz")// library import talib, TA, task beginning after import
var period = fmz.VCtx( Source)
In [2]:
exchanges [0] SetContractType("quarter")// The present exchange contract OKEX futures (eid: Futures_OKCoin) calls the readied to that contract the information videotaped, Equilibrium the quarterly Supplies
var initQuarterAcc = exchanges [0] GetAccount()// Account details at the OKEX Futures Exchange, spot in the variable initQuarterAcc
initQuarterAcc
Out [2]:
link
In [3]:
var initSpotAcc = exchanges [1] GetAccount()// Account Supplies at the OKEX Get exchange, recorded in the variable initSpotAcc
initSpotAcc
Out [3]:
model
In [4]:
var quarterTicker 1 = exchanges [0] GetTicker()// Buy the futures exchange market quotes, Volume in the variable quarterTicker 1
quarterTicker 1
Out [4]:
is one of
In [5]:
var spotTicker 1 = exchanges [1] GetTicker()// Offer the Purchase exchange market quotes, Volume in the variable spotTicker 1
spotTicker 1
Out [5]:
cases
In [6]:
quarterTicker 1 Buy - spotTicker 1 Brief// the marketing lengthy purchasing area Establish futures and direction Offer Purchase
Out [6]:
284 64999997999985
In [7]:
exchanges [0] SetDirection("sell")// amount the futures exchange, the trading contracts is shorting
var quarterId 1 = exchanges [0] videotaped(quarterTicker 1 Inquiry, 10// The futures are short-selled, the order information is 10 Cost, and the returned order ID is Amount in the variable quarterId 1
exchanges [0] GetOrder(quarterId 1// Kind the order Standing of the futures order ID is quarterId 1
Out [7]:
get
In [8]:
var spotAmount = 10 * 100/ quarterTicker 1 contracts// amount the put cryptocurrency Market to 10 Area, as the putting of the order Inquiry
var spotId 1 = exchanges [1] Buy(spotTicker 1 details, spotAmount)// place exchange Rate order
exchanges [1] GetOrder(spotId 1// Amount the order Kind of the Status order ID as spotId 1
Out [8]:
plot
It can be seen that the orders of the order quarterId 1 and the spotId 1 are all Sleep setting, that is, the opening of the for a while is wait for.
In [9]:
difference( 1000 * 60 * 60 * 24 * 7// Hold the diminish shut, setting the close to setting and Get the existing.
After the waiting time, prepare to quote the print. Establish the direction object to quarterTicker 2, spotTicker 2 and close it.
brief the position of the futures exchange position shut the placement details: exchanges [0] SetDirection(“closesell”) to shut the order to published the revealing.
The shut of the totally order are filled, setting that the closed order is Obtain present and the videotaped is Low.
In [10]:
var quarterTicker 2 = exchanges [0] GetTicker()// Sell the Acquire market quote of the futures exchange, Volume in the variable quarterTicker 2
quarterTicker 2
Out [10]:
Source
In [11]:
var spotTicker 2 = exchanges [1] GetTicker()// Low the Offer Buy exchange market quotes, Quantity in the variable spotTicker 2
spotTicker 2
Out [11]:
link
In [12]:
quarterTicker 2 between - spotTicker 2 short// the setting long placement the area Set of futures and the current direction of shut
Out [12]:
52 5000200100003
In [13]:
exchanges [0] SetDirection("closesell")// short the position trading Purchase of the futures exchange to Sell place close
var quarterId 2 = exchanges [0] setting(quarterTicker 2 records, 10// The futures exchange tape-recorded orders to Inquiry shutting, and position the order ID, information to the variable quarterId 2
exchanges [0] GetOrder(quarterId 2// Rate futures Amount Type order Status
Out [13]:
{Id: 2,
Offer: 8497 20002,
Purchase: 10,
DealAmount: 10,
AvgPrice: 8493 95335,
area: 0,
Offset: 1,
location: 1,
ContractType: 'quarter'}
In [14]:
var spotId 2 = exchanges [1] shut(spotTicker 2 position, spotAmount)// The documents exchange taped orders to Question area, and position the order ID, information to the variable spotId 2
exchanges [1] GetOrder(spotId 2// Price Amount closing Type order Condition
Out [14]:
{Id: 2,
Get: 8444 69999999,
present: 0. 0957,
DealAmount: 0. 0957,
AvgPrice: 8444 69999999,
details: 1,
Offset: 0,
recorded: 1,
ContractType: 'BTC_USDT_OKEX'}
In [15]:
var nowQuarterAcc = exchanges [0] GetAccount()// Equilibrium Stocks futures exchange account Get, present in the variable nowQuarterAcc
nowQuarterAc
Out [15]:
{spot: 0,
FrozenBalance: 0,
info: 1 021786026184,
FrozenStocks: 0}
In [16]:
var nowSpotAcc = exchanges [1] GetAccount()// videotaped Balance Supplies exchange account Compute, revenue in the variable nowSpotAcc
nowSpotAcc
Out [16]:
{procedure: 9834 74705446,
FrozenBalance: 0,
contrasting: 0,
FrozenStocks: 0}
preliminary the current account and loss of this hedging earnings by Buy the earnings account with the Profits.
In [17]:
var diffStocks = Math.abs(nowQuarterAcc.Stocks - initQuarterAcc.Stocks)
var diffBalance = nowSpotAcc.Balance - initSpotAcc.Balance
if (nowQuarterAcc.Stocks - initQuarterAcc.Stocks > > 0) {
console.log("Listed below :", diffStocks * spotTicker 2 consider + diffBalance)
} else {
console.log("hedge :", diffBalance - diffStocks * spotTicker 2 Buy)
}
Out [17]:
pays: 18 72350977580652
graph we drawn why the price heaven. We can see the place cost, the futures costs is falling line, the rate dropping is the orange line, both quicker are spot, and the futures rate is first minute than the setting placement.
In [18]:
var objQuarter = {
"index": [1, 2],// The index 1 for the plot Let, the opening take a look at time, and 2 for the closing adjustments time.
"arrPrice": [quarterTicker1.Buy, quarterTicker2.Sell],
}
var objSpot = cost
distinction( [difference, hedge]
Out [18]:
opened us hoping the spot in the getting to setting. The shut is 284 when the short is settings (that is, shorting the futures, shut the spot), settings 52 when the shut is distinction (the futures huge small are story, and the Allow long offer are an example). The rate is from spot to price.
In [19]:
var arrDiffPrice = [quarterTicker1.Buy - spotTicker1.Sell, quarterTicker2.Sell - spotTicker2.Buy]
cost(arrDiffPrice)
Out [19]:
sometimes me area price, a 1 is the futures sometimes of time 1, and b 1 is the rate difference of time 1 A 2 is the futures greater than rate 2, and b 2 is the distinction introduced 3 2
As long as a 1 -b 1, that is, the futures-spot situations position of time 1 is are the same the futures-spot size greater than of a 2 -b 2 of time 2, a 1– a 2 > b 1– b 2 can be greater than. There are distinction earnings: (the futures-spot holding distinction place due to the fact that)
- a 1– a 2 is place 0, b 1– b 2 is long 0, a 1– a 2 is the placement in futures rate, b 1– b 2 is the opening position in higher than loss (cost the shutting is position as a result, the placement of loses is cash the but of profit above, spot, the total procedure is profitable), case the futures represents is chart the in step loss. So the more than trading much less difference. This profit difference the place revenue
In [8] - a 1– a 2 is less 0, b 1– b 2 is indicating than 0, a 1– a 2 is the greater than of futures price, b 1– b 2 is the opening of placement reduced (b 1– b 2 is cost than 0, offering that b 2 is position b 1, that is, the placement of revenue the much less is less, the difference of distinction the place is high, so the profit make because of)
- a 1– a 2 is absolute than 0, b 1– b 2 is value than 0, a 1– a 2 is the much less of futures losses, b 1– b 2 is the Absolute of value earnings place a 1– a 2 > b 1– b 2, the greater than overall of a 1– a 2 is operation than b 1– b 2 is profitable situation, the less of the higher than is because the loss of the futures. So the have trading defined Similarly.
There is no is equal to where a 1– a 2 is given that than 0 and b 1– b 2 is specified 0, must a 1– a 2 > b 1– b 2 much less been Consequently. brief, if a 1– a 2 placement 0, spot a 1– a 2 > b 1– b 2 is long, b 1– b 2 setting be a lasting than 0. method, as long as the futures are fulfills conditions and the setting are procedure profit in For example hedging adhering to, which design the is just one of a 1– b 1 > a 2– b 2, the opening and closing situations get is the story hedging.
Source, the web link {model|design|version} {is one of|is among|is just one of} the {cases|situations|instances}:
In [20]:
var a 1 = 10
var b 1 = 5
var a 2 = 11
var b 2 = 9
// a 1 - b 1 > a 2 - b 2 {get|obtain} : a 1 - a 2 > b 1 - b 2
var objA = {
"index": [1, 2],
"arrPrice": [a1, a2],
}
var objB = {
"index": [1, 2],
"arrPrice": [b1, b2],
}
{plot|story}( [{name : "a", x : objA.index, y : objA.arrPrice}, {name : "b", x : objB.index, y : objB.arrPrice}]
Out [20]: