ڈیریبیٹ آپشنز کی متحرک ڈیلٹا ہیجنگ

مصنف:نینا باداس, تخلیق: 2022-04-24 11:32:48, تازہ کاری: 2022-04-24 15:50:56

ڈیریبیٹ آپشنز کی متحرک ڈیلٹا ہیجنگ

اس بار، ایف ایم زیڈ کوانٹ کی طرف سے لائی گئی حکمت عملی ہےڈیریبیٹ آپشنز کی متحرک ڈیلٹا ہیجنگ، مختصر طور پر DDH کے طور پر.

اختیارات کی تجارت کے مطالعہ کے لئے، ہمیں عام طور پر کئی پہلوؤں میں تصورات پر قابو پانے کی ضرورت ہوتی ہے:

  • آپشن کی قیمتوں کا تعین کرنے کا ماڈل؛ بی ایس ماڈل؛ آپشن کی قیمت کا تعین بنیادی قیمت، سٹرائیک قیمت، میعاد ختم ہونے تک کے دن، مضمون شدہ) اتار چڑھاؤ اور غیر خطرے کی شرح سود کی بنیاد پر کیا جاتا ہے۔

  • اختیارات کے خطرے سے متعلق خطرات:

    • ڈیلٹا آپشن سمت کا خطرہ۔ اگر ڈیلٹا ویلیو +0.5 ہے تو ، جب بنیادی قیمت بڑھتی اور گرتی ہے تو آپشن کی منافع اور نقصان کی کارکردگی کو 0.50 اسپاٹ سمجھا جاسکتا ہے۔
    • گاما دشاتمک خطرے کی تیز رفتار۔ مثال کے طور پر ، کال آپشن۔ گاما کی وجہ سے ، جہاں سے بنیادی قیمت اسٹرائیک قیمت پر ہے ، ڈیلٹا قیمت کے بڑھتے ہوئے عمل میں +0.50 سے +1.00 کے قریب آجائے گا۔
    • تھیٹا وقت میں زوال۔ جب آپ آپشنز خریدتے ہیں ، اگر بنیادی قیمت مستقل رہتی ہے تو ، ہر گزرتے دن کے ساتھ ، آپ تھیٹا ویلیو (ڈیربٹ کی قیمت امریکی ڈالر میں ہے) کے ذریعہ دکھائے جانے والے معاوضے کی ادائیگی کریں گے۔ جب آپ آپشنز فروخت کرتے ہیں، اور بنیادی قیمت مستقل رہتی ہے، ہر گزرتے دن کے ساتھ، آپ کو ایک فیس ملے گی جو تھیٹا ویلیو کے ذریعہ دکھائی جاتی ہے.
    • ویگا اتار چڑھاؤ کی نمائش۔ جب آپ آپشنز خریدتے ہیں تو ، ویگا کو ایک مثبت قدر کے طور پر ظاہر کیا جاتا ہے ، یعنی طویل ضمنی اتار چڑھاؤ۔ جب ضمنی اتار چڑھاؤ بڑھتا ہے تو ، آپ ویگا کے سامنے آکر منافع حاصل کرسکتے ہیں۔ اس کے برعکس صورتحال بھی ایسی ہی ہے۔ جب آپ آپشنز فروخت کرتے ہیں تو ، ضمنی اتار چڑھاؤ کم ہوجاتا ہے ، اور آپ کو منافع ملتا ہے۔

ڈی ڈی ایچ کی حکمت عملی کی وضاحت:

  • ڈی ڈی ایچ کے اصول کی وضاحت آپشنز اور فیوچر کے ڈیلٹا کو متوازن کرکے ، تجارتی سمت کا خطرہ غیر جانبداری حاصل کی جاتی ہے۔ چونکہ آپشن ڈیلٹا بنیادی قیمت میں تبدیلی کے ساتھ ساتھ بدلتا ہے ، لہذا فیوچر اور اسپاٹ کا ڈیلٹا برقرار رہے گا۔ آپشن کنٹریکٹ پوزیشن رکھنے اور ڈیلٹا کو ہیج اور توازن دینے کے لئے فیوچر کا استعمال کرنے کے بعد ، بنیادی قیمت کی تبدیلیوں کے ساتھ ، مجموعی طور پر ڈیلٹا دوبارہ غیر متوازن نظر آئے گا۔ آپشن پوزیشنوں اور فیوچر پوزیشنوں کے امتزاج کے لئے ، ڈیلٹا کو متوازن کرنے کے لئے مستقل متحرک ہیجنگ کی ضرورت ہے۔

    مثلاً: جب ہم کال آپشن خریدتے ہیں تو ، ہمارے پاس ایک تیزی کی پوزیشن ہوتی ہے۔ اس وقت ، مجموعی طور پر ڈیلٹا غیر جانبداری (0 یا 0 کے قریب) حاصل کرنے کے لئے آپشن ڈیلٹا کو ہیج کرنے کے لئے فیوچر کو مختصر کرنا ضروری ہے۔ آئیے عوامل کو نظرانداز کریں ، جیسے ختم ہونے کے دن اور آپشن معاہدے کی ضمنی اتار چڑھاؤ۔ پہلا منظرنامہ: جب بنیادی قیمت میں اضافہ ہوتا ہے تو ، آپشن ڈیلٹا میں اضافہ ہوتا ہے ، اور مجموعی طور پر ڈیلٹا مثبت تعداد میں منتقل ہوجاتا ہے۔ مستقبل میں دوبارہ ہیج کرنے کی ضرورت ہوتی ہے ، اور کچھ مختصر پوزیشنیں مختصر مستقبل میں جاری رکھنے کے لئے کھولی جاتی ہیں ، تاکہ مجموعی طور پر ڈیلٹا دوبارہ متوازن ہوجائے۔ (دوبارہ توازن سے پہلے، آپشن ڈیلٹا بڑا ہے، فیوچر ڈیلٹا نسبتا چھوٹا ہے، کال آپشن کا مارجنل منافع مختصر معاہدے کے مارجنل نقصان سے زیادہ ہے، اور پورے پورٹ فولیو کو منافع ملے گا.) منظر نامہ نمبر دو: جب بنیادی قیمت گرتی ہے تو ، آپشن ڈیلٹا کم ہوجاتا ہے ، اور مجموعی ڈیلٹا منفی تعداد میں منتقل ہوجاتا ہے ، اور کچھ مختصر فیوچر پوزیشنیں بند ہوجاتی ہیں تاکہ مجموعی ڈیلٹا بیلنس دوبارہ بنایا جاسکے۔ (دوبارہ توازن سے پہلے، آپشن ڈیلٹا چھوٹا ہے، فیوچر ڈیلٹا نسبتا بڑا ہے، کال آپشن کا مارجنل نقصان مختصر معاہدے کے مارجنل منافع سے کم ہے، اور پورے پورٹ فولیو میں اب بھی منافع ہوگا.)

    لہذا، مثالی طور پر، بنیادی کے عروج اور زوال دونوں منافع لاتے ہیں، جب تک کہ مارکیٹ میں اتار چڑھاؤ ہوتا ہے.

    تاہم ، دوسرے عوامل پر بھی غور کرنے کی ضرورت ہے: وقت کی قیمت ، تجارتی اخراجات اور دیگر۔

    تو، میں نے Zhihu سے ایک ماسٹر کی وضاحت کا حوالہ دیا:

    گاما اسکیلپنگ کا مرکز ڈیلٹا نہیں ہے ، متحرک ڈیلٹا ہیجنگ اس عمل میں بنیادی قیمت کے خطرے سے بچنے کا صرف ایک طریقہ ہے۔ گاما اسکیلپنگ الفا پر مرکوز ہے۔ الفا اسٹاک کے انتخاب کا الفا نہیں ہے۔ یہاں ، الفا = گاما / تھیٹا ، یعنی یونٹ تھیٹا کے وقت زوال سے کتنا گاما تبادلہ ہوتا ہے۔ یہ بات ہے۔ فلوٹنگ منافع کے ساتھ اضافہ اور کمی دونوں کا امتزاج بنانا ممکن ہے ، یقینا time وقت زوال کے ساتھ ساتھ ، اور مسئلہ لاگت کی کارکردگی کا تناسب ہے۔ مصنف: Xu Zhe؛ اصل مضمون کا لنک:https://www.zhihu.com/question/51630805/answer/128096385

ڈی ڈی ایچ کی حکمت عملی ڈیزائن

  • مجموعی مارکیٹ انٹرفیس کا احاطہ، ساخت کا ڈیزائن؛
  • حکمت عملی UI ڈیزائن؛
  • اسٹریٹجی انٹرایکشن ڈیزائن
  • خودکار ہیجنگ فنکشن ڈیزائن۔

ماخذ کوڈ:

// constructor 
function createManager(e, subscribeList, msg) {
	var self = {}
    self.supportList = ["Futures_Binance", "Huobi", "Futures_Deribit"]  // from the supported platforms

    // object attributes
    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 = []                    // all market data obtained by the interface; define the data format as: {bid1: 123, ask1: 123, symbol: "xxx"}}
    self.subscribeTickers = []           // the market data in need; define the data format as: {bid1: 123, ask1: 123, symbol: "xxx"}}
    self.accData = null 
    self.pos = null 

    // initialization function 
    self.init = function() { 
    	// judge whether the platform is supported 
        if (!_.contains(self.supportList, self.name)) {        	
        	throw "not support"
        }
    }

    self.setBase = function(base) {
        // switch base address, used to switch to the simulated bot 
        self.e.SetBase(base)
        Log(self.name, self.label, "switch to simulated bot:", base)
    }

    // judge the data precision 
    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
    }

    // update assets 
    self.updateAcc = function(callBackFuncGetAcc) {
        var ret = callBackFuncGetAcc(self)
        if (!ret) {
        	return false 
        }
        self.accData = ret 
        return true 
    }

    // update positions 
    self.updatePos = function(httpMethod, url, params) {
        var pos = self.e.IO("api", httpMethod, url, params)
        var ret = []
        if (!pos) {
            return false 
        } else {
            // arrange data 
            // {"jsonrpc":"2.0","result":[],"usIn":1616484238870404,"usOut":1616484238870970,"usDiff":566,"testnet":true}
            try {
                _.each(pos.result, function(ele) {
                    ret.push(ele)
                })
            } catch(err) {
                Log("error:", err)
                return false 
            }
            self.pos = ret
        }
        return true 
    }

    // update the market data 
    self.updateTicker = function(url, callBackFuncGetArr, callBackFuncGetTicker) {
    	var tickers = []
    	var subscribeTickers = []
    	var ret = self.httpQuery(url)
    	if (!ret) {
    		return false 
    	}
    	// Log("test", ret)// test
    	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("error:", 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("error:", 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
    }
    
    // return the positon table 
    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 : []
        }
        /* the position data format returned by the interface 
        {
            "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])
                }
                // traverse 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 
    }

    // initialize 
    self.init()
	return self 
}


function main() {
    // initialize, and vacuum logs
    if(isResetLog) {
    	LogReset(1)
    }

    var m1 = createManager(exchanges[0], [], "option")
    var m2 = createManager(exchanges[1], ["BTC-PERPETUAL"], "future")

    // switch to the simulated bot 
    var base = "https://www.deribit.com"
    if (isTestNet) {    
        m1.setBase(testNetBase)    
        m2.setBase(testNetBase)
        base = testNetBase
    }

    while(true) {
        // options 
        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}}) 
        
        // perpetual futures 
        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
        }

        // update positions 
        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
        }

        // interaction 
        var cmd = GetCommand()
        if(cmd) {
            // process interaction 
            Log("interactive command:", cmd)
            var arr = cmd.split(":")
            // cmdClearLog 
            if(arr[0] == "setContractType") {
                // parseFloat(arr[1])
                m1.e.SetContractType(arr[1])
                Log("exchanges[0] sets contract:", 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("executed price:", price, "executed amount:", amount, "executed direction:", 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("executed price:", price, "executed amount:", amount, "executed direction:", arr[0])
            } else if (arr[0] == "setHedgeDeltaStep") {
                hedgeDeltaStep = parseFloat(arr[1])
                Log("set hedgeDeltaStep:", hedgeDeltaStep)
            } 
        }
        
        // obtain futures contract price 
        var perpetualTicker = m2.getTicker("BTC-PERPETUAL")
        var hedgeMsg = " PERPETUAL:" + JSON.stringify(perpetualTicker)

        // obtain the total delta value from the account data        
        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 value is more than 0, hedge futures and make short                   
                var amount = _N(Math.abs(sumDelta) * perpetualTicker.ask1, -1)                
                if (amount > 10) {
                    Log("exceeding the hedging threshold value, the current total delta:", sumDelta, "call futures")
                    m2.e.SetContractType("BTC-PERPETUAL")                    
                    m2.e.SetDirection("buy")
                    m2.e.Buy(-1, amount)
                } else {
                	hedgeMsg += ", hedging order amount is less than 10"
                }
            } else {
                // delta value is less than 0, hedge futures and make long
                var amount = _N(Math.abs(sumDelta) * perpetualTicker.bid1, -1)
                if (amount > 10) {
                    Log("exceeding the hedging threshold value, the current total delta:", sumDelta, "put futures")
                    m2.e.SetContractType("BTC-PERPETUAL")
                    m2.e.SetDirection("sell")
                    m2.e.Sell(-1, amount)
                } else {
                	hedgeMsg += ", hedging order amount is less than 0"
                }
            }
        }

        LogStatus(_D(), "sumDelta:", sumDelta, hedgeMsg, 
        	"\n`" + JSON.stringify([m1.returnPosTbl(), m2.returnPosTbl()]) + "`", "\n`" + JSON.stringify(m2.returnTickersTbl()) + "`", "\n`" + JSON.stringify(m1.returnOptionTickersTbls()) + "`")
        Sleep(10000)
    }
}


حکمت عملی کے پیرامیٹرز:img

حکمت عملی کا پتہ:https://www.fmz.com/strategy/265090

حکمت عملی آپریشن:

img

img

حکمت عملی ایک سبق ہے، بنیادی طور پر مطالعہ کے لئے استعمال کیا جاتا ہے، تو براہ مہربانی ایک بوٹ میں استعمال کرنے کے لئے محتاط رہیں.


مزید