ہائی فریکوئنسی ٹریڈنگ کی حکمت عملیوں کے بارے میں خیالات (2)

مصنف:لیدیہ, تخلیق: 2023-08-04 17:17:30, تازہ کاری: 2023-09-12 15:50:31

img

ہائی فریکوئنسی ٹریڈنگ کی حکمت عملیوں کے بارے میں خیالات (2)

مجموعی تجارت کی رقم کا ماڈلنگ

پچھلے مضمون میں، ہم نے ایک مخصوص قدر سے زیادہ ہونے کی ایک واحد تجارت کی رقم کے امکان کے لئے ایک اظہار حاصل کیا.

img

ہم وقت کی ایک مدت کے دوران ٹریڈنگ کی رقم کی تقسیم میں بھی دلچسپی رکھتے ہیں ، جو بدیہی طور پر انفرادی تجارت کی رقم اور آرڈر کی تعدد سے متعلق ہونا چاہئے۔ ذیل میں ، ہم اعداد و شمار کو مقررہ وقفوں میں پروسیس کرتے ہیں اور اس کی تقسیم کا نقشہ بناتے ہیں ، جیسا کہ پچھلے حصے میں کیا گیا تھا۔

میں [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]:

img

میں [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]:

img

اب مختلف وقت کے ادوار کے لئے جمع ٹریڈنگ رقم کی تقسیم کے لئے ایک عام فارمولے کا خلاصہ کریں، ہر بار الگ الگ حساب کرنے کے بجائے فٹ ہونے کے لئے واحد ٹرانزیکشن کی رقم کی تقسیم کا استعمال کرتے ہوئے. یہاں فارمولہ ہے:

img

یہاں ، 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]:

img

ایک ہی تجارت کی قیمتوں پر اثر

تجارتی اعداد و شمار قیمتی ہیں ، اور ابھی بھی بہت سارے اعداد و شمار موجود ہیں جن کا مائننگ کیا جاسکتا ہے۔ ہمیں قیمتوں پر آرڈرز کے اثرات پر گہری توجہ دینی چاہئے ، کیونکہ اس سے حکمت عملیوں کی پوزیشننگ پر اثر پڑتا ہے۔ اسی طرح ، ٹرانزیکشن_ٹائم پر مبنی اعداد و شمار کو جمع کرتے ہوئے ، ہم آخری قیمت اور پہلی قیمت کے درمیان فرق کا حساب لگاتے ہیں۔ اگر صرف ایک آرڈر ہے تو ، قیمت کا فرق 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]:

img

[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]:

img

فکسڈ انٹراول قیمتوں پر اثر

آئیے 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]:

img

[23] میں:

result_df['price_diff'].value_counts()[result_df['price_diff'].value_counts()>30]

باہر[23]:

img

[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]:

img

تجارت کی رقم کا قیمت پر اثر

اس سے پہلے ہم نے ٹاک تبدیلی کے لیے درکار تجارتی رقم کا تعین کیا تھا، لیکن یہ درست نہیں تھی کیونکہ اس کی بنیاد اس مفروضے پر تھی کہ اثر پہلے ہی واقع ہو چکا ہے۔ اب آئیے اس نقطہ نظر کو الٹ دیں اور تجارتی رقم کی وجہ سے ہونے والے قیمت کے اثرات کا جائزہ لیں۔

اس تجزیہ میں ، اعداد و شمار کو ہر 1 سیکنڈ میں نمونے لیا جاتا ہے ، ہر مرحلے میں مقدار کی 100 اکائیوں کی نمائندگی ہوتی ہے۔ پھر ہم نے اس مقدار کی حد میں قیمت کی تبدیلیوں کا حساب لگایا۔ یہاں کچھ قیمتی نتائج ہیں:

  1. جب خریدنے کے آرڈر کی رقم 500 سے کم ہوتی ہے تو ، متوقع قیمت کی تبدیلی کم ہوتی ہے ، جو توقع کے مطابق ہے کیونکہ قیمت پر اثر انداز ہونے والے فروخت کے آرڈر بھی موجود ہیں۔
  2. کم تجارت کی مقدار میں ، ایک لکیری تعلق ہے ، جس کا مطلب ہے کہ تجارت کی رقم جتنی زیادہ ہوگی ، قیمت میں اضافہ اتنا ہی زیادہ ہوگا۔
  3. جب خرید آرڈر کی رقم بڑھتی ہے تو ، قیمت کی تبدیلی زیادہ اہم ہوجاتی ہے۔ اس سے اکثر قیمت کی پیشرفت کی نشاندہی ہوتی ہے ، جو بعد میں پیچھے ہٹ سکتی ہے۔ اس کے علاوہ ، فکسڈ انٹراول سیمپلنگ ڈیٹا کی عدم استحکام میں اضافہ کرتی ہے۔
  4. اسٹریٹ چارٹ کے اوپری حصے پر توجہ دینا ضروری ہے ، جو تجارت کی رقم کے ساتھ قیمت میں اضافے سے مطابقت رکھتا ہے۔
  5. اس مخصوص ٹریڈنگ جوڑی کے لئے، ہم تجارت کی رقم اور قیمت کی تبدیلی کے درمیان تعلقات کا ایک خام ورژن فراہم کرتے ہیں.

img

جہاں C قیمت میں تبدیلی کی نمائندگی کرتا ہے اور Q خریدنے کے احکامات کی رقم کی نمائندگی کرتا ہے۔

[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]:

img

[19] میں:

grouped_df.head(10)

باہر [1]: ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ، ،

img

ابتدائی زیادہ سے زیادہ آرڈر کی جگہ

تجارت کی رقم کے ماڈلنگ اور تجارت کی رقم کے مطابق قیمت کے اثر کے تقریبا ماڈل کے ساتھ ، یہ ممکن لگتا ہے کہ بہترین آرڈر کی جگہ کا حساب لگایا جاسکے۔ آئیے کچھ مفروضے بنائیں اور غیر ذمہ دارانہ بہترین قیمت کی پوزیشن فراہم کریں۔

  1. فرض کریں کہ اثر کے بعد قیمت اپنی اصل قیمت پر واپس آجائے گی (جو کہ انتہائی غیر متوقع ہے اور اثر کے بعد قیمت میں تبدیلی کا مزید تجزیہ درکار ہوگا۔)
  2. فرض کریں کہ اس عرصے کے دوران تجارت کی مقدار اور آرڈر کی تعدد کی تقسیم ایک پیش سیٹ پیٹرن پر عمل پیرا ہے (جو بھی غلط ہے ، کیونکہ ہم ایک دن کے اعداد و شمار کی بنیاد پر اندازہ لگا رہے ہیں اور تجارت میں واضح گروپ بندی کا رجحان ظاہر ہوتا ہے۔
  3. فرض کریں کہ صرف ایک فروخت آرڈر تخروپن وقت کے دوران ہوتا ہے اور پھر بند ہوتا ہے۔
  4. فرض کریں کہ آرڈر پر عمل درآمد کے بعد ، دوسرے خرید آرڈرز ہیں جو قیمت کو آگے بڑھاتے رہتے ہیں ، خاص طور پر جب رقم بہت کم ہوتی ہے۔ اس اثر کو یہاں نظرانداز کیا جاتا ہے ، اور یہ صرف یہ فرض کیا جاتا ہے کہ قیمت میں کمی واقع ہوگی۔

آئیے ایک سادہ متوقع واپسی لکھ کر شروع کریں ، جو 1 سیکنڈ کے اندر Q سے زیادہ مجموعی خریداری کے احکامات کا امکان ہے ، متوقع واپسی کی شرح سے ضرب (یعنی قیمت کے اثر) ۔

img

گراف کی بنیاد پر ، زیادہ سے زیادہ متوقع واپسی تقریبا 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]:

img


مزید