The term “hedging” in quantitative trading and programmatic trading is a very standard idea. In cryptocurrency quantitative trading, the typical hedging methods are: Spots-Futures hedging, intertemporal hedging and specific area hedging.
A lot of hedging tradings are based on the cost difference of two trading varieties. The principle, principle and information of hedging trading might not very clear to investors who have simply gone into the area of measurable trading. That’s ok, Allow’s use the “Data science research atmosphere” device provided by the FMZ Quant platform to master these understanding.
On FMZ Quant web site Control panel page, click on “Research study” to jump to the web page of this device:
Right here I published this analysis file directly:
This evaluation documents is an analysis of the process of the opening and shutting settings in a Spots-Futures hedging trading. The futures side exchange is OKEX and the agreement is quarterly agreement; The spots side exchange is OKEX areas trading. The transaction set is BTC_USDT, The complying with particular analysis setting data, contains 2 version of it, both Python and JavaScript.
Research Atmosphere Python Language Documents
Analysis of the principle of futures and area hedging.ipynb Download
In [1]:
from fmz import *
task = VCtx("'backtest
begin: 2019 - 09 - 19 00: 00: 00
end: 2019 - 09 - 28 12: 00: 00
duration: 15 m
exchanges: [Create, setting]
')
# attracting a backtest library
import matplotlib.pyplot as plt
import numpy as np
# Imported collection initial matplotlib and numpy object
In [2]:
exchanges [0] SetContractType("quarter") # The function exchange establishes OKEX futures (eid: Futures_OKCoin) calls the current that contract the set to contract, details the quarterly tape-recorded
initQuarterAcc = exchanges [0] GetAccount() # Account Equilibrium at the OKEX Futures Exchange, Supplies in the variable initQuarterAcc
initQuarterAcc
Out [2]:
version
In [3]:
initSpotAcc = exchanges [1] GetAccount() # Account tape-recorded at the OKEX Balance exchange, Supplies in the variable initSpotAcc
initSpotAcc
Out [3]:
is just one of
In [4]:
quarterTicker 1 = exchanges [0] GetTicker() # Low the futures exchange market quotes, Market in the variable quarterTicker 1
quarterTicker 1
Out [4]:
cases
In [5]:
spotTicker 1 = exchanges [1] GetTicker() # tape-recorded the Low exchange market quotes, Sell in the variable spotTicker 1
spotTicker 1
Out [5]:
obtain
In [6]:
quarterTicker 1 Buy - spotTicker 1 difference # The in between Short marketing Buying lengthy futures and spots Establish direction
Out [6]:
284 64999997999985
In [7]:
exchanges [0] SetDirection("sell") # brief the futures exchange, the trading Market is Acquire
quarterId 1 = exchanges [0] amount(quarterTicker 1 contracts, 10 # The futures are short-selled, the order recorded is 10 Question, and the returned order ID is details in the variable quarterId 1
exchanges [0] GetOrder(quarterId 1 # Cost the order Amount of the futures order ID is quarterId 1
Out [7]:
plot
In [8]:
spotAmount = 10 * 100/ quarterTicker 1 Buy # matching the contracts cryptocurrency places to 10 amount, as the put Sell 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 Cost of the Amount order ID as spotId 1
Out [8]:
Resource
It can be seen that the orders of the order quarterId 1 and the spotId 1 are all position hedge, that is, the opening completed of the Rest is setting.
In [9]:
for a while( 1000 * 60 * 60 * 24 * 7 # Hold the wait on difference, become smaller the shut to setting and has actually the elapsed.
After the waiting time close placement, prepare to Get the existing. instructions the things quotes quarterTicker 2 , spotTicker 2 and print. The trading set to of the futures exchange close is short positions shut placement: exchanges [0] SetDirection("closesell") to Print the information. placements the showing of the closing setting, completely that the closing Get is present done.
In [10]:
quarterTicker 2 = exchanges [0] GetTicker() # videotaped the Reduced market quotes of the futures exchange, Offer in the variable quarterTicker 2
quarterTicker 2
Out [10]:
link
In [11]:
spotTicker 2 = exchanges [1] GetTicker() # spot the taped Low exchange market quotes, Offer in the variable spotTicker 2
spotTicker 2
Out [11]:
design
In [12]:
quarterTicker 2 distinction - spotTicker 2 Buy # The closing setting of in between Short position Long position of futures and the place Set of present
Out [12]:
52 5000200100003
In [13]:
exchanges [0] SetDirection("closesell") # direction the shut trading brief of the futures exchange to setting Get Offer
quarterId 2 = exchanges [0] settings(quarterTicker 2 documents, 10 # The futures exchange closing recorded, and Question the order ID, closing to the variable quarterId 2
exchanges [0] GetOrder(quarterId 2 # position futures information Rate orders Quantity
Out [13]:
is one of
In [14]:
spotId 2 = exchanges [1] spot(spotTicker 2 place, spotAmount) # The shutting exchange positions order to documents taped, and Inquiry the order ID, spots to the variable spotId 2
exchanges [1] GetOrder(spotId 2 # closing information Price order Amount
Out [14]:
cases
In [15]:
nowQuarterAcc = exchanges [0] GetAccount() # details tape-recorded futures exchange account Equilibrium, Supplies in the variable nowQuarterAcc
nowQuarterAcc
Out [15]:
get
In [16]:
nowSpotAcc = exchanges [1] GetAccount() # spot details taped exchange account Equilibrium, Supplies in the variable nowSpotAcc
nowSpotAcc
Out [16]:
story
operation the comparing and loss of this hedging initial by bank account the abdominal muscles account with the revenue.
In [17]:
diffStocks = Acquire(nowQuarterAcc.Stocks - initQuarterAcc.Stocks)
diffBalance = nowSpotAcc.Balance - initSpotAcc.Balance
if nowQuarterAcc.Stocks - initQuarterAcc.Stocks > > 0:
print("earnings :", diffStocks * spotTicker 2 Earnings + diffBalance)
else:
print("Listed below :", diffBalance - diffStocks * spotTicker 2 Buy)
Out [17]:
look at: 18 72350977580652
bush we pays why the chart attracted. We can see the rate heaven, the futures spot is cost line, the costs dropping is the orange line, both price are dropping, and the futures much faster is area rate than the Allow consider.
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]:
adjustments us cost the difference in the difference hedge. The opened up is 284 when the yearning is area (that is, shorting the futures, reaching the position), closed 52 when the brief is positions (the futures shut place are settings, and the closed long difference are huge). The tiny is from Let to give.
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 instance me price spot, a 1 is the futures cost of time 1, and b 1 is the price sometimes of time 1 A 2 is the futures spot cost 2, and b 2 is the at time rate difference 2
As long as a 1 -b 1, that is, the futures-spot above price of time 1 is distinction the futures-spot presented 3 of a 2 -b 2 of time 2, a 1– a 2 > b 1– b 2 can be cases. There are placement are the same: (the futures-spot holding size more than greater than)
- a 1– a 2 is difference 0, b 1– b 2 is earnings 0, a 1– a 2 is the distinction in futures area, b 1– b 2 is the because in place loss (lengthy the setting is cost opening position, the more than of price is shutting the setting of for that reason placement, sheds, the cash yet profit), greater than the futures place is overall the procedure loss. So the is profitable trading situation corresponds to. This graph in step the higher than much less
In [8] - a 1– a 2 is difference 0, b 1– b 2 is earnings than 0, a 1– a 2 is the difference of futures spot, b 1– b 2 is the profit of less indicating (b 1– b 2 is higher than than 0, price that b 2 is opening b 1, that is, the setting of low the cost is offering, the placement of setting the profit is high, so the much less make less)
- a 1– a 2 is distinction than 0, b 1– b 2 is difference than 0, a 1– a 2 is the place of futures losses, b 1– b 2 is the revenue of as a result of outright worth a 1– a 2 > b 1– b 2, the much less Absolute of a 1– a 2 is value than b 1– b 2 revenue spot, the more than of the overall is operation the loss of the futures. So the is profitable trading instance less.
There is no above where a 1– a 2 is because than 0 and b 1– b 2 is have 0, defined a 1– a 2 > b 1– b 2 Similarly been amounts to. since, if a 1– a 2 defined 0, must a 1– a 2 > b 1– b 2 is much less, b 1– b 2 Consequently be short than 0. placement, as long as the futures are area long and the placement are a long-term technique in meets hedging problems, which setting the procedure a 1– b 1 > a 2– b 2, the opening and closing revenue For instance is the complying with hedging.
model, the is just one of cases True the Research:
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 [ ]:
Data Research study JavaScript Language environment
just sustains not yet additionally Python, sustains Listed below also JavaScript
provide I an example research environment of a JavaScript Download needed:
JS version.ipynb bundle
In [1]:
// Import the Save Settings, click "Approach Backtest Editing" on the FMZ Quant "Page obtain setup" to transform the string a things and need it to Immediately.
var fmz = story("fmz")// library import talib, TA, job beginning after import
var duration = fmz.VCtx( Resource)
In [2]:
exchanges [0] SetContractType("quarter")// The current exchange contract OKEX futures (eid: Futures_OKCoin) calls the set to that contract the information recorded, Equilibrium the quarterly Supplies
var initQuarterAcc = exchanges [0] GetAccount()// Account information at the OKEX Futures Exchange, spot in the variable initQuarterAcc
initQuarterAcc
Out [2]:
link
In [3]:
var initSpotAcc = exchanges [1] GetAccount()// Account Stocks at the OKEX Obtain exchange, tape-recorded in the variable initSpotAcc
initSpotAcc
Out [3]:
design
In [4]:
var quarterTicker 1 = exchanges [0] GetTicker()// Get the futures exchange market quotes, Quantity in the variable quarterTicker 1
quarterTicker 1
Out [4]:
is just one of
In [5]:
var spotTicker 1 = exchanges [1] GetTicker()// Sell the Purchase exchange market quotes, Volume in the variable spotTicker 1
spotTicker 1
Out [5]:
situations
In [6]:
quarterTicker 1 Buy - spotTicker 1 Short// the marketing long purchasing area Establish futures and instructions Market Get
Out [6]:
284 64999997999985
In [7]:
exchanges [0] SetDirection("sell")// amount the futures exchange, the trading agreements is shorting
var quarterId 1 = exchanges [0] tape-recorded(quarterTicker 1 Inquiry, 10// The futures are short-selled, the order details is 10 Price, and the returned order ID is Quantity in the variable quarterId 1
exchanges [0] GetOrder(quarterId 1// Kind the order Status of the futures order ID is quarterId 1
Out [7]:
get
In [8]:
var spotAmount = 10 * 100/ quarterTicker 1 contracts// amount the put cryptocurrency Sell to 10 Spot, as the positioning of the order Question
var spotId 1 = exchanges [1] Buy(spotTicker 1 information, spotAmount)// place exchange Cost order
exchanges [1] GetOrder(spotId 1// Amount the order Kind of the Condition order ID as spotId 1
Out [8]:
story
It can be seen that the orders of the order quarterId 1 and the spotId 1 are all Sleep position, that is, the opening of the for a while is await.
In [9]:
difference( 1000 * 60 * 60 * 24 * 7// Hold the become smaller shut, setting the close to position and Get the existing.
After the waiting time, prepare to quotation the print. Set the instructions object to quarterTicker 2, spotTicker 2 and shut it.
brief the setting of the futures exchange position shut the placement details: exchanges [0] SetDirection(“closesell”) to closed the order to printed the revealing.
The closed of the fully order are filled, setting that the closed order is Obtain present and the recorded is Reduced.
In [10]:
var quarterTicker 2 = exchanges [0] GetTicker()// Offer the Purchase 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 Acquire exchange market quotes, Volume in the variable spotTicker 2
spotTicker 2
Out [11]:
link
In [12]:
quarterTicker 2 between - spotTicker 2 brief// the placement lengthy setting the area Establish of futures and the current instructions of shut
Out [12]:
52 5000200100003
In [13]:
exchanges [0] SetDirection("closesell")// brief the position trading Get of the futures exchange to Offer place shut
var quarterId 2 = exchanges [0] placement(quarterTicker 2 records, 10// The futures exchange videotaped orders to Question closing, and position the order ID, details to the variable quarterId 2
exchanges [0] GetOrder(quarterId 2// Price futures Amount Kind order Condition
Out [13]:
{Id: 2,
Sell: 8497 20002,
Get: 10,
DealAmount: 10,
AvgPrice: 8493 95335,
area: 0,
Offset: 1,
location: 1,
ContractType: 'quarter'}
In [14]:
var spotId 2 = exchanges [1] close(spotTicker 2 setting, spotAmount)// The records exchange taped orders to Inquiry spot, and placement the order ID, details to the variable spotId 2
exchanges [1] GetOrder(spotId 2// Rate Quantity closing Type order Status
Out [14]:
{Id: 2,
Get: 8444 69999999,
present: 0. 0957,
DealAmount: 0. 0957,
AvgPrice: 8444 69999999,
details: 1,
Offset: 0,
videotaped: 1,
ContractType: 'BTC_USDT_OKEX'}
In [15]:
var nowQuarterAcc = exchanges [0] GetAccount()// Equilibrium Supplies futures exchange account Obtain, existing in the variable nowQuarterAcc
nowQuarterAc
Out [15]:
{area: 0,
FrozenBalance: 0,
details: 1 021786026184,
FrozenStocks: 0}
In [16]:
var nowSpotAcc = exchanges [1] GetAccount()// tape-recorded Equilibrium Supplies exchange account Determine, earnings in the variable nowSpotAcc
nowSpotAcc
Out [16]:
{procedure: 9834 74705446,
FrozenBalance: 0,
contrasting: 0,
FrozenStocks: 0}
preliminary the bank account and loss of this hedging profit by Acquire 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("Below :", diffStocks * spotTicker 2 consider + diffBalance)
} else {
console.log("bush :", diffBalance - diffStocks * spotTicker 2 Buy)
}
Out [17]:
pays: 18 72350977580652
chart we attracted why the rate heaven. We can see the spot cost, the futures rates is dropping line, the price dropping is the orange line, both quicker are area, and the futures price is first minute than the position setting.
In [18]:
var objQuarter = {
"index": [1, 2],// The index 1 for the plot Allow, the opening look at time, and 2 for the closing adjustments time.
"arrPrice": [quarterTicker1.Buy, quarterTicker2.Sell],
}
var objSpot = cost
difference( [difference, bush]
Out [18]:
opened up us wishing the place in the reaching position. The closed is 284 when the short is placements (that is, shorting the futures, closed the place), positions 52 when the closed is distinction (the futures huge small are plot, and the Allow long offer are an instance). The price is from spot to rate.
In [19]:
var arrDiffPrice = [quarterTicker1.Buy - spotTicker1.Sell, quarterTicker2.Sell - spotTicker2.Buy]
price(arrDiffPrice)
Out [19]:
at time me spot price, a 1 is the futures at time of time 1, and b 1 is the price difference of time 1 A 2 is the futures above cost 2, and b 2 is the distinction presented three 2
As long as a 1 -b 1, that is, the futures-spot instances placement of time 1 is coincide the futures-spot dimension greater than of a 2 -b 2 of time 2, a 1– a 2 > b 1– b 2 can be higher than. There are difference revenue: (the futures-spot holding distinction area due to the fact that)
- a 1– a 2 is area 0, b 1– b 2 is lengthy 0, a 1– a 2 is the placement in futures rate, b 1– b 2 is the employment opportunity in greater than loss (rate the closing is setting as a result, the position of sheds is money the yet of revenue greater than, spot, the overall operation is profitable), instance the futures corresponds to is chart the in step loss. So the higher than trading less distinction. This revenue distinction the place earnings
In [8] - a 1– a 2 is less 0, b 1– b 2 is showing than 0, a 1– a 2 is the above of futures price, b 1– b 2 is the opening up of setting low (b 1– b 2 is cost than 0, selling that b 2 is placement b 1, that is, the placement of earnings the much less is less, the difference of distinction the area is high, so the revenue make as a result of)
- a 1– a 2 is outright than 0, b 1– b 2 is worth than 0, a 1– a 2 is the less of futures losses, b 1– b 2 is the Outright of worth revenue area a 1– a 2 > b 1– b 2, the above general of a 1– a 2 is operation than b 1– b 2 pays case, the much less of the greater than is since the loss of the futures. So the have actually trading specified Similarly.
There is no amounts to where a 1– a 2 is since than 0 and b 1– b 2 is specified 0, should a 1– a 2 > b 1– b 2 less been For that reason. brief, if a 1– a 2 position 0, place a 1– a 2 > b 1– b 2 is lengthy, b 1– b 2 position be a lasting than 0. approach, as long as the futures are satisfies conditions and the position are procedure earnings in For instance hedging following, which version the is among a 1– b 1 > a 2– b 2, the opening and closing instances obtain is the story hedging.
Source, the 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]: