حال ہی میں ، میں نے بوؤ کی کوانٹیٹیٹیو ڈائری کو دیکھا جس میں ذکر کیا گیا ہے کہ آپ کرنسیوں کا انتخاب کرنے کے لئے منفی طور پر وابستہ کرنسیوں کا استعمال کرسکتے ہیں ، اور قیمت کے فرق کی پیشرفت کی بنیاد پر منافع کمانے کے لئے پوزیشن کھول سکتے ہیں۔ ڈیجیٹل کرنسیاں بنیادی طور پر مثبت طور پر وابستہ ہیں ، اور صرف کچھ کرنسیاں منفی طور پر وابستہ ہیں ، اکثر خصوصی مارکیٹ کے حالات کے ساتھ ، جیسے ایم ای ایم ای سکے کے آزاد مارکیٹ کے حالات ، جو مارکیٹ کے رجحان سے بالکل مختلف ہیں۔ یہ کرنسیاں منتخب کی جاسکتی ہیں اور پیشرفت کے بعد طویل عرصے تک چلتی رہتی ہیں۔ یہ طریقہ مخصوص مارکیٹ کے حالات میں منافع کما سکتا ہے۔ تاہم ، مقداری تجارت کے میدان میں سب سے عام طریقہ جوڑی تجارت کے لئے مثبت ارتباط کا استعمال کرنا ہے۔ یہ مضمون اس حکمت عملی کا مختصر تعارف کرائے گا۔
ڈیجیٹل کرنسی کے جوڑے کی تجارت ایک تجارتی حکمت عملی ہے جو شماریاتی ثالثی پر مبنی ہے ، جو قیمت کے انحراف سے منافع حاصل کرنے کے لئے بیک وقت دو انتہائی وابستہ کریپٹو کرنسیوں کو خریدتا اور فروخت کرتا ہے۔ یہ مضمون اس حکمت عملی کے اصولوں ، منافع کے طریقہ کار ، کرنسیوں کے انتخاب کے طریقوں ، ممکنہ خطرات اور ان کو بہتر بنانے کے طریقوں کو متعارف کرائے گا ، اور کچھ عملی پائیٹن کوڈ کی مثالیں فراہم کرے گا۔
جوڑی ٹریڈنگ کی حکمت عملی دو ڈیجیٹل کرنسیوں کی قیمتوں کے مابین تاریخی ارتباط پر انحصار کرتی ہے۔ جب دو کرنسیوں کی قیمتوں میں مضبوط ارتباط ظاہر ہوتا ہے تو ، ان کی قیمت کے رجحانات عام طور پر ہم آہنگ ہوتے ہیں۔ اگر کسی خاص لمحے میں دونوں کے مابین قیمت کا تناسب نمایاں طور پر انحراف کرتا ہے تو ، اسے عارضی غیر معمولی سمجھا جاسکتا ہے اور قیمت معمول کی سطح پر واپس آجائے گی۔ ڈیجیٹل کرنسی مارکیٹ انتہائی باہمی طور پر جڑی ہوئی ہے۔ جب ایک بڑی ڈیجیٹل کرنسی (جیسے بٹ کوائن) نمایاں طور پر اتار چڑھاؤ کرتی ہے تو ، یہ عام طور پر دوسری ڈیجیٹل کرنسیوں میں مربوط رد عمل کو متحرک کرتی ہے۔ کچھ کرنسیوں میں ایک بہت ہی واضح مثبت ارتباط ہوسکتا ہے جو ایک ہی سرمایہ کاری کے اداروں ، ایک ہی مارکیٹ بنانے والوں اور ایک ہی ٹریک کی وجہ سے جاری رہ سکتا ہے۔ کچھ کرنسیاں منفی طور پر وابستہ ہیں ، لیکن منفی طور پر وابستہ کرنسیاں کم ہیں ، اور چونکہ وہ سب مارکیٹ کے رجحان سے متاثر ہوتے ہیں ، لہذا ان میں اکثر مستقل مارکیٹ رجحانات ہوتے ہیں۔
فرض کریں کہ کرنسی اے اور کرنسی بی میں قیمت کا ایک اعلی تعلق ہے۔ کسی خاص لمحے میں ، 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) # Get all trading pairs being traded
گیٹ لائنز فنکشن کا بنیادی کام بائننس ایکسچینج سے مخصوص ٹریڈنگ جوڑی کے دائمی معاہدے کے تاریخی 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
اعداد و شمار کا حجم نسبتا large بڑا ہے۔ تیزی سے ڈاؤن لوڈ کرنے کے ل only ، صرف پچھلے تین مہینوں کے گھنٹوں کے K لائن ڈیٹا حاصل کیے جاتے ہیں۔ 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')
ہم مندرجہ ذیل backtest کے لئے ایک تبادلہ اعتراض کی وضاحت.
class Exchange:
def __init__(self, trade_symbols, fee=0.0002, initial_balance=10000):
self.initial_balance = initial_balance #Initial assets
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 #Deduction fee
self.account['USDT']['fee'] += price*amount*self.fee
self.account[symbol]['fee'] += price*amount*self.fee
if cover_amount > 0: #Close the position first
self.account['USDT']['realised_profit'] += -direction*(price - self.account[symbol]['hold_price'])*cover_amount #profit
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): #Update the assets
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 لائن استعمال کرسکتے ہیں۔ اعداد و شمار میں ایک تعلق گرمی کا نقشہ دکھایا گیا ہے۔ سرخ مثبت تعلق کی نمائندگی کرتا ہے ، نیلے رنگ منفی تعلق کی نمائندگی کرتا ہے ، اور رنگ جتنا گہرا ہوگا ، تعلق اتنا ہی مضبوط ہوگا۔ آپ دیکھ سکتے ہیں کہ زیادہ تر علاقہ گہرا سرخ ہے ، لہذا ڈیجیٹل کرنسیوں کا مثبت تعلق بہت مضبوط ہے۔
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()
# Remove self-correlation (i.e. values on the diagonal)
corr_pairs = corr_pairs[corr_pairs != 1]
sorted_corr_pairs = corr_pairs.sort_values(kind="quicksort")
# Extract the top 20 most and least correlated currency pairs
most_correlated = sorted_corr_pairs.tail(40)[::-2]
print("The top 20 most correlated currency pairs are:")
print(most_correlated)
مخصوص بیک ٹیسٹ کوڈ مندرجہ ذیل ہے۔ مظاہرے کی حکمت عملی بنیادی طور پر دو کرپٹو کرنسیوں (IOTA اور ZIL) کی قیمت کے تناسب کا مشاہدہ کرتی ہے اور اس تناسب میں ہونے والی تبدیلیوں کے مطابق تجارت کرتی ہے۔ مخصوص اقدامات مندرجہ ذیل ہیں:
e
ایک ابتدائی توازن کے ساتھ $10,000 اور ایک لین دین کی فیس 0.02٪.avg
.value = 1000
.df_close
.diff
.aim_value
، اور ہر 0.01 انحراف کے لئے ایک قدر کی تجارت کی جاتی ہے۔ خرید و فروخت کے عمل کو کرنٹ اکاؤنٹ کی پوزیشن اور قیمت کی صورتحال کی بنیاد پر طے کیا جاتا ہے۔pair_a
اور خریدیںpair_b
operations.pair_a
اور فروختpair_b
کارروائیوں کی جاتی ہیں.avg
تازہ ترین قیمت کے تناسب کو ظاہر کرنے کے لئے.res_list
.res_list
ڈیٹا فریم پرres
مزید تجزیہ اور پیشکش کے لئے.pair_a = 'IOTA'
pair_b = "ZIL"
e = Exchange([pair_a,pair_b], fee=0.0002, initial_balance=10000) #Exchange definition is placed in the comments section
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 گروپوں کا بیک ٹیسٹ کیا گیا ، اور نتائج مثالی تھے۔ موجودہ ارتباط کے حساب سے مستقبل کے اعداد و شمار کا استعمال ہوتا ہے ، لہذا یہ بہت درست نہیں ہے۔ اس مضمون میں اعداد و شمار کو دو حصوں میں بھی تقسیم کیا گیا ہے ، جو تعلق کے پچھلے حساب اور بعد میں بیک ٹیسٹ ٹریڈنگ کی بنیاد پر ہے۔ نتائج قدرے مختلف ہیں لیکن برا نہیں ہیں۔ ہم اسے صارف پر چھوڑ دیتے ہیں کہ وہ مشق اور تصدیق کریں۔
اگرچہ جوڑی ٹریڈنگ کی حکمت عملی نظریاتی طور پر منافع بخش ہوسکتی ہے ، لیکن اصل آپریشن میں ابھی بھی کچھ خطرات موجود ہیں: کرنسیوں کے مابین تعلق وقت کے ساتھ ساتھ بدل سکتا ہے ، جس کی وجہ سے حکمت عملی ناکام ہوسکتی ہے۔ انتہائی مارکیٹ کے حالات میں ، قیمتوں میں انحراف بڑھ سکتا ہے ، جس کے نتیجے میں بڑے نقصانات ہوسکتے ہیں۔ کچھ کرنسیوں کی کم لیکویڈیٹی لین دین کو انجام دینا مشکل بناسکتی ہے یا لاگت میں اضافہ کرسکتی ہے۔ اور کثرت سے لین دین سے پیدا ہونے والی فیس منافع کو ختم کرسکتی ہے۔
خطرے کو کم کرنے اور حکمت عملیوں کے استحکام کو بہتر بنانے کے لئے ، مندرجہ ذیل بہتری کے اقدامات پر غور کیا جاسکتا ہے: کرنسیوں کے مابین تعلق کو باقاعدگی سے دوبارہ حساب لگائیں اور بروقت طریقے سے ٹریڈنگ کے جوڑے کو ایڈجسٹ کریں؛ ایک ہی لین دین کے زیادہ سے زیادہ نقصان کو کنٹرول کرنے کے لئے اسٹاپ نقصان اور منافع لینے کے مقامات مرتب کریں؛ خطرات کو متنوع کرنے کے لئے بیک وقت متعدد کرنسی کے جوڑے کی تجارت کریں۔
ڈیجیٹل کرنسی جوڑی ٹریڈنگ کی حکمت عملی کرنسی کی قیمتوں کے تعلق سے فائدہ اٹھاتے ہوئے اور قیمتوں میں انحراف ہونے پر ثالثی کے آپریشن انجام دے کر منافع حاصل کرتی ہے۔ اس حکمت عملی کی نظریاتی لحاظ سے اعلی اہلیت ہے۔ اس حکمت عملی پر مبنی ایک سادہ لائیو ٹریڈنگ حکمت عملی کا ماخذ کوڈ بعد میں جاری کیا جائے گا۔ اگر آپ کے مزید سوالات ہیں یا مزید گفتگو کی ضرورت ہے تو ، براہ کرم بلا جھجھک بات چیت کریں۔