संसाधन लोड हो रहा है... लोड करना...

स्थायी अनुबंध ग्रिड रणनीति पैरामीटर अनुकूलन विवरण

लेखक:घास, बनाया गयाः 2023-12-08 17:00:38, अद्यतन किया गयाः 2023-12-14 17:07:42

img

स्थायी ग्रिड रणनीति प्लेटफार्मों के लिए एक बहुत ही लोकप्रिय क्लासिक रणनीति है. नकदी ग्रिड की तुलना में सिक्का-मुक्त, लीवरेज योग्य, और नकदी ग्रिड की तुलना में बहुत आसान है. लेकिन चूंकि आविष्कारक के लिए सीधे क्वांटिफाइड प्लेटफॉर्म पर पुनः परीक्षण करना असंभव है, इसलिए यह सिक्के के प्रकार को छानने और पैरामीटर अनुकूलन को निर्धारित करने के लिए प्रतिकूल है, इस लेख में पूर्ण पायथन पुनः परीक्षण प्रक्रिया का परिचय दिया जाएगा, जिसमें डेटा संग्रह, पुनः परीक्षण फ्रेमवर्क पुनः परीक्षण, माप फ़ंक्शन, पैरामीटर अनुकूलन आदि के सभी पहलुओं को शामिल किया गया है, जिसे आप अपने स्वयं के juypter नोटबुक में आज़मा सकते हैं।

डेटा संग्रह

सामान्य तौर पर, के-लाइन डेटा के साथ पर्याप्त है, सटीकता के लिए, के-लाइन चक्र जितना छोटा होगा उतना बेहतर होगा, लेकिन पुनरावृत्ति समय और डेटा की मात्रा को संतुलित करें, इस लेख में हाल के दो वर्षों के डेटा का पुनरावृत्ति के लिए 5 मिनट का उपयोग किया गया है, अंतिम डेटा 20W लाइन से अधिक है, मुद्रा DYDX का चयन करती है। बेशक, विशिष्ट मुद्रा और के-लाइन चक्र को अपनी रुचि के अनुसार चुना जा सकता है।

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)

ग्रिड पुनः परीक्षण फ़ंक्शन

ग्रिड रणनीति का सिद्धांत बहुत सरल है, बेचने और खरीदने के लिए गिर गया है, विशेष रूप से तीन मापदंडों से संबंधित हैः प्रारंभिक मूल्य, ग्रिड अंतराल, लेनदेन मूल्य। डीवाईडीएक्स का बाजार बहुत बड़ा उतार-चढ़ाव है, शुरुआती 8.6 यू के निचले स्तर से 1 यू गिर गया है, हाल ही में बैल बाजार फिर से 3 यू वापस आ गया है, रणनीति का डिफ़ॉल्ट प्रारंभिक मूल्य 8.6 यू है, जो ग्रिड रणनीति के लिए बहुत प्रतिकूल है, लेकिन डिफ़ॉल्ट पैरामीटर दो साल के लिए कुल लाभ 9200 यू और एक अवधि में 7500 यू के नुकसान का अनुमान लगाता है।img

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

img

शुरुआती कीमतों का प्रभाव

प्रारंभिक मूल्य की स्थापना रणनीति को प्रभावित करती है, जो अभी-अभी दोहराई गई डिफ़ॉल्ट प्रारंभिक मूल्य स्टार्टअप की शुरुआती कीमत है, यानी स्टार्टअप पर स्टॉक नहीं है। और हम जानते हैं कि ग्रिड रणनीति मूल्य की शुरुआत में लौटने पर सभी लाभ कमाएगी, इसलिए यदि रणनीति शुरू होने पर भविष्य के बाजार के बारे में सही पूर्वानुमान हो सकता है, तो लाभ में काफी वृद्धि होगी। यहां प्रारंभिक मूल्य को 3U पर सेट करें और फिर दोहराएं। अंतिम अधिकतम वापसी 9200U, अंतिम लाभ 13372U है। अंतिम रणनीति नहीं है, जो लाभ सभी उतार-चढ़ाव लाभ है, और डिफ़ॉल्ट पैरामीटर के लाभ का अंतर यह है कि अंतिम मूल्य निर्णय के लिए स्टॉक हानि नहीं ले सकता है।

लेकिन शुरुआती कीमत 3 यू सेट की गई है, और रणनीति शुरू में ही खाली हो जाएगी और बड़ी मात्रा में खाली स्टॉक रखती है, इस उदाहरण में सीधे 17,000 यू के खाली नोटों को पकड़कर, इसलिए जोखिम भी अधिक है।

img

ग्रिड अंतराल सेटिंग

ग्रिड अंतराल आदेशों की दूरी निर्धारित करता है, स्पष्ट रूप से कम अंतराल लेनदेन अधिक बार होता है, कम मुनाफा, और उच्च प्रक्रिया शुल्क। लेकिन यह ध्यान देने योग्य है कि ग्रिड अंतराल कम हो जाता है और ग्रिड मूल्य अपरिवर्तित रहता है, जब कीमत बदलती है, तो कुल होल्डिंग बढ़ जाती है, जोखिम पूरी तरह से अलग होता है। इसलिए ग्रिड अंतराल के काम को फिर से मापने के लिए, ग्रिड मूल्य को कम करने की आवश्यकता होती है।

चूंकि पुनरीक्षण 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% कुल पूंजी के साथ 1% ग्रिड अंतराल को अधिकांश बाजारों से निपटना चाहिए। इस बार के डीवाईडीएक्स उदाहरण में, लगभग 90% गिरावट ने भी विस्फोट को ट्रिगर किया। लेकिन ध्यान दें कि डीवाईडीएक्स मुख्य रूप से गिर रहा है, गिरने पर ग्रिड रणनीति अधिक है, अधिकतम 100% गिर जाएगी, जबकि वृद्धि कोई सीमा नहीं है, जोखिम बहुत अधिक है। इसलिए ग्रिड रणनीति उपयोगकर्ताओं को केवल कई प्रकार के सिक्के चुनने की सलाह देती है जिन्हें वे संभावित मानते हैं।

परिवर्तनीय वापसी मूल्य

रिवर्स प्राइस यानी शुरुआती प्राइस, वर्तमान प्राइस और शुरुआती प्राइस के बीच का अंतर और ग्रिड का आकार तय करता है कि कितनी पोजीशन को रखा जाना चाहिए, अगर रिवर्स प्राइस वर्तमान प्राइस से ऊपर सेट है, तो ग्रिड की रणनीति अधिक करेगी और बदले में खाली हो जाएगी। डिफ़ॉल्ट रिवर्स प्राइस रणनीति शुरू होने पर की गई कीमत है। जोखिम को कम करने के लिए, केवल अधिक ग्रिड करने की सिफारिश की जाती है। एक स्वाभाविक विचार यह है कि रिवर्स प्राइस को नहीं बदला जा सकता है, ताकि कीमत बढ़ने पर भी, अभी भी बहुत सारे स्टॉक रखे जाएं, स्वचालित रूप से समायोजित न हों।img

पहली बार रणनीति शुरू करने पर, रिवर्स प्राइस को स्टार्ट प्राइस के 1.6 गुना पर सेट किया जाता है, ताकि ग्रिड पॉलिसी इस हिस्से के अंतर के कारण होने वाली बहु-स्थिति को रखने के लिए शुरू हो, जब कीमत 1.6 गुना से वर्तमान मूल्य पर गिर जाती है, और यदि बाद की कीमत रिवर्स प्राइस / 1.6 से अधिक हो जाती है, तो प्रारंभिक मूल्य को फिर से सेट किया जाता है, ताकि हमेशा कम से कम 60% अंतर का उपयोग किया जा सके। रिवर्स परिणाम इस प्रकार हैंःimg

बेशक, अगर आप बाजार के बारे में अधिक आशावादी हैं, तो आप इस अनुपात को और अधिक सेट कर सकते हैं, और अंत में लाभ भी इसी तरह बढ़ेगा, और निश्चित रूप से यदि बाजार गिरता है, तो इस तरह का सेटअप होल्डिंग जोखिम को भी बढ़ाता है।


अधिक

नैनसेगfmz सीधे ग्रिड नीति का पता क्यों नहीं लगा सकता है?