Type/to search
8
Follow
1364
Followers
Stratégie de couverture dynamique Delta Option Deribit
Discussions
Created 2021-03-26 11:18:53  Updated 2024-12-05 21:55:32
 6
 4480

img

Stratégie de couverture dynamique Delta Option Deribit

La stratégie apportée par cette quantification FMZ estStratégie de couverture dynamique Delta Option Deribit, appelée stratégie DDH (couverture delta dynamique).

Lorsque nous apprenons le trading d’options, nous devons généralement maîtriser les concepts suivants :

  • Modèle de tarification des options, modèle B-S, le prix de l'option est déterminé sur la base du [prix de l'actif sous-jacent], du [prix d'exercice], du [temps restant jusqu'à l'expiration], de la [volatilité (implicite)] et du [taux d'intérêt sans risque].

  • Exposition aux options :

    • Delta — le risque directionnel d’une option. Si Delta est de +0,50, alors la performance des profits et des pertes de cette option lorsque le prix sous-jacent augmente ou diminue peut être considérée comme égale à 0,50 au comptant.
    • Gamma — accélération du risque directionnel. Par exemple, pour une option d'achat, en raison de l'effet Gamma, à partir du moment où le prix sous-jacent est au prix d'exercice, à mesure que le prix continue d'augmenter, Delta passera progressivement de +0,50 à +1,00.
    • Thêta — Temps d’exposition. Lorsque vous achetez une option, si le prix sous-jacent ne bouge pas, vous paierez des frais indiqués par le montant Theta (Deribit libellé en USD) pour chaque jour qui passe.
      Lorsque vous vendez une option, si le prix sous-jacent ne bouge pas, vous recevrez des frais indiqués par le montant Theta pour chaque jour qui passe.
    • Vega — Exposition à la volatilité. Lorsque vous achetez une option, Vega est positif, ce qui signifie que vous êtes long en volatilité. Lorsque la volatilité implicite augmente, vous bénéficiez de votre exposition au Vega. Inversement, lorsque vous vendez des options, la volatilité implicite diminue et vous gagnez.

Explication de la stratégie DDH :

  • Explication du principe DDH
    En équilibrant le Delta des options et des contrats à terme, la neutralité du risque dans le sens du trading peut être atteinte. Étant donné que le delta des options change en fonction du prix de l'actif sous-jacent, le delta des contrats à terme et au comptant reste inchangé.
    Après avoir détenu une position sur contrat d'option et utilisé des contrats à terme pour couvrir et équilibrer le Delta, le Delta global redeviendra déséquilibré à mesure que le prix de l'actif sous-jacent changera. Pour une combinaison de positions d'options et de positions à terme, une couverture dynamique continue et un équilibrage du Delta sont nécessaires.

    Par exemple:
    Lorsque nous achetons une option d’achat, nous détenons une position haussière. À l’heure actuelle, il est nécessaire de vendre à découvert des contrats à terme pour couvrir le Delta des options et atteindre une neutralité Delta globale (0 ou proche de 0).
    Nous ne prendrons pas en compte pour le moment des facteurs tels que le temps restant jusqu’à l’expiration du contrat d’option et la volatilité.
    Cas 1 :
    À mesure que le prix de l'actif sous-jacent augmente, le delta de la partie optionnelle augmente et le delta global se dirige vers un nombre positif. Les contrats à terme sont nécessaires pour se couvrir à nouveau, et une partie des positions courtes doit être ouverte pour continuer à vendre à découvert les contrats à terme afin d'équilibrer le Globalement, Delta à nouveau.
    (Avant le rééquilibrage, le Delta de l'option est important, tandis que le Delta des contrats à terme est relativement faible. Le bénéfice marginal de l'option d'achat dépasse la perte marginale du contrat à découvert, et l'ensemble du portefeuille réalisera un bénéfice.)

    Cas 2 :
    À mesure que le prix de l'actif sous-jacent baisse, le delta de la partie option diminue et le delta global se déplace vers un nombre négatif, fermant une partie des positions à terme courtes pour rééquilibrer le delta global.
    (Avant le rééquilibrage, le Delta de l'option est faible, tandis que le Delta des contrats à terme est relativement important. La perte marginale de l'option d'achat est inférieure au profit marginal du contrat court, de sorte que l'ensemble du portefeuille réalisera toujours un profit.)

    Idéalement, la hausse comme la baisse de l’actif sous-jacent généreront des bénéfices, tant qu’il y a des fluctuations du marché.

    Toutefois, d’autres facteurs doivent être pris en compte, notamment : la valeur temporelle, les coûts de transaction, etc.

    Je cite donc l'explication des experts de Zhihu :

    Gamma Scalping 的关注点并不是delta,dynamic delta hedging 只是过程中规避underlying价格风险的一种做法而已。 Gamma Scalping 关注的是Alpha,此Alpha不是选股的Alpha,这里的Alpha = Gamma/Theta也就是单位Theta的时间损耗换来多少Gamma, 这个是关注的点。可以构建出上涨和下跌都浮盈的组合,但一定伴随时间损耗,那问题就在于性价比了。 作者:许哲 链接:https://www.zhihu.com/question/51630805/answer/128096385

Explication de la conception de la stratégie DDH

  • Encapsulation d'interface de marché agrégé et conception de cadre
  • Conception de l'interface utilisateur de la stratégie
  • Conception d'interactions stratégiques
  • Conception de la fonction de couverture automatique

Code source :

javascript
// 构造函数 function createManager(e, subscribeList, msg) { var self = {} self.supportList = ["Futures_Binance", "Huobi", "Futures_Deribit"] // 支持的交易所的 // 对象属性 self.e = e self.msg = msg self.name = e.GetName() self.type = self.name.includes("Futures_") ? "Futures" : "Spot" self.label = e.GetLabel() self.quoteCurrency = "" self.subscribeList = subscribeList // subscribeList : [strSymbol1, strSymbol2, ...] self.tickers = [] // 接口获取的所有行情数据,定义数据格式:{bid1: 123, ask1: 123, symbol: "xxx"}} self.subscribeTickers = [] // 需要的行情数据,定义数据格式:{bid1: 123, ask1: 123, symbol: "xxx"}} self.accData = null self.pos = null // 初始化函数 self.init = function() { // 判断是否支持该交易所 if (!_.contains(self.supportList, self.name)) { throw "not support" } } self.setBase = function(base) { // 切换基地址,用于切换为模拟盘 self.e.SetBase(base) Log(self.name, self.label, "切换为模拟盘:", base) } // 判断数据精度 self.judgePrecision = function (p) { var arr = p.toString().split(".") if (arr.length != 2) { if (arr.length == 1) { return 0 } throw "judgePrecision error, p:" + String(p) } return arr[1].length } // 更新资产 self.updateAcc = function(callBackFuncGetAcc) { var ret = callBackFuncGetAcc(self) if (!ret) { return false } self.accData = ret return true } // 更新持仓 self.updatePos = function(httpMethod, url, params) { var pos = self.e.IO("api", httpMethod, url, params) var ret = [] if (!pos) { return false } else { // 整理数据 // {"jsonrpc":"2.0","result":[],"usIn":1616484238870404,"usOut":1616484238870970,"usDiff":566,"testnet":true} try { _.each(pos.result, function(ele) { ret.push(ele) }) } catch(err) { Log("错误:", err) return false } self.pos = ret } return true } // 更新行情数据 self.updateTicker = function(url, callBackFuncGetArr, callBackFuncGetTicker) { var tickers = [] var subscribeTickers = [] var ret = self.httpQuery(url) if (!ret) { return false } // Log("测试", ret)// 测试 try { _.each(callBackFuncGetArr(ret), function(ele) { var ticker = callBackFuncGetTicker(ele) tickers.push(ticker) if (self.subscribeList.length == 0) { subscribeTickers.push(ticker) } else { for (var i = 0 ; i < self.subscribeList.length ; i++) { if (self.subscribeList[i] == ticker.symbol) { subscribeTickers.push(ticker) } } } }) } catch(err) { Log("错误:", err) return false } self.tickers = tickers self.subscribeTickers = subscribeTickers return true } self.getTicker = function(symbol) { var ret = null _.each(self.subscribeTickers, function(ticker) { if (ticker.symbol == symbol) { ret = ticker } }) return ret } self.httpQuery = function(url) { var ret = null try { var retHttpQuery = HttpQuery(url) ret = JSON.parse(retHttpQuery) } catch (err) { // Log("错误:", err) ret = null } return ret } self.returnTickersTbl = function() { var tickersTbl = { type : "table", title : "tickers", cols : ["symbol", "ask1", "bid1"], rows : [] } _.each(self.subscribeTickers, function(ticker) { tickersTbl.rows.push([ticker.symbol, ticker.ask1, ticker.bid1]) }) return tickersTbl } // 返回持仓表格 self.returnPosTbl = function() { var posTbl = { type : "table", title : "pos|" + self.msg, cols : ["instrument_name", "mark_price", "direction", "size", "delta", "index_price", "average_price", "settlement_price", "average_price_usd", "total_profit_loss"], rows : [] } /* 接口返回的持仓数据格式 { "mark_price":0.1401105,"maintenance_margin":0,"instrument_name":"BTC-25JUN21-28000-P","direction":"buy", "vega":5.66031,"total_profit_loss":0.01226105,"size":0.1,"realized_profit_loss":0,"delta":-0.01166,"kind":"option", "initial_margin":0,"index_price":54151.77,"floating_profit_loss_usd":664,"floating_profit_loss":0.000035976, "average_price_usd":947.22,"average_price":0.0175,"theta":-7.39514,"settlement_price":0.13975074,"open_orders_margin":0,"gamma":0 } */ _.each(self.pos, function(ele) { if(ele.direction != "zero") { posTbl.rows.push([ele.instrument_name, ele.mark_price, ele.direction, ele.size, ele.delta, ele.index_price, ele.average_price, ele.settlement_price, ele.average_price_usd, ele.total_profit_loss]) } }) return posTbl } self.returnOptionTickersTbls = function() { var arr = [] var arrDeliveryDate = [] _.each(self.subscribeTickers, function(ticker) { if (self.name == "Futures_Deribit") { var arrInstrument_name = ticker.symbol.split("-") var currency = arrInstrument_name[0] var deliveryDate = arrInstrument_name[1] var deliveryPrice = arrInstrument_name[2] var optionType = arrInstrument_name[3] if (!_.contains(arrDeliveryDate, deliveryDate)) { arr.push({ type : "table", title : arrInstrument_name[1], cols : ["PUT symbol", "ask1", "bid1", "mark_price", "underlying_price", "CALL symbol", "ask1", "bid1", "mark_price", "underlying_price"], rows : [] }) arrDeliveryDate.push(arrInstrument_name[1]) } // 遍历arr _.each(arr, function(tbl) { if (tbl.title == deliveryDate) { if (tbl.rows.length == 0 && optionType == "P") { tbl.rows.push([ticker.symbol, ticker.ask1, ticker.bid1, ticker.mark_price, ticker.underlying_price, "", "", "", "", ""]) return } else if (tbl.rows.length == 0 && optionType == "C") { tbl.rows.push(["", "", "", "", "", ticker.symbol, ticker.ask1, ticker.bid1, ticker.mark_price, ticker.underlying_price]) return } for (var i = 0 ; i < tbl.rows.length ; i++) { if (tbl.rows[i][0] == "" && optionType == "P") { tbl.rows[i][0] = ticker.symbol tbl.rows[i][1] = ticker.ask1 tbl.rows[i][2] = ticker.bid1 tbl.rows[i][3] = ticker.mark_price tbl.rows[i][4] = ticker.underlying_price return } else if(tbl.rows[i][5] == "" && optionType == "C") { tbl.rows[i][5] = ticker.symbol tbl.rows[i][6] = ticker.ask1 tbl.rows[i][7] = ticker.bid1 tbl.rows[i][8] = ticker.mark_price tbl.rows[i][9] = ticker.underlying_price return } } if (optionType == "P") { tbl.rows.push([ticker.symbol, ticker.ask1, ticker.bid1, ticker.mark_price, ticker.underlying_price, "", "", "", "", ""]) } else if(optionType == "C") { tbl.rows.push(["", "", "", "", "", ticker.symbol, ticker.ask1, ticker.bid1, ticker.mark_price, ticker.underlying_price]) } } }) } }) return arr } // 初始化 self.init() return self } function main() { // 初始化,清空日志 if(isResetLog) { LogReset(1) } var m1 = createManager(exchanges[0], [], "option") var m2 = createManager(exchanges[1], ["BTC-PERPETUAL"], "future") // 切换为模拟盘 var base = "https://www.deribit.com" if (isTestNet) { m1.setBase(testNetBase) m2.setBase(testNetBase) base = testNetBase } while(true) { // 期权 var ticker1GetSucc = m1.updateTicker(base + "/api/v2/public/get_book_summary_by_currency?currency=BTC&kind=option", function(data) {return data.result}, function(ele) {return {bid1: ele.bid_price, ask1: ele.ask_price, symbol: ele.instrument_name, underlying_price: ele.underlying_price, mark_price: ele.mark_price}}) // 永续期货 var ticker2GetSucc = m2.updateTicker(base + "/api/v2/public/get_book_summary_by_currency?currency=BTC&kind=future", function(data) {return data.result}, function(ele) {return {bid1: ele.bid_price, ask1: ele.ask_price, symbol: ele.instrument_name}}) if (!ticker1GetSucc || !ticker2GetSucc) { Sleep(5000) continue } // 更新持仓 var pos1GetSucc = m1.updatePos("GET", "/api/v2/private/get_positions", "currency=BTC&kind=option") var pos2GetSucc = m2.updatePos("GET", "/api/v2/private/get_positions", "currency=BTC&kind=future") if (!pos1GetSucc || !pos2GetSucc) { Sleep(5000) continue } // 交互 var cmd = GetCommand() if(cmd) { // 处理交互 Log("交互命令:", cmd) var arr = cmd.split(":") // cmdClearLog if(arr[0] == "setContractType") { // parseFloat(arr[1]) m1.e.SetContractType(arr[1]) Log("exchanges[0]交易所对象设置合约:", arr[1]) } else if (arr[0] == "buyOption") { var actionData = arr[1].split(",") var price = parseFloat(actionData[0]) var amount = parseFloat(actionData[1]) m1.e.SetDirection("buy") m1.e.Buy(price, amount) Log("执行价格:", price, "执行数量:", amount, "执行方向:", arr[0]) } else if (arr[0] == "sellOption") { var actionData = arr[1].split(",") var price = parseFloat(actionData[0]) var amount = parseFloat(actionData[1]) m1.e.SetDirection("sell") m1.e.Sell(price, amount) Log("执行价格:", price, "执行数量:", amount, "执行方向:", arr[0]) } else if (arr[0] == "setHedgeDeltaStep") { hedgeDeltaStep = parseFloat(arr[1]) Log("设置参数hedgeDeltaStep:", hedgeDeltaStep) } } // 获取期货合约价格 var perpetualTicker = m2.getTicker("BTC-PERPETUAL") var hedgeMsg = " PERPETUAL:" + JSON.stringify(perpetualTicker) // 从账户数据中获取delta总值 var acc1GetSucc = m1.updateAcc(function(self) { self.e.SetCurrency("BTC_USD") return self.e.GetAccount() }) if (!acc1GetSucc) { Sleep(5000) continue } var sumDelta = m1.accData.Info.result.delta_total if (Math.abs(sumDelta) > hedgeDeltaStep && perpetualTicker) { if (sumDelta < 0) { // delta 大于0 对冲期货做空 var amount = _N(Math.abs(sumDelta) * perpetualTicker.ask1, -1) if (amount > 10) { Log("超过对冲阈值,当前总delta:", sumDelta, "买入期货") m2.e.SetContractType("BTC-PERPETUAL") m2.e.SetDirection("buy") m2.e.Buy(-1, amount) } else { hedgeMsg += ", 对冲下单量小于10" } } else { // delta 小于0 对冲期货做多 var amount = _N(Math.abs(sumDelta) * perpetualTicker.bid1, -1) if (amount > 10) { Log("超过对冲阈值,当前总delta:", sumDelta, "卖出期货") m2.e.SetContractType("BTC-PERPETUAL") m2.e.SetDirection("sell") m2.e.Sell(-1, amount) } else { hedgeMsg += ", 对冲下单量小于10" } } } LogStatus(_D(), "sumDelta:", sumDelta, hedgeMsg, "\n`" + JSON.stringify([m1.returnPosTbl(), m2.returnPosTbl()]) + "`", "\n`" + JSON.stringify(m2.returnTickersTbl()) + "`", "\n`" + JSON.stringify(m1.returnOptionTickersTbls()) + "`") Sleep(10000) } }

Paramètres de la stratégie :
img

Adresse de la stratégie : https://www.fmz.com/strategy/265090

Opération de stratégie :

img

img

Cette stratégie est une stratégie d'enseignement, principalement destinée à l'apprentissage. Veuillez l'utiliser avec prudence dans le cadre de transactions réelles.

Related Recommendations
Comment
All comments (6)

    这个能用于实盘吗?

    2 years ago

    您好,策略仅用于教学,测试,实盘可以具体自行修改调整。

    2 years ago

    是否可以设置一个价格区间 比如超过某价格才进行ddh

    2 years ago

    可以这样设计,要具体修改策略代码。

    2 years ago

    deribit好像听说过,是交易所吗?

    5 years ago

    是的,区块链资产衍生品交易所,币圈最专业的期权交易所。

    5 years ago
  • 1
iPhone Download
Forums
PINE Language
© 2015 - ∞ INVENTOR PTE LTD (SG)