
حال ہی میں میں نے Buu کی مقداری ڈائری دیکھی جس میں بتایا گیا ہے کہ آپ کرنسیوں کو منتخب کرنے کے لیے منفی طور پر منسلک کرنسیوں کا استعمال کر سکتے ہیں، اور قیمت کے فرق کی کامیابیوں کی بنیاد پر منافع کمانے کے لیے پوزیشنیں کھول سکتے ہیں۔ ڈیجیٹل کرنسیاں بنیادی طور پر مثبت طور پر منسلک ہوتی ہیں، اور صرف چند کرنسیاں منفی طور پر منسلک ہوتی ہیں، جیسے کہ کچھ عرصہ پہلے کے MEME سکوں کی آزاد مارکیٹ کی حالتیں، جو بالکل بھی فلٹر آؤٹ نہیں کرتی ہیں۔ ان کرنسیوں اور پیش رفت کے بعد طویل جانا، یہ طریقہ مارکیٹ کے بعض حالات میں منافع کما سکتا ہے۔ تاہم، مقداری تجارت کے میدان میں سب سے عام طریقہ جوڑے کی تجارت کے لیے مثبت ارتباط کا استعمال کرنا ہے۔
کریپٹو کرنسی پیئر ٹریڈنگ شماریاتی ثالثی پر مبنی ایک تجارتی حکمت عملی ہے، جو بیک وقت دو انتہائی باہم مربوط کرپٹو کرنسیوں کے دائمی معاہدوں کی خرید و فروخت کے ذریعے قیمت کے انحراف سے منافع حاصل کرنے کی کوشش کرتی ہے۔ یہ مضمون حکمت عملی کے اصولوں، منافع کا طریقہ کار، کرنسیوں کی اسکریننگ کا طریقہ، ممکنہ خطرات اور اسے بہتر بنانے کے طریقے متعارف کرائے گا، اور Python کوڈ کی کچھ عملی مثالیں فراہم کرے گا۔
جوڑوں کی تجارت کی حکمت عملی دو کریپٹو کرنسیوں کی قیمتوں کے درمیان تاریخی ارتباط پر انحصار کرتی ہے۔ جب دو کرنسیوں کا مضبوطی سے تعلق ہوتا ہے، تو ان کی قیمتیں تقریباً مطابقت پذیر ہوتی ہیں۔ اگر کسی خاص لمحے پر دونوں کی قیمت کا تناسب نمایاں طور پر ہٹ جاتا ہے، تو یہ سمجھا جا سکتا ہے کہ یہ ایک عارضی بے ضابطگی ہے اور قیمتیں معمول کی سطح پر واپس آ جائیں گی۔ ڈیجیٹل کرنسی مارکیٹ بہت زیادہ جڑی ہوئی ہے جب ایک بڑی ڈیجیٹل کرنسی (جیسے Bitcoin) میں نمایاں اتار چڑھاؤ آتا ہے، تو یہ عام طور پر دوسری ڈیجیٹل کرنسیوں کے درمیان ایک سلسلہ ردعمل کو متحرک کرتا ہے۔ کچھ کرنسیوں میں بہت واضح مثبت ارتباط ہو سکتا ہے، اور یہ ارتباط برقرار رہ سکتا ہے، کیونکہ ان کا تعلق ایک ہی سرمایہ کاری کے اداروں، ایک ہی مارکیٹ بنانے والے، اور ایک ہی ٹریک سے ہے۔ کچھ کرنسیاں منفی طور پر منسلک ہوتی ہیں، لیکن منفی طور پر منسلک کرنسیاں کم ہوتی ہیں، اور چونکہ وہ سبھی مارکیٹ کے مجموعی رجحان سے متاثر ہوتی ہیں، اس لیے وہ اکثر مارکیٹ کے مسلسل رجحانات دکھاتی ہیں۔
فرض کریں کہ سکے A اور سکے B میں قیمت کا باہمی تعلق ہے۔ ایک خاص لمحے پر، A/B قیمت کے تناسب کی اوسط قدر 1 ہے۔ اگر کسی خاص لمحے پر، A/B قیمت کا تناسب 0.001 سے زیادہ یعنی 1.001 سے زیادہ اضافے سے ہٹ جاتا ہے، تو آپ مندرجہ ذیل طریقوں سے تجارت کر سکتے ہیں: B پر لمبی پوزیشن کھولیں اور A پر مختصر پوزیشن کھولیں۔ . اس کے برعکس، جب A/B قیمت کا تناسب 0.999 سے کم ہے: A پر لمبی پوزیشن اور B پر مختصر پوزیشن کھولیں۔
منافع کی کلید قیمت کے فرق کے فوائد میں مضمر ہے جب قیمتیں منحرف ہوجاتی ہیں اور معمول پر آجاتی ہیں۔ چونکہ قیمتوں کا انحراف عام طور پر قلیل المدتی ہوتا ہے، اس لیے جب قیمتیں اوسط پر واپس آجاتی ہیں اور فرق سے منافع حاصل ہوتا ہے تو تاجر اپنی پوزیشنیں بند کر سکتے ہیں۔
ان کوڈز کو براہ راست استعمال کیا جا سکتا ہے، لیکن انانکوڈا کو ڈاؤن لوڈ کرنا اور اسے jupyer نوٹ بک میں ڈیبگ کرنا بہتر ہے۔ عام طور پر استعمال ہونے والے ڈیٹا کے تجزیہ کے لیے براہ راست پیکجز شامل ہیں۔
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) # 获取所有的正在交易的交易对
GetKlines فنکشن کا بنیادی کام Binance ایکسچینج سے مخصوص تجارتی جوڑے کے دائمی معاہدے کا تاریخی K-line ڈیٹا حاصل کرنا اور اس ڈیٹا کو Pandas DataFrame میں محفوظ کرنا ہے۔ K-line ڈیٹا میں افتتاحی قیمت، سب سے زیادہ قیمت، سب سے کم قیمت، اختتامی قیمت، تجارتی حجم اور دیگر معلومات شامل ہیں۔ اس بار ہم بنیادی طور پر بند قیمت کا ڈیٹا استعمال کرتے ہیں۔
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
اعداد و شمار کی مقدار نسبتاً زیادہ ہے تیزی سے ڈاؤن لوڈ کرنے کے لیے، پچھلے تین مہینوں کے لیے صرف فی گھنٹہ کے لائن ڈیٹا حاصل کیا گیا تھا۔ 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 کے درمیان ہے:
پیئرسن کوریلیشن گتانک ان کے ہم آہنگی اور معیاری انحراف کا حساب لگا کر دو متغیروں کے درمیان ارتباط کا تعین کرتا ہے۔ فارمولہ درج ذیل ہے:
[ \rho_{X,Y} = \frac{\text{cov}(X,Y)}{\sigma_X \sigma_Y} ]
میں:
بلاشبہ، آپ کو اس بارے میں زیادہ فکر کرنے کی ضرورت نہیں ہے کہ اس کا حساب کیسے لگایا جاتا ہے، آپ Python کوڈ کی صرف ایک لائن کا استعمال کرتے ہوئے تمام کرنسیوں کے ارتباط کا حساب لگا سکتے ہیں۔ اعداد و شمار گرمی کا ایک ارتباطی نقشہ دکھاتا ہے، سرخ مثبت ارتباط کی نمائندگی کرتا ہے، نیلا منفی ارتباط کی نمائندگی کرتا ہے، اور رنگ جتنا گہرا ہوتا ہے، ارتباط اتنا ہی مضبوط ہوتا ہے۔ یہ دیکھا جا سکتا ہے کہ بڑے علاقے گہرے سرخ ہیں، اس لیے ڈیجیٹل کرنسی کا مثبت ارتباط بہت مضبوط ہے۔

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) کی قیمت کے تناسب کو دیکھنے اور اس تناسب میں ہونے والی تبدیلیوں کی بنیاد پر تجارت پر توجہ مرکوز کرتی ہے۔ مخصوص اقدامات مندرجہ ذیل ہیں:
ابتدا:
eابتدائی بیلنس $10,000 ہے اور ٹرانزیکشن فیس 0.02% ہے۔avg。value = 1000。تکراری طور پر قیمت کے ڈیٹا پر کارروائی کریں۔:
df_close。diff。aim_value0.01 کے ہر انحراف کے لیے، ایک قدر کی تجارت کریں۔ اور کرنٹ اکاؤنٹ پوزیشنز اور قیمت کی شرائط کی بنیاد پر خرید و فروخت کے آپریشنز کا فیصلہ کریں۔pair_a اور خریدیںpair_b کام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定义放在评论区
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 گروپوں کی بیک ٹیسٹ کی گئی، اور نتائج نسبتاً مثالی تھے۔ موجودہ ارتباطی حسابات مستقبل کے اعداد و شمار کا استعمال کرتے ہیں، لہذا وہ بہت درست نہیں ہیں۔ یہ مضمون بھی اعداد و شمار کو دو حصوں میں تقسیم کرتا ہے، سامنے والے حصے میں کیلکولیشن شدہ ارتباط اور پیچھے کی جانچ شدہ لین دین کی بنیاد پر۔ نتائج بہت کم تھے لیکن پھر بھی بہت اچھے تھے۔ یہ تصدیق کرنے کے لیے صارف پر چھوڑ دیا گیا ہے۔

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