3
پر توجہ دیں
1444
پیروکار

دائمی معاہدہ گرڈ حکمت عملی پیرامیٹر کی اصلاح کی تفصیلی وضاحت

میں تخلیق کیا: 2023-12-08 17:00:38, تازہ کاری: 2023-12-14 17:07:42
comments   1
hits   2862

دائمی معاہدہ گرڈ حکمت عملی پیرامیٹر کی اصلاح کی تفصیلی وضاحت

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

ڈیٹا اکٹھا کرنا

عام طور پر، درستگی کے لیے، K-لائن کا دورانیہ جتنا چھوٹا ہو، اتنا ہی بہتر ہوتا ہے، تاہم، یہ مضمون پچھلے دو سالوں سے 5 منٹ کا ڈیٹا استعمال کرتا ہے۔ آخری ڈیٹا والیوم 200,000 قطاروں سے زیادہ ہے DYDX کا انتخاب کریں۔ یقیناً، مخصوص کرنسی اور K-لائن کی مدت آپ کی اپنی دلچسپیوں کے مطابق منتخب کی جا سکتی ہے۔

import requests
from datetime import date,datetime
import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import requests, zipfile, io
%matplotlib inline

def GetKlines(symbol='BTC',start='2020-8-10',end='2021-8-10',period='1h'):
    Klines = []
    start_time = int(time.mktime(datetime.strptime(start, "%Y-%m-%d").timetuple()))*1000
    end_time = int(time.mktime(datetime.strptime(end, "%Y-%m-%d").timetuple()))*1000
    while start_time < end_time:
        res = requests.get('https://fapi.binance.com/fapi/v1/klines?symbol=%sUSDT&interval=%s&startTime=%s&limit=1000'%(symbol,period,start_time))
        res_list = res.json()
        Klines += res_list
        start_time = res_list[-1][0]
    return pd.DataFrame(Klines,columns=['time','open','high','low','close','amount','end_time','volume','count','buy_amount','buy_volume','null']).astype('float')

df = GetKlines(symbol='DYDX',start='2022-1-1',end='2023-12-7',period='5m')
df = df.drop_duplicates()

بیک ٹیسٹنگ فریم ورک

بیکٹیسٹ پہلے عام طور پر استعمال ہونے والے فریم ورک کا استعمال جاری رکھے ہوئے ہے جو USDT دائمی معاہدوں کی متعدد کرنسیوں کو سپورٹ کرتا ہے، جو سادہ اور استعمال میں آسان ہے۔

class Exchange:
    
    def __init__(self, trade_symbols, fee=0.0004, initial_balance=10000):
        self.initial_balance = initial_balance #初始的资产
        self.fee = fee
        self.trade_symbols = trade_symbols
        self.account = {'USDT':{'realised_profit':0, 'unrealised_profit':0, 'total':initial_balance, 'fee':0}}
        for symbol in trade_symbols:
            self.account[symbol] = {'amount':0, 'hold_price':0, 'value':0, 'price':0, 'realised_profit':0,'unrealised_profit':0,'fee':0}
            
    def Trade(self, symbol, direction, price, amount):
        
        cover_amount = 0 if direction*self.account[symbol]['amount'] >=0 else min(abs(self.account[symbol]['amount']), amount)
        open_amount = amount - cover_amount
        self.account['USDT']['realised_profit'] -= price*amount*self.fee #扣除手续费
        self.account['USDT']['fee'] += price*amount*self.fee
        self.account[symbol]['fee'] += price*amount*self.fee

        if cover_amount > 0: #先平仓
            self.account['USDT']['realised_profit'] += -direction*(price - self.account[symbol]['hold_price'])*cover_amount  #利润
            self.account[symbol]['realised_profit'] += -direction*(price - self.account[symbol]['hold_price'])*cover_amount
            
            self.account[symbol]['amount'] -= -direction*cover_amount
            self.account[symbol]['hold_price'] = 0 if self.account[symbol]['amount'] == 0 else self.account[symbol]['hold_price']
            
        if open_amount > 0:
            total_cost = self.account[symbol]['hold_price']*direction*self.account[symbol]['amount'] + price*open_amount
            total_amount = direction*self.account[symbol]['amount']+open_amount
            
            self.account[symbol]['hold_price'] = total_cost/total_amount
            self.account[symbol]['amount'] += direction*open_amount
                    
    
    def Buy(self, symbol, price, amount):
        self.Trade(symbol, 1, price, amount)
        
    def Sell(self, symbol, price, amount):
        self.Trade(symbol, -1, price, amount)
        
    def Update(self, close_price): #对资产进行更新
        self.account['USDT']['unrealised_profit'] = 0
        for symbol in self.trade_symbols:
            self.account[symbol]['unrealised_profit'] = (close_price[symbol] - self.account[symbol]['hold_price'])*self.account[symbol]['amount']
            self.account[symbol]['price'] = close_price[symbol]
            self.account[symbol]['value'] = abs(self.account[symbol]['amount'])*close_price[symbol]
            self.account['USDT']['unrealised_profit'] += self.account[symbol]['unrealised_profit']
        self.account['USDT']['total'] = round(self.account['USDT']['realised_profit'] + self.initial_balance + self.account['USDT']['unrealised_profit'],6)

گرڈ بیک ٹیسٹنگ فنکشن

گرڈ حکمت عملی کا اصول بہت آسان ہے: قیمت بڑھنے پر فروخت کریں اور قیمت کم ہونے پر خریدیں اس میں تین مخصوص پیرامیٹرز شامل ہیں: ابتدائی قیمت، گرڈ کی جگہ، اور لین دین کی قدر۔ DYDX کے بازار کے اتار چڑھاؤ بہت بڑے ہیں یہ ابتدائی 8.6U سے 1U تک گر گیا ہے، اور حالیہ بیل مارکیٹ میں 3U تک پہنچ گیا ہے، جو کہ گرڈ کے لیے بہت ناموافق ہے۔ حکمت عملی، لیکن پہلے سے طے شدہ پیرامیٹر بیک ٹیسٹ دو سالوں میں کل منافع 9200U تھا، اور ایک موقع پر 7500U کا نقصان ہوا تھا۔ دائمی معاہدہ گرڈ حکمت عملی پیرامیٹر کی اصلاح کی تفصیلی وضاحت

symbol = 'DYDX'
value = 100
pct = 0.01

def Grid(fee=0.0002, value=100, pct=0.01, init = df.close[0]):
    e = Exchange([symbol], fee=0.0002, initial_balance=10000)
    init_price = init
    res_list = [] #用于储存中间结果
    for row in df.iterrows():
        kline = row[1] #这样会测一根K线只会产生一个买单或一个卖单,不是特别精确
        buy_price = (value / pct - value) / ((value / pct) / init_price + e.account[symbol]['amount']) #买单价格,由于是挂单成交,也是最终的撮合价格
        sell_price = (value / pct + value) / ((value / pct) / init_price + e.account[symbol]['amount'])
        if kline.low < buy_price: #K线最低价低于当前挂单价,买单成交
            e.Buy(symbol,buy_price,value/buy_price)
        if kline.high > sell_price:
            e.Sell(symbol,sell_price,value/sell_price)
        e.Update({symbol:kline.close})
        res_list.append([kline.time, kline.close, e.account[symbol]['amount'], e.account['USDT']['total']-e.initial_balance,e.account['USDT']['fee'] ])
    res = pd.DataFrame(data=res_list, columns=['time','price','amount','profit', 'fee'])
    res.index = pd.to_datetime(res.time,unit='ms')
    return res

دائمی معاہدہ گرڈ حکمت عملی پیرامیٹر کی اصلاح کی تفصیلی وضاحت

ابتدائی قیمت کا اثر

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

تاہم، اگر ابتدائی قیمت 3U پر سیٹ کی جاتی ہے، تو حکمت عملی شروع میں مختصر ہو جائے گی اور اس مثال میں، 17,000 U کی مختصر پوزیشن براہ راست رکھی گئی ہے، اس لیے اسے زیادہ خطرات کا سامنا ہے۔

دائمی معاہدہ گرڈ حکمت عملی پیرامیٹر کی اصلاح کی تفصیلی وضاحت

گرڈ وقفہ کاری کی ترتیبات

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

چونکہ بیک ٹیسٹ 5mK لائن ڈیٹا استعمال کرتا ہے، اور K لائن پر صرف ایک لین دین ہوتا ہے۔ یہ واضح طور پر حقیقت کے مطابق نہیں ہے، خاص طور پر چونکہ ڈیجیٹل کرنسیوں کا اتار چڑھاؤ بہت زیادہ ہوتا ہے، اصل تجارت کے مقابلے میں بہت زیادہ لین دین کی کمی ہوتی ہے۔ اس بیک ٹیسٹنگ میکانزم کے تحت اخذ کیے گئے نتائج درست نہیں ہیں۔ ٹک لیول آرڈر فلو ڈیٹا کی بیک ٹیسٹنگ کے ذریعے، گرڈ کی بہترین جگہ 0.005-0.01 ہونی چاہیے۔

for p in [0.0005, 0.001 ,0.002 ,0.005, 0.01, 0.02, 0.05]:
    res = Grid( fee=0.0002, value=value*p/0.01, pct=p, init =3)
    print(p, round(min(res['profit']),0), round(res['profit'][-1],0), round(res['fee'][-1],0))
    
0.0005 -8378.0 144.0 237.0
0.001 -9323.0 1031.0 465.0
0.002 -9306.0 3606.0 738.0
0.005 -9267.0 9457.0 781.0
0.01 -9228.0 13375.0 550.0
0.02 -9183.0 15212.0 309.0
0.05 -9037.0 16263.0 131.0

گرڈ ٹرانزیکشن ویلیو

جیسا کہ پہلے ذکر کیا گیا ہے، جب اتار چڑھاؤ یکساں ہوتا ہے، جتنی زیادہ قدر رکھی جاتی ہے، اتنا ہی زیادہ خطرہ متناسب طریقہ ہوتا ہے، تاہم، جب تک کہ یہ تیزی سے کمی نہ ہو، کل فنڈز کا 1% گرڈ کے وقفے کے ساتھ مل جائے۔ زیادہ تر مارکیٹ کے حالات سے نمٹنے کے قابل ہونا چاہئے. اس DYDX مثال میں، تقریباً 90% کی کمی نے بھی مارجن کال کو متحرک کیا۔ لیکن براہ کرم نوٹ کریں کہ DYDX جب گرتا ہے تو گرڈ کی حکمت عملی طویل ہوتی ہے اور زیادہ سے زیادہ گراوٹ 100% ہوتی ہے تاہم اس میں اضافہ کی کوئی حد نہیں ہوتی اور خطرہ بہت زیادہ ہوتا ہے۔ اس لیے، گرڈ کی حکمت عملی تجویز کرتی ہے کہ صارفین ایسی کرنسیوں کا انتخاب کریں جن کے بارے میں ان کے خیال میں صلاحیت ہے اور وہ صرف لمبی ہیں۔

متغیر رجعت کی قیمت

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

سب سے پہلے، جب حکمت عملی شروع کی جاتی ہے، رجعت کی قیمت سٹارٹ اپ کے وقت قیمت کے 1.6 گنا مقرر کی جاتی ہے، اس طرح، گرڈ حکمت عملی قیمت کو موجودہ قیمت کے 1.6 گنا سے گرنے کے طور پر سمجھے گی اور طویل عرصے تک برقرار رکھنا شروع کر دے گی۔ قیمت کے فرق کے اس حصے کی وجہ سے ہونے والی پوزیشن اگر بعد کی قیمت سے زیادہ ہو جائے تو جب واپسی کی قیمت /1.6 ہو، تو ابتدائی قیمت دوبارہ ترتیب دی جاتی ہے، تاکہ طویل پوزیشنوں کے لیے کم از کم 60٪ فرق ہمیشہ دستیاب رہے۔ بیک ٹیسٹ کے نتائج درج ذیل ہیں: دائمی معاہدہ گرڈ حکمت عملی پیرامیٹر کی اصلاح کی تفصیلی وضاحت

یقیناً، اگر آپ مارکیٹ کے بارے میں زیادہ پرامید ہیں، تو آپ اس تناسب کو بڑی قیمت پر سیٹ کر سکتے ہیں، اور اس کے مطابق حتمی منافع بڑھے گا، یقیناً، اگر مارکیٹ گرتی ہے، تو یہ ترتیب پوزیشنوں پر فائز ہونے کا خطرہ بھی بڑھا دے گی۔