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

डिजिटल मुद्राओं के लिए व्यापार रणनीति

लेखक:घास, बनाया गयाः 2024-07-05 16:23:42, अद्यतनः 2024-07-12 09:19:11

img

डिजिटल मुद्राओं के लिए व्यापार रणनीति

अग्रलेख

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

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

रणनीतिक सिद्धांत

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

मान लीजिए कि मुद्रा A और मुद्रा B में उच्च मूल्य संबद्धता है. किसी समय, A/B मूल्य अनुपात का औसत 1 है. यदि किसी समय, A/B मूल्य अनुपात में वृद्धि 0.001 से अधिक या 1.001 से अधिक की विचलन से होती है, तो आप निम्न तरीके से व्यापार कर सकते हैंः अधिक B, कम A; इसके विपरीत, जब A/B मूल्य अनुपात 0.999 से कम होता हैः अधिक A, कम B।

मुनाफे की कुंजी यह है कि जब मूल्य विचलन सामान्य हो जाता है तो अंतर लाभ होता है। चूंकि मूल्य विचलन आमतौर पर अल्पकालिक होता है, इसलिए व्यापारी एक बार मूल्य औसत पर लौटने पर एक ब्रेक ले सकते हैं और लाभ कमा सकते हैं।

डेटा तैयार करें

सम्बंधित संग्रह का परिचय दें

इन कोडों का उपयोग सीधे किया जा सकता है, अधिमानतः एक अनाकोडा डाउनलोड करें और इसे एक जूपियर नोटबुक में डीबग करें; सीधे सामान्य डेटा विश्लेषण के लिए एक पैकेज शामिल करें।

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

सभी लेन-देन जोड़े प्राप्त करें

Info = requests.get('https://fapi.binance.com/fapi/v1/exchangeInfo')
b_symbols = [s['symbol'] for s in Info.json()['symbols'] if s['contractType'] == 'PERPETUAL' and s['status'] == 'TRADING' and s['quoteAsset'] == 'USDT']
b_symbols = list(filter(lambda x: x[-4:] == 'USDT', [s.split('_')[0] for s in b_symbols]))
b_symbols = [x[:-4] for x in b_symbols]
print(b_symbols) # 获取所有的正在交易的交易对

K पंक्ति के लिए फ़ंक्शन डाउनलोड करें

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

def GetKlines(symbol='BTCUSDT',start='2020-8-10',end='2024-7-01',period='1h',base='fapi',v = 'v1'):
    Klines = []
    start_time = int(time.mktime(datetime.strptime(start, "%Y-%m-%d").timetuple()))*1000 + 8*60*60*1000
    end_time =  min(int(time.mktime(datetime.strptime(end, "%Y-%m-%d").timetuple()))*1000 + 8*60*60*1000,time.time()*1000)
    intervel_map = {'m':60*1000,'h':60*60*1000,'d':24*60*60*1000}
    while start_time < end_time:
        time.sleep(0.3)
        mid_time = start_time+1000*int(period[:-1])*intervel_map[period[-1]]
        url = 'https://'+base+'.binance.com/'+base+'/'+v+'/klines?symbol=%s&interval=%s&startTime=%s&endTime=%s&limit=1000'%(symbol,period,start_time,mid_time)
        res = requests.get(url)
        res_list = res.json()
        if type(res_list) == list and len(res_list) > 0:
            start_time = res_list[-1][0]+int(period[:-1])*intervel_map[period[-1]]
            Klines += res_list
        if type(res_list) == list and len(res_list) == 0:
            start_time = start_time+1000*int(period[:-1])*intervel_map[period[-1]]
        if mid_time >= end_time:
            break
    df = pd.DataFrame(Klines,columns=['time','open','high','low','close','amount','end_time','volume','count','buy_amount','buy_volume','null']).astype('float')
    df.index = pd.to_datetime(df.time,unit='ms')
    return df

डेटा डाउनलोड करें

डेटा का आकार काफी बड़ा है और तेजी से डाउनलोड करने के लिए, केवल हाल के 3 महीनों के लिए घंटे के लिए डेटा प्राप्त किया गया है;df_close में सभी मुद्राओं के लिए समापन मूल्य डेटा शामिल है।

start_date = '2024-04-01'
end_date   = '2024-07-05'
period = '1h'
df_dict = {}

for symbol in b_symbols:   
    print(symbol)
    if symbol in df_dict.keys():
        continue
    df_s = GetKlines(symbol=symbol+'USDT',start=start_date,end=end_date,period=period)
    if not df_s.empty:
        df_dict[symbol] = df_s
df_close = pd.DataFrame(index=pd.date_range(start=start_date, end=end_date, freq=period),columns=df_dict.keys())
for symbol in symbols:
    df_close[symbol] = df_dict[symbol].close
df_close = df_close.dropna(how='all')

पुनः परीक्षण इंजन

एक एक्सचेंज ऑब्जेक्ट को परिभाषित करता है, जिसका उपयोग अगले पुनरीक्षण के लिए किया जाता है

class Exchange:
    def __init__(self, trade_symbols, fee=0.0002, 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, 'leverage':0, 'hold':0, 'long':0, 'short':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
        self.account['USDT']['hold'] = 0
        self.account['USDT']['long'] = 0
        self.account['USDT']['short'] = 0
        for symbol in self.trade_symbols:
            if not np.isnan(close_price[symbol]):
                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'] = self.account[symbol]['amount']*close_price[symbol]
                if self.account[symbol]['amount'] > 0:
                    self.account['USDT']['long'] += self.account[symbol]['value']
                if self.account[symbol]['amount'] < 0:
                    self.account['USDT']['short'] += self.account[symbol]['value']
                self.account['USDT']['hold'] += abs(self.account[symbol]['value'])
                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)
        self.account['USDT']['leverage'] = round(self.account['USDT']['hold']/self.account['USDT']['total'],3)

प्रासंगिकता विश्लेषण

संबंध गणना एक सांख्यिकीय विधि है जिसका उपयोग दो चरों के बीच रैखिक संबंधों को मापने के लिए किया जाता है। सबसे आम रूप से उपयोग की जाने वाली संबंध गणना विधि पील्सन संबंध गुणांक है। नीचे संबंध गणना के सिद्धांत, सूत्र और कार्यान्वयन हैं। पील्सन संबंध गुणांक का उपयोग दो चरों के बीच रैखिक संबंधों को मापने के लिए किया जाता है, जो -1 से 1 के बीच की सीमा को मानता हैः

  • 1यह दर्शाता है कि दोनों चर हमेशा समान रूप से बदलते हैं। जब एक चर बढ़ता है, तो दूसरा भी अनुपात में बढ़ता है। 1 के करीब होने से संबंध अधिक मजबूत होता है।
  • -1पूर्ण नकारात्मक संबंध दर्शाता है, दो चर हमेशा विपरीत परिवर्तन करते हैं.
  • 0यह दर्शाता है कि दो चर के बीच कोई सीधा संबंध नहीं है।

पील्सन सहसंबंध गुणांक दो चरों के सहसंबंध और मानकीकृत अंतर को गणना करके उनके संबंध को निर्धारित करता है। सूत्र इस प्रकार हैः

[ \rho_{X,Y} = \frac{\text{cov}(X,Y) }{\sigma_X \sigma_Y}]

इनमें से कुछ हैंः

  • (\rho_{X,Y}) चर (X) और (Y) के पीयरसन सहसंबंध है।
  • (\text{cov}(X,Y)) X और Y के बीच के अंतर है.
  • (\sigma_X) और (\sigma_Y) क्रमशः (X) और (Y) के मानक अंतर हैं।

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

img

import seaborn as sns
corr = df_close.corr()
plt.figure(figsize=(20, 20))
sns.heatmap(corr, annot=False, cmap='coolwarm', vmin=-1, vmax=1)
plt.title('Correlation Heatmap of Cryptocurrency Closing Prices', fontsize=20);

प्रासंगिकता के आधार पर, शीर्ष 20 सबसे प्रासंगिक मुद्रा जोड़े को चुना गया। परिणाम इस प्रकार हैं। वे सभी बहुत मजबूत हैं, सभी 0.99 से अधिक हैं।

MANA     SAND     0.996562
ICX      ZIL      0.996000
STORJ    FLOW     0.994193
FLOW     SXP      0.993861
STORJ    SXP      0.993822
IOTA     ZIL      0.993204
         SAND     0.993095
KAVA     SAND     0.992303
ZIL      SXP      0.992285
         SAND     0.992103
DYDX     ZIL      0.992053
DENT     REEF     0.991789
RDNT     MANTA    0.991690
STMX     STORJ    0.991222
BIGTIME  ACE      0.990987
RDNT     HOOK     0.990718
IOST     GAS      0.990643
ZIL      HOOK     0.990576
MATIC    FLOW     0.990564
MANTA    HOOK     0.990563

यह कोड निम्नानुसार है:

corr_pairs = corr.unstack()

# 移除自身相关性(即对角线上的值)
corr_pairs = corr_pairs[corr_pairs != 1]

sorted_corr_pairs = corr_pairs.sort_values(kind="quicksort")

# 提取最相关和最不相关的前20个币种对
most_correlated = sorted_corr_pairs.tail(40)[::-2]

print("最相关的前20个币种对:")
print(most_correlated)

पुनः परीक्षण सत्यापन

विशिष्ट रीसेट कोड इस प्रकार है; प्रदर्शन रणनीति का मुख्य उद्देश्य दो क्रिप्टोकरेंसी (IOTA और ZIL) के मूल्य अनुपात को देखना और इस अनुपात में परिवर्तन के आधार पर लेनदेन करना है; विशिष्ट चरण इस प्रकार हैंः

  1. आरंभ करना

    • व्यापारिक जोड़े को परिभाषित करें (pair_a = IOTA, pair_b = ZIL) ।
    • एक एक्सचेंज ऑब्जेक्ट बनाएंeइस तरह, एक विदेशी मुद्रा बैंक के लिए, एक प्रारंभिक शेष राशि $ 10,000 है, और लेनदेन शुल्क 0.02% है।
    • प्रारंभिक औसत मूल्य अनुपात की गणना करेंavg
    • एक प्रारंभिक लेनदेन मूल्य सेट करेंvalue = 1000
  2. मूल्य डेटा का पुनरावर्ती प्रसंस्करण

    • हर समय बिंदु पर मूल्य डेटाdf_close
    • औसत से वर्तमान मूल्य अनुपात के विचलन की गणना करेंdiff
    • विकृति के आधार पर लक्ष्य लेनदेन मूल्य की गणना करेंaim_value, प्रत्येक विचलन 0.01 के लिए, एक मूल्य का व्यापार किया जाता है. और वर्तमान खाते के भंडारण और मूल्य की स्थिति के आधार पर खरीद-बिक्री का निर्णय लिया जाता है.
    • अगर यह बहुत बड़ा है, तो इसे बेच देंpair_aऔर खरीदpair_bऑपरेशन।
    • यदि विचलन बहुत छोटा है, तो खरीदेंpair_aऔर बेच दियाpair_bऑपरेशन।
  3. औसत को समायोजित करें

    • औसत मूल्य अनुपात अद्यतन करेंavgइस तरह की एक तस्वीर में, हम देख सकते हैं कि यह कैसे है।
  4. खाता और रिकॉर्ड अपडेट करें

    • एक्सचेंज खाते के लिए जमा और शेष राशि की जानकारी अपडेट करें।
    • प्रत्येक चरण के लिए खाता स्थिति (कुल परिसंपत्तियां, होल्डिंग्स, लेन-देन शुल्क, बहुआयामी और खाली पद) दर्ज करेंres_list
  5. परिणाम आउटपुट

    • होगाres_listडेटाफ्रेम में परिवर्तित करेंresइस लेख में, हम आपको एक उदाहरण देते हैं।
pair_a = 'IOTA'
pair_b = "ZIL"
e = Exchange([pair_a,pair_b], fee=0.0002, initial_balance=10000) #Exchange定义放在评论区
res_list = []
index_list = []
avg = df_close[pair_a][0] / df_close[pair_b][0]
value = 1000
for idx, row in df_close.iterrows():
    diff = (row[pair_a] / row[pair_b] - avg)/avg
    aim_value = -value * diff / 0.01
    if -aim_value + e.account[pair_a]['amount']*row[pair_a] > 0.5*value:
        e.Sell(pair_a,row[pair_a],(-aim_value + e.account[pair_a]['amount']*row[pair_a])/row[pair_a])
        e.Buy(pair_b,row[pair_b],(-aim_value - e.account[pair_b]['amount']*row[pair_b])/row[pair_b])
    if -aim_value + e.account[pair_a]['amount']*row[pair_a]  < -0.5*value:
        e.Buy(pair_a, row[pair_a],(aim_value - e.account[pair_a]['amount']*row[pair_a])/row[pair_a])
        e.Sell(pair_b, row[pair_b],(aim_value + e.account[pair_b]['amount']*row[pair_b])/row[pair_b])
    avg = 0.99*avg + 0.01*row[pair_a] / row[pair_b]
    index_list.append(idx)
    e.Update(row)
    res_list.append([e.account['USDT']['total'],e.account['USDT']['hold'],
                         e.account['USDT']['fee'],e.account['USDT']['long'],e.account['USDT']['short']])
res = pd.DataFrame(data=res_list, columns=['total','hold', 'fee', 'long', 'short'],index = index_list)
res['total'].plot(grid=True);

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

img

संभावित जोखिम और सुधार के तरीके

यद्यपि युग्मित ट्रेडिंग रणनीतियाँ सैद्धांतिक रूप से लाभदायक हो सकती हैं, वास्तविक संचालन में कुछ जोखिम मौजूद हैंः मुद्राओं के बीच संबंध समय के साथ बदल सकते हैं, जिससे रणनीति विफल हो सकती है; चरम बाजार स्थितियों में, मूल्य विचलन बढ़ सकता है, जिससे बड़े नुकसान हो सकते हैं; कुछ मुद्राओं की कम तरलता, जिससे लेनदेन मुश्किल हो सकता है या लागत बढ़ सकती है; और बार-बार लेनदेन से उत्पन्न प्रसंस्करण शुल्क लाभ को खराब कर सकता है।

जोखिम को कम करने और रणनीतियों की स्थिरता बढ़ाने के लिए, निम्नलिखित सुधारों पर विचार किया जा सकता हैः मुद्राओं के बीच संबंधों को नियमित रूप से फिर से गणना करना, समय पर व्यापार जोड़े को समायोजित करना; स्टॉप-लॉस और स्टॉप-टारगेट सेट करना, एकल व्यापार पर अधिकतम नुकसान को नियंत्रित करना; एक ही समय में कई मुद्रा जोड़े का व्यापार करना, जोखिम को फैलाना।

निष्कर्ष

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


अधिक

77924998क्या यह अध्ययन के लायक है?

बीन्स 888चांग ने ओवरटाइम किया - हाहाहा!