میں نے ڈیجیٹل کرنسیوں کی ہائی فریکوئنسی ٹریڈنگ پر دو مضامین لکھے ہیں، یعنی
اپنے پچھلے مضامین میں ، میں نے ذکر کیا ہے کہ اعلی تعدد کی حکمت عملی خاص طور پر انتہائی اتار چڑھاؤ والی منڈیوں کے لئے موزوں ہے۔ کسی تجارتی آلے کی قیمت میں ہونے والی تبدیلیوں میں مختصر عرصے میں مجموعی رجحانات اور اتار چڑھاؤ شامل ہوتے ہیں۔ اگرچہ اگر ہم رجحانات کی تبدیلیوں کی درست پیش گوئی کرسکتے ہیں تو یہ واقعی منافع بخش ہے ، لیکن یہ سب سے زیادہ چیلنجنگ پہلو بھی ہے۔ اس مضمون میں ، میں بنیادی طور پر اعلی تعدد بنانے والے حکمت عملیوں پر توجہ مرکوز کروں گا اور رجحان کی پیش گوئی میں گہرائی نہیں کروں گا۔ اتار چڑھاؤ والی منڈیوں میں ، بولی اور پوچھنے کے احکامات کو اسٹریٹجک طریقے سے رکھ کر ، اگر بولی کی تعدد کافی زیادہ ہے اور منافع کا مارجن اہم ہے تو ، یہ رجحانات کی وجہ سے ہونے والے ممکنہ نقصانات کو پورا کرسکتا ہے۔ اس طرح ، مارکیٹ کی نقل و حرکت کی پیش گوئی کیے بغیر منافع بخش حاصل کیا جاسکتا ہے۔ فی الحال ، تبادلے بنانے والے تجارت کے لئے چھوٹ فراہم کرتے ہیں ، جو منافع کا ایک جز بھی ہیں۔ مارکیٹ کا تناسب زیادہ ہوتا ہے ، چھوٹ
ایک حکمت عملی کو نافذ کرنے میں پہلا مسئلہ جو خرید اور فروخت دونوں آرڈرز رکھتا ہے وہ یہ طے کرنا ہے کہ ان آرڈرز کو کہاں رکھا جائے۔ آرڈرز کو مارکیٹ کی گہرائی کے قریب رکھا جاتا ہے ، عملدرآمد کا امکان زیادہ ہوتا ہے۔ تاہم ، انتہائی اتار چڑھاؤ والی مارکیٹ کے حالات میں ، جس قیمت پر آرڈر فوری طور پر عملدرآمد کیا جاتا ہے وہ مارکیٹ کی گہرائی سے دور ہوسکتا ہے ، جس کے نتیجے میں ناکافی منافع مل سکتا ہے۔ دوسری طرف ، آرڈرز کو بہت دور رکھنا عملدرآمد کا امکان کم کرتا ہے۔ یہ ایک اصلاحاتی مسئلہ ہے جس کو حل کرنے کی ضرورت ہے۔
پوزیشن کنٹرول خطرے کے انتظام کے لئے اہم ہے۔ ایک حکمت عملی طویل عرصے تک زیادہ پوزیشنوں کو جمع نہیں کرسکتی ہے۔ اس سے دور اور مقدار کو کنٹرول کرنے کے ساتھ ساتھ مجموعی پوزیشنوں پر حدود طے کرنے سے بھی نمٹا جاسکتا ہے۔
مندرجہ بالا اہداف کو حاصل کرنے کے لئے ، مختلف پہلوؤں جیسے عملدرآمد کے امکانات ، عملدرآمد سے منافع اور مارکیٹ کے تخمینے کے لئے ماڈلنگ اور تخمینہ لگانے کی ضرورت ہے۔ اس موضوع پر متعدد مضامین اور مقالے دستیاب ہیں ، جن میں کلیدی الفاظ جیسے
بائننس فراہم کرتا ہےڈاؤن لوڈ کے قابل ڈیٹاانفرادی تجارتوں اور بہترین بولی / طلب کے احکامات کے لئے۔ گہرائی کے اعداد و شمار کو ان کے API کے ذریعہ ڈاؤن لوڈ کیا جاسکتا ہے ، یا اسے دستی طور پر جمع کیا جاسکتا ہے۔ بیک ٹسٹنگ کے مقاصد کے لئے ، مجموعی تجارتی اعداد و شمار کافی ہیں۔ اس مضمون میں ، ہم HOOKUSDT-aggTrades-2023-01-27 ڈیٹا کی مثال استعمال کریں گے۔
میں [1]:
from datetime import date,datetime
import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
انفرادی تجارتی اعداد و شمار میں درج ذیل شامل ہیں:
یہ دیکھا جاسکتا ہے کہ اس دن 660،000 تجارتیں کی گئیں ، جس سے یہ ظاہر ہوتا ہے کہ مارکیٹ انتہائی سرگرم ہے۔ سی ایس وی فائل تبصرے کے سیکشن میں منسلک کی جائے گی۔
[4] میں:
trades = pd.read_csv('COMPUSDT-aggTrades-2023-07-02.csv')
trades
آؤٹ [4]: ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ،
664475 صفیں × 7 کالم
سب سے پہلے ، اعداد و شمار کو اصل تجارتوں کو دو گروپوں میں تقسیم کرکے عملدرآمد کیا جاتا ہے: بنانے والے کے طور پر انجام دیئے گئے خرید آرڈرز اور لینے والوں کے طور پر انجام دیئے گئے فروخت آرڈرز۔ اس کے علاوہ ، اصل مجموعی تجارتی اعداد و شمار ایک ہی وقت میں ، ایک ہی قیمت پر ، اور ایک ہی سمت میں انجام دیئے گئے تجارتوں کو ایک ہی ڈیٹا پوائنٹ میں جوڑتا ہے۔ مثال کے طور پر ، اگر 100 کے حجم کے ساتھ ایک ہی خرید آرڈر ہے تو ، اگر قیمتیں مختلف ہیں تو ، اسے بالترتیب 60 اور 40 کے حجم کے ساتھ دو تجارتوں میں تقسیم کیا جاسکتا ہے۔ اس سے خرید آرڈر کے حجم کا تخمینہ متاثر ہوسکتا ہے۔ لہذا ، ٹرانزیکشن_ٹائم کی بنیاد پر اعداد و شمار کو دوبارہ جمع کرنا ضروری ہے۔ اس دوسری مجموعی کے بعد ، ڈیٹا کا حجم 140,000 ریکارڈ کم ہوجاتا ہے۔
[6] میں:
trades['date'] = pd.to_datetime(trades['transact_time'], unit='ms')
trades.index = trades['date']
buy_trades = trades[trades['is_buyer_maker']==False].copy()
sell_trades = trades[trades['is_buyer_maker']==True].copy()
buy_trades = buy_trades.groupby('transact_time').agg({
'agg_trade_id': 'last',
'price': 'last',
'quantity': 'sum',
'first_trade_id': 'first',
'last_trade_id': 'last',
'is_buyer_maker': 'last',
'date': 'last',
'transact_time':'last'
})
sell_trades = sell_trades.groupby('transact_time').agg({
'agg_trade_id': 'last',
'price': 'last',
'quantity': 'sum',
'first_trade_id': 'first',
'last_trade_id': 'last',
'is_buyer_maker': 'last',
'date': 'last',
'transact_time':'last'
})
buy_trades['interval']=buy_trades['transact_time'] - buy_trades['transact_time'].shift()
sell_trades['interval']=sell_trades['transact_time'] - sell_trades['transact_time'].shift()
[10] میں:
print(trades.shape[0] - (buy_trades.shape[0]+sell_trades.shape[0]))
باہر [10]: 146181
مثال کے طور پر خریدنے کے احکامات لیں ، آئیے پہلے ایک ہسٹوگرام کو پلاٹ کریں۔ یہ مشاہدہ کیا جاسکتا ہے کہ ایک اہم لانگ ٹیل اثر ہے ، جس میں زیادہ تر ڈیٹا ہسٹوگرام کے سب سے بائیں حصے کی طرف مرکوز ہے۔ تاہم ، کچھ بڑی تجارتیں بھی دم کے اختتام کی طرف تقسیم ہیں۔
[36] میں:
buy_trades['quantity'].plot.hist(bins=200,figsize=(10, 5));
باہر [36]:
آسان مشاہدے کے لئے ، آئیے دم کو کاٹیں اور اعداد و شمار کا تجزیہ کریں۔ یہ مشاہدہ کیا جاسکتا ہے کہ جب تجارت کی مقدار میں اضافہ ہوتا ہے تو ، اس کی تعدد کم ہوجاتی ہے ، اور کمی کی شرح تیز ہوجاتی ہے۔
[37] میں:
buy_trades['quantity'][buy_trades['quantity']<200].plot.hist(bins=200,figsize=(10, 5));
باہر [37]:
تجارت کی مقدار کی تقسیم کے بارے میں متعدد مطالعے ہوئے ہیں۔ یہ پتہ چلا ہے کہ تجارت کی مقدار پاور قانون کی تقسیم پر عمل کرتی ہے ، جسے پیریٹو تقسیم بھی کہا جاتا ہے ، جو شماریاتی طبیعیات اور سماجی علوم میں ایک عام احتمال کی تقسیم ہے۔ پاور قانون کی تقسیم میں ، کسی واقعہ کے سائز (یا تعدد) کا امکان اس واقعہ کے سائز کے منفی اعشاریہ کے متناسب ہوتا ہے۔ اس تقسیم کی اہم خصوصیت یہ ہے کہ بڑے واقعات کی تعدد (یعنی ، اوسط سے دور) بہت سی دوسری تقسیموں میں متوقع سے زیادہ ہے۔ یہ بالکل تجارت کی مقدار کی تقسیم کی خصوصیت ہے۔ پیریٹو تقسیم کی شکل P ((x) = C ((x ^-α) کے ذریعہ دی گئی ہے۔ آئیے اس کی تجرباتی طور پر تصدیق کریں۔
مندرجہ ذیل گراف تجارت کی مقدار کے ایک خاص قدر سے زیادہ ہونے کے امکان کی نمائندگی کرتا ہے۔ نیلی لکیر اصل امکان کی نمائندگی کرتی ہے ، جبکہ نارنجی لکیر تخروپن کے امکان کی نمائندگی کرتی ہے۔ براہ کرم نوٹ کریں کہ ہم اس مقام پر مخصوص پیرامیٹرز میں نہیں جائیں گے۔ یہ مشاہدہ کیا جاسکتا ہے کہ تقسیم واقعی پارٹو تقسیم کی پیروی کرتی ہے۔ چونکہ صفر سے زیادہ تجارت کی مقدار کا امکان 1 ہے ، اور معمول کو پورا کرنے کے لئے ، تقسیم کے مساوات کو مندرجہ ذیل ہونا چاہئے:
یہاں ، N معمول کے لئے پیرامیٹر ہے۔ ہم اوسط تجارت کی رقم ، M کا انتخاب کریں گے ، اور الفا کو -2.06 پر مقرر کریں گے۔ جب D = N ہوتا ہے تو P قدر کا حساب کتاب کرکے الفا کا مخصوص تخمینہ حاصل کیا جاسکتا ہے۔ خاص طور پر ، الفا = log (((P(d>M)) / log ((2)) ۔ مختلف نکات کا انتخاب الفا کی قدر میں معمولی اختلافات کا باعث بن سکتا ہے۔
میں [55]:
depths = range(0, 250, 2)
probabilities = np.array([np.mean(buy_trades['quantity'] > depth) for depth in depths])
alpha = np.log(np.mean(buy_trades['quantity'] > mean_quantity))/np.log(2)
mean_quantity = buy_trades['quantity'].mean()
probabilities_s = np.array([(1+depth/mean_quantity)**alpha for depth in depths])
plt.figure(figsize=(10, 5))
plt.plot(depths, probabilities)
plt.plot(depths, probabilities_s)
plt.xlabel('Depth')
plt.ylabel('Probability of execution')
plt.title('Execution probability at different depths')
plt.grid(True)
باہر[55]:
[56] میں:
plt.figure(figsize=(10, 5))
plt.grid(True)
plt.title('Diff')
plt.plot(depths, probabilities_s-probabilities);
باہر[56]:
تاہم ، یہ تخمینہ صرف تخمینہ ہے ، جیسا کہ گراف میں دکھایا گیا ہے جہاں ہم نقلی اور اصل اقدار کے مابین فرق کو پلاٹ کرتے ہیں۔ جب تجارت کی رقم چھوٹی ہوتی ہے تو ، انحراف اہم ہوتا ہے ، یہاں تک کہ 10٪ تک پہنچ جاتا ہے۔ اگرچہ پیرامیٹر تخمینہ کے دوران مختلف نکات کا انتخاب اس مخصوص نقطہ
آسان بنانے کے لئے ، آئیے r = q / M کو معمول کی تجارت کی رقم کی نمائندگی کرنے کے لئے استعمال کریں۔ ہم پہلے کی طرح ہی طریقہ استعمال کرکے پیرامیٹرز کا اندازہ لگا سکتے ہیں۔ مندرجہ ذیل گراف سے پتہ چلتا ہے کہ ترمیم کے بعد ، زیادہ سے زیادہ انحراف 2٪ سے زیادہ نہیں ہے۔ نظریاتی طور پر ، مزید ایڈجسٹمنٹ کی جاسکتی ہے ، لیکن اس سطح کی درستگی پہلے ہی کافی ہے۔
میں [52]:
depths = range(0, 250, 2)
probabilities = np.array([np.mean(buy_trades['quantity'] > depth) for depth in depths])
mean = buy_trades['quantity'].mean()
alpha = np.log(np.mean(buy_trades['quantity'] > mean))/np.log(2.05)
probabilities_s = np.array([(((1+20**(-depth/mean))*depth+mean)/mean)**alpha for depth in depths])
plt.figure(figsize=(10, 5))
plt.plot(depths, probabilities)
plt.plot(depths, probabilities_s)
plt.xlabel('Depth')
plt.ylabel('Probability of execution')
plt.title('Execution probability at different depths')
plt.grid(True)
باہر[52]:
میں [53]:
plt.figure(figsize=(10, 5))
plt.grid(True)
plt.title('Diff')
plt.plot(depths, probabilities_s-probabilities);
باہر[53]:
تجارت کی مقدار کی تقسیم کے لئے تخمینہ مساوات کے ساتھ ، یہ نوٹ کرنا ضروری ہے کہ مساوات میں امکانات اصل امکانات نہیں ہیں ، بلکہ مشروط امکانات ہیں۔ اس مقام پر ، ہم اس سوال کا جواب دے سکتے ہیں: اگلے آرڈر کی مقدار ایک خاص قدر سے زیادہ ہونے کا امکان کیا ہے؟ ہم مختلف گہرائیوں پر احکامات کے عمل درآمد ہونے کا امکان بھی طے کرسکتے ہیں (مثالی منظرنامے میں ، آرڈر کے اضافے ، منسوخی اور ایک ہی گہرائی پر قطار میں کھڑے ہونے پر غور کیے بغیر) ۔
اس موقع پر ، متن کی لمبائی پہلے ہی کافی لمبی ہے ، اور ابھی بھی بہت سارے سوالات ہیں جن کا جواب دینے کی ضرورت ہے۔ مندرجہ ذیل سلسلہ مضامین میں جوابات فراہم کرنے کی کوشش کی جائے گی۔