پچھلے مضمون میں، ہم نے ایک مخصوص قدر سے زیادہ ہونے کی ایک واحد تجارت کی رقم کے امکان کے لئے ایک اظہار حاصل کیا.
ہم وقت کی ایک مدت کے دوران ٹریڈنگ کی رقم کی تقسیم میں بھی دلچسپی رکھتے ہیں ، جو بدیہی طور پر انفرادی تجارت کی رقم اور آرڈر کی تعدد سے متعلق ہونا چاہئے۔ ذیل میں ، ہم اعداد و شمار کو مقررہ وقفوں میں پروسیس کرتے ہیں اور اس کی تقسیم کا نقشہ بناتے ہیں ، جیسا کہ پچھلے حصے میں کیا گیا تھا۔
میں [1]:
from datetime import date,datetime
import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
[2] میں:
trades = pd.read_csv('HOOKUSDT-aggTrades-2023-01-27.csv')
trades['date'] = pd.to_datetime(trades['transact_time'], unit='ms')
trades.index = trades['date']
buy_trades = trades[trades['is_buyer_maker']==False].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'
})
buy_trades['interval']=buy_trades['transact_time'] - buy_trades['transact_time'].shift()
buy_trades.index = buy_trades['date']
ہم تجارتی سرگرمی کے بغیر ادوار کو چھوڑ کر ، مجموعی تجارتی رقم حاصل کرنے کے لئے 1 سیکنڈ کے وقفوں پر انفرادی تجارت کی رقم کو جوڑتے ہیں۔ پھر ہم اس مجموعی رقم کو پہلے ذکر کردہ واحد تجارت کی رقم کے تجزیے سے اخذ کردہ تقسیم کا استعمال کرتے ہوئے فٹ کرتے ہیں۔ نتائج ایک اچھی فٹ دکھاتے ہیں جب 1 سیکنڈ کے وقفے کے اندر ہر تجارت کو ایک ہی تجارت کے طور پر دیکھتے ہیں ، مؤثر طریقے سے مسئلہ کو حل کرتے ہیں۔ تاہم ، جب تجارتی تعدد کے سلسلے میں وقت کا وقفہ بڑھایا جاتا ہے تو ، ہم غلطیوں میں اضافہ دیکھتے ہیں۔ مزید تحقیق سے پتہ چلتا ہے کہ یہ غلطی پیریٹو تقسیم کے ذریعہ متعارف کروائی گئی اصلاح کی مدت کی وجہ سے ہوتی ہے۔ اس سے پتہ چلتا ہے کہ جیسے جیسے وقت بڑھتا ہے اور زیادہ انفرادی تجارت شامل ہوتی ہے ، متعدد تجارت کی مجموعی مدت پیریٹو تقسیم کے قریب آتی ہے ، جس سے اصلاح کی مدت کو ہٹانے کی ضرورت پڑتی ہے۔
میں [3]:
df_resampled = buy_trades['quantity'].resample('1S').sum()
df_resampled = df_resampled.to_frame(name='quantity')
df_resampled = df_resampled[df_resampled['quantity']>0]
[4] میں:
# Cumulative distribution in 1s
depths = np.array(range(0, 3000, 5))
probabilities = np.array([np.mean(df_resampled['quantity'] > depth) for depth in depths])
mean = df_resampled['quantity'].mean()
alpha = np.log(np.mean(df_resampled['quantity'] > mean))/np.log(2.05)
probabilities_s = np.array([((1+20**(-depth/mean))*depth/mean+1)**(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)
آؤٹ [4]:
میں [5]:
df_resampled = buy_trades['quantity'].resample('30S').sum()
df_resampled = df_resampled.to_frame(name='quantity')
df_resampled = df_resampled[df_resampled['quantity']>0]
depths = np.array(range(0, 12000, 20))
probabilities = np.array([np.mean(df_resampled['quantity'] > depth) for depth in depths])
mean = df_resampled['quantity'].mean()
alpha = np.log(np.mean(df_resampled['quantity'] > mean))/np.log(2.05)
probabilities_s = np.array([((1+20**(-depth/mean))*depth/mean+1)**(alpha) for depth in depths])
alpha = np.log(np.mean(df_resampled['quantity'] > mean))/np.log(2)
probabilities_s_2 = np.array([(depth/mean+1)**alpha for depth in depths]) # No amendment
plt.figure(figsize=(10, 5))
plt.plot(depths, probabilities,label='Probabilities (True)')
plt.plot(depths, probabilities_s, label='Probabilities (Simulation 1)')
plt.plot(depths, probabilities_s_2, label='Probabilities (Simulation 2)')
plt.xlabel('Depth')
plt.ylabel('Probability of execution')
plt.title('Execution probability at different depths')
plt.legend()
plt.grid(True)
باہر[5]:
اب مختلف وقت کے ادوار کے لئے جمع ٹریڈنگ رقم کی تقسیم کے لئے ایک عام فارمولے کا خلاصہ کریں، ہر بار الگ الگ حساب کرنے کے بجائے فٹ ہونے کے لئے واحد ٹرانزیکشن کی رقم کی تقسیم کا استعمال کرتے ہوئے. یہاں فارمولہ ہے:
یہاں ، avg_interval ایک ہی لین دین کے اوسط وقفے کی نمائندگی کرتا ہے ، اور avg_interval_T اس وقفے کے اوسط وقفے کی نمائندگی کرتا ہے جس کا اندازہ لگانے کی ضرورت ہے۔ یہ تھوڑا سا الجھا ہوا لگ سکتا ہے۔ اگر ہم 1 سیکنڈ کے لئے ٹریڈنگ کی رقم کا اندازہ لگانا چاہتے ہیں تو ، ہمیں 1 سیکنڈ کے اندر لین دین پر مشتمل واقعات کے درمیان اوسط وقفے کا حساب لگانے کی ضرورت ہے۔ اگر آرڈرز کی آمد کا امکان پوائنسن تقسیم کی پیروی کرتا ہے تو ، اس کا براہ راست اندازہ لگایا جاسکتا ہے۔ تاہم ، حقیقت میں ، ایک اہم انحراف ہے ، لیکن میں یہاں اس پر تفصیل سے بات نہیں کروں گا۔
نوٹ کریں کہ وقت کے ایک خاص وقفے کے اندر تجارت کی رقم ایک مخصوص قدر سے تجاوز کرنے کا امکان اور گہرائی میں اس پوزیشن پر تجارت کا اصل امکان کافی مختلف ہونا چاہئے۔ جیسے جیسے انتظار کا وقت بڑھتا جاتا ہے ، آرڈر بک میں تبدیلیوں کا امکان بڑھتا جاتا ہے ، اور تجارت گہرائی میں بھی تبدیلیوں کا باعث بنتی ہے۔ لہذا ، اعداد و شمار کی تازہ کاریوں کے ساتھ ہی اسی گہرائی کی پوزیشن پر تجارت کا امکان حقیقی وقت میں بدلتا ہے۔
[6] میں:
df_resampled = buy_trades['quantity'].resample('2S').sum()
df_resampled = df_resampled.to_frame(name='quantity')
df_resampled = df_resampled[df_resampled['quantity']>0]
depths = np.array(range(0, 6500, 10))
probabilities = np.array([np.mean(df_resampled['quantity'] > depth) for depth in depths])
mean = buy_trades['quantity'].mean()
adjust = buy_trades['interval'].mean() / 2620
alpha = np.log(np.mean(buy_trades['quantity'] > mean))/0.7178397931503168
probabilities_s = np.array([((1+20**(-depth*adjust/mean))*depth*adjust/mean+1)**(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)
باہر[6]:
تجارتی اعداد و شمار قیمتی ہیں ، اور ابھی بھی بہت سارے اعداد و شمار موجود ہیں جن کا مائننگ کیا جاسکتا ہے۔ ہمیں قیمتوں پر آرڈرز کے اثرات پر گہری توجہ دینی چاہئے ، کیونکہ اس سے حکمت عملیوں کی پوزیشننگ پر اثر پڑتا ہے۔ اسی طرح ، ٹرانزیکشن_ٹائم پر مبنی اعداد و شمار کو جمع کرتے ہوئے ، ہم آخری قیمت اور پہلی قیمت کے درمیان فرق کا حساب لگاتے ہیں۔ اگر صرف ایک آرڈر ہے تو ، قیمت کا فرق 0 ہے۔ دلچسپ بات یہ ہے کہ ، کچھ اعداد و شمار کے نتائج منفی ہیں ، جو اعداد و شمار کی ترتیب کی وجہ سے ہوسکتے ہیں ، لیکن ہم یہاں اس میں گہرائی نہیں کریں گے۔
نتائج سے پتہ چلتا ہے کہ تجارت کا تناسب جو کسی اثر کا سبب نہیں بنتا ہے وہ 77٪ تک زیادہ ہے ، جبکہ تجارت کا تناسب جس کی وجہ سے قیمت میں ایک ٹِک کی نقل و حرکت ہوتی ہے وہ 16.5٪ ، 2 ٹِک 3.7٪ ، 3 ٹِک 1.2٪ ہے ، اور 4 سے زیادہ ٹِک 1٪ سے کم ہے۔ یہ بنیادی طور پر ایک اشاریاتی فنکشن کی خصوصیات پر عمل پیرا ہے ، لیکن فٹنگ درست نہیں ہے۔
قیمتوں میں فرق پیدا کرنے والی تجارت کی رقم کا بھی تجزیہ کیا گیا ، جس میں زیادہ اثر کی وجہ سے ہونے والے مسخوں کو خارج کردیا گیا ہے۔ اس میں لکیری تعلق ظاہر ہوتا ہے ، جس میں ہر 1000 یونٹوں کی مقدار کی وجہ سے قیمتوں میں اتار چڑھاؤ کا تقریبا 1 1 ٹک ہوتا ہے۔ اس کو آرڈر بک میں ہر قیمت کی سطح کے قریب لگائے جانے والے اوسطا around 1000 اکائیوں کے احکامات کے طور پر بھی سمجھا جاسکتا ہے۔
میں [7]:
diff_df = trades[trades['is_buyer_maker']==False].groupby('transact_time')['price'].agg(lambda x: abs(round(x.iloc[-1] - x.iloc[0],3)) if len(x) > 1 else 0)
buy_trades['diff'] = buy_trades['transact_time'].map(diff_df)
[8] میں:
diff_counts = buy_trades['diff'].value_counts()
diff_counts[diff_counts>10]/diff_counts.sum()
باہر[8]:
[9] میں:
diff_group = buy_trades.groupby('diff').agg({
'quantity': 'mean',
'diff': 'last',
})
[10] میں:
diff_group['quantity'][diff_group['diff']>0][diff_group['diff']<0.01].plot(figsize=(10,5),grid=True);
باہر[10]:
آئیے 2 سیکنڈ کے وقفے کے اندر قیمت کے اثر کا تجزیہ کریں۔ یہاں فرق یہ ہے کہ منفی اقدار ہوسکتے ہیں۔ تاہم ، چونکہ ہم صرف خرید آرڈرز پر غور کر رہے ہیں ، لہذا متوازن پوزیشن پر اثر ایک ٹک زیادہ ہوگا۔ تجارت کی رقم اور اثر کے مابین تعلقات کا مشاہدہ کرتے ہوئے ، ہم صرف 0 سے زیادہ نتائج پر غور کرتے ہیں۔ نتیجہ ایک ہی آرڈر کے نتائج کی طرح ہے ، جس میں تقریبا line لکیری تعلق ظاہر ہوتا ہے ، ہر ٹک کے لئے مقدار کے تقریبا 2000 یونٹوں کی ضرورت ہوتی ہے۔
[11] میں:
df_resampled = buy_trades.resample('2S').agg({
'price': ['first', 'last', 'count'],
'quantity': 'sum'
})
df_resampled['price_diff'] = round(df_resampled[('price', 'last')] - df_resampled[('price', 'first')],3)
df_resampled['price_diff'] = df_resampled['price_diff'].fillna(0)
result_df_raw = pd.DataFrame({
'price_diff': df_resampled['price_diff'],
'quantity_sum': df_resampled[('quantity', 'sum')],
'data_count': df_resampled[('price', 'count')]
})
result_df = result_df_raw[result_df_raw['price_diff'] != 0]
میں [12]:
result_df['price_diff'][abs(result_df['price_diff'])<0.016].value_counts().sort_index().plot.bar(figsize=(10,5));
آؤٹ [1]:
[23] میں:
result_df['price_diff'].value_counts()[result_df['price_diff'].value_counts()>30]
باہر[23]:
[14] میں:
diff_group = result_df.groupby('price_diff').agg({ 'quantity_sum': 'mean'})
[15] میں:
diff_group[(diff_group.index>0) & (diff_group.index<0.015)].plot(figsize=(10,5),grid=True);
باہر[15]:
اس سے پہلے ہم نے ٹاک تبدیلی کے لیے درکار تجارتی رقم کا تعین کیا تھا، لیکن یہ درست نہیں تھی کیونکہ اس کی بنیاد اس مفروضے پر تھی کہ اثر پہلے ہی واقع ہو چکا ہے۔ اب آئیے اس نقطہ نظر کو الٹ دیں اور تجارتی رقم کی وجہ سے ہونے والے قیمت کے اثرات کا جائزہ لیں۔
اس تجزیہ میں ، اعداد و شمار کو ہر 1 سیکنڈ میں نمونے لیا جاتا ہے ، ہر مرحلے میں مقدار کی 100 اکائیوں کی نمائندگی ہوتی ہے۔ پھر ہم نے اس مقدار کی حد میں قیمت کی تبدیلیوں کا حساب لگایا۔ یہاں کچھ قیمتی نتائج ہیں:
جہاں
[16] میں:
df_resampled = buy_trades.resample('1S').agg({
'price': ['first', 'last', 'count'],
'quantity': 'sum'
})
df_resampled['price_diff'] = round(df_resampled[('price', 'last')] - df_resampled[('price', 'first')],3)
df_resampled['price_diff'] = df_resampled['price_diff'].fillna(0)
result_df_raw = pd.DataFrame({
'price_diff': df_resampled['price_diff'],
'quantity_sum': df_resampled[('quantity', 'sum')],
'data_count': df_resampled[('price', 'count')]
})
result_df = result_df_raw[result_df_raw['price_diff'] != 0]
[24] میں:
df = result_df.copy()
bins = np.arange(0, 30000, 100) #
labels = [f'{i}-{i+100-1}' for i in bins[:-1]]
df.loc[:, 'quantity_group'] = pd.cut(df['quantity_sum'], bins=bins, labels=labels)
grouped = df.groupby('quantity_group')['price_diff'].mean()
[25] میں:
grouped_df = pd.DataFrame(grouped).reset_index()
grouped_df['quantity_group_center'] = grouped_df['quantity_group'].apply(lambda x: (float(x.split('-')[0]) + float(x.split('-')[1])) / 2)
plt.figure(figsize=(10,5))
plt.scatter(grouped_df['quantity_group_center'], grouped_df['price_diff'],s=10)
plt.plot(grouped_df['quantity_group_center'], np.array(grouped_df['quantity_group_center'].values)/2e6-0.000352,color='red')
plt.xlabel('quantity_group_center')
plt.ylabel('average price_diff')
plt.title('Scatter plot of average price_diff by quantity_group')
plt.grid(True)
باہر[25]:
[19] میں:
grouped_df.head(10)
باہر [1]: ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ،
تجارت کی رقم کے ماڈلنگ اور تجارت کی رقم کے مطابق قیمت کے اثر کے تقریبا ماڈل کے ساتھ ، یہ ممکن لگتا ہے کہ بہترین آرڈر کی جگہ کا حساب لگایا جاسکے۔ آئیے کچھ مفروضے بنائیں اور غیر ذمہ دارانہ بہترین قیمت کی پوزیشن فراہم کریں۔
آئیے ایک سادہ متوقع واپسی لکھ کر شروع کریں ، جو 1 سیکنڈ کے اندر Q سے زیادہ مجموعی خریداری کے احکامات کا امکان ہے ، متوقع واپسی کی شرح سے ضرب (یعنی قیمت کے اثر) ۔
گراف کی بنیاد پر ، زیادہ سے زیادہ متوقع واپسی تقریبا 2500 ہے ، جو اوسط تجارتی رقم سے تقریبا 2.5 گنا ہے۔ اس سے یہ ظاہر ہوتا ہے کہ فروخت آرڈر کو قیمت کی پوزیشن میں 2500 پر رکھنا چاہئے۔ اس بات پر زور دینا ضروری ہے کہ افقی محور 1 سیکنڈ کے اندر تجارت کی رقم کی نمائندگی کرتا ہے اور اسے گہرائی کی پوزیشن کے ساتھ برابر نہیں کیا جانا چاہئے۔ اس کے علاوہ ، یہ تجزیہ تجارت کے اعداد و شمار پر مبنی ہے اور اس میں گہرائی کے اہم اعداد و شمار کی کمی ہے۔
ہم نے دریافت کیا ہے کہ مختلف وقت کے وقفوں پر تجارت کی مقدار کی تقسیم انفرادی تجارت کی مقدار کی تقسیم کا ایک سادہ پیمانہ ہے۔ ہم نے قیمت کے اثر اور تجارت کے امکان پر مبنی متوقع واپسی کا ایک سادہ ماڈل بھی تیار کیا ہے۔ اس ماڈل کے نتائج ہماری توقعات کے مطابق ہیں ، یہ ظاہر کرتے ہوئے کہ اگر فروخت کے آرڈر کی رقم کم ہے تو ، اس سے قیمت میں کمی کا اشارہ ہوتا ہے ، اور منافع کی صلاحیت کے ل a ایک خاص رقم کی ضرورت ہوتی ہے۔ تجارت کی مقدار میں اضافے کے ساتھ ہی امکان کم ہوجاتا ہے ، جس کے درمیان ایک زیادہ سے زیادہ سائز ہوتا ہے ، جو آرڈر کی جگہ کی بہترین حکمت عملی کی نمائندگی کرتا ہے۔ تاہم ، یہ ماڈل اب بھی بہت آسان ہے۔ اگلے مضمون میں ، میں اس موضوع میں گہرائی سے گہرائی کروں گا۔
[20] میں:
# Cumulative distribution in 1s
df_resampled = buy_trades['quantity'].resample('1S').sum()
df_resampled = df_resampled.to_frame(name='quantity')
df_resampled = df_resampled[df_resampled['quantity']>0]
depths = np.array(range(0, 15000, 10))
mean = df_resampled['quantity'].mean()
alpha = np.log(np.mean(df_resampled['quantity'] > mean))/np.log(2.05)
probabilities_s = np.array([((1+20**(-depth/mean))*depth/mean+1)**(alpha) for depth in depths])
profit_s = np.array([depth/2e6-0.000352 for depth in depths])
plt.figure(figsize=(10, 5))
plt.plot(depths, probabilities_s*profit_s)
plt.xlabel('Q')
plt.ylabel('Excpet profit')
plt.grid(True)
باہر[20]: