ہم نے پچھلے کچھ مہینوں کو کوانٹ اسٹارٹ پر پائیتھون اور پانڈوں کا استعمال کرتے ہوئے مختلف تجارتی حکمت عملیوں کی بیک ٹیسٹنگ میں گزارا ہے۔ پانڈوں کی ویکٹرائزڈ نوعیت اس بات کو یقینی بناتی ہے کہ بڑے ڈیٹا سیٹوں پر کچھ کارروائییں انتہائی تیز ہیں۔ تاہم ، ویکٹرائزڈ بیک ٹیسٹر کی شکلیں جن کا ہم نے اب تک مطالعہ کیا ہے وہ تجارت کے نفاذ کے انداز میں کچھ نقصانات کا شکار ہیں۔ مضامین کے اس سلسلے میں ہم پائیتھون کا استعمال کرتے ہوئے ایک ایونٹ سے چلنے والے بیک ٹیسٹنگ ماحول کی تعمیر کے ذریعہ تاریخی حکمت عملی کی نقالی کے لئے زیادہ حقیقت پسندانہ نقطہ نظر پر تبادلہ خیال کرنے جارہے ہیں۔
اس طرح کے بیک ٹیسٹر کی ترقی میں گہرائی کرنے سے پہلے ہمیں ایونٹ سے چلنے والے سسٹم کے تصور کو سمجھنے کی ضرورت ہے۔ ویڈیو گیمز ایونٹ سے چلنے والے سافٹ ویئر کے لئے ایک فطری استعمال کا معاملہ فراہم کرتے ہیں اور دریافت کرنے کے لئے ایک سیدھی مثال فراہم کرتے ہیں۔ ایک ویڈیو گیم میں متعدد اجزاء ہوتے ہیں جو ایک دوسرے کے ساتھ اعلی فریم ریٹ پر ریئل ٹائم ترتیب میں تعامل کرتے ہیں۔ یہ ایک
گیم لوپ کے ہر ٹک پر ایک فنکشن کو تازہ ترین واقعہ وصول کرنے کے لئے بلایا جاتا ہے ، جو کھیل کے اندر کسی متعلقہ سابقہ کارروائی کے ذریعہ تیار کیا گیا ہوگا۔ واقعہ کی نوعیت پر منحصر ہے ، جس میں کی بورڈ دبائیں یا ماؤس کلک شامل ہوسکتے ہیں ، کچھ بعد کی کارروائی کی جاتی ہے ، جو لوپ کو ختم کردے گی یا کچھ اضافی واقعات پیدا کرے گی۔ اس کے بعد یہ عمل جاری رہے گا۔ یہاں کچھ مثال کا جھوٹا کوڈ ہے:
while True: # Run the loop forever
new_event = get_new_event() # Get the latest event
# Based on the event type, perform an action
if new_event.type == "LEFT_MOUSE_CLICK":
open_menu()
elif new_event.type == "ESCAPE_KEY_PRESS":
quit_game()
elif new_event.type == "UP_KEY_PRESS":
move_player_north()
# ... and many more events
redraw_screen() # Update the screen to provide animation
tick(50) # Wait 50 milliseconds
کوڈ مسلسل نئے واقعات کی جانچ پڑتال کر رہا ہے اور پھر ان واقعات کی بنیاد پر اقدامات انجام دے رہا ہے۔ خاص طور پر یہ حقیقی وقت کے ردعمل سے نمٹنے کے فریب کی اجازت دیتا ہے کیونکہ کوڈ کو مسلسل لوپ کیا جارہا ہے اور واقعات کی جانچ پڑتال کی جارہی ہے۔ جیسا کہ واضح ہو جائے گا کہ ہمیں اعلی تعدد ٹریڈنگ کی نقالی کرنے کے لئے بالکل یہی ضرورت ہے۔
ایونٹ سے چلنے والے نظام ویکٹرائزڈ نقطہ نظر کے مقابلے میں بہت سے فوائد فراہم کرتے ہیں:
اگرچہ ایونٹ سے چلنے والے سسٹم بہت سارے فوائد کے ساتھ آتے ہیں ، لیکن وہ آسان ویکٹرائزڈ سسٹم کے مقابلے میں دو بڑے نقصانات کا شکار ہیں۔ سب سے پہلے ، ان کا نفاذ اور جانچ کرنا نمایاں طور پر زیادہ پیچیدہ ہے۔ زیادہ
دوسری بات یہ ہے کہ وہ ویکٹرائزڈ سسٹم کے مقابلے میں عملدرآمد میں زیادہ سست ہیں۔ ریاضیاتی حساب کتاب کرتے وقت زیادہ سے زیادہ ویکٹرائزڈ آپریشن استعمال نہیں کیے جاسکتے ہیں۔ ہم بعد کے مضامین میں ان حدود کو دور کرنے کے طریقوں پر تبادلہ خیال کریں گے۔
بیک ٹسٹنگ سسٹم پر ایونٹ سے چلنے والا نقطہ نظر لاگو کرنے کے ل it یہ ضروری ہے کہ ہمارے اجزاء (یا اشیاء) کی وضاحت کریں جو مخصوص کاموں کو سنبھالیں گے:
یہ ایک تجارتی انجن کا ایک بنیادی ماڈل ہے۔ توسیع کے لئے کافی گنجائش ہے ، خاص طور پر اس سلسلے میں کہ پورٹ فولیو کو کس طرح استعمال کیا جاتا ہے۔ اس کے علاوہ مختلف ٹرانزیکشن لاگت کے ماڈل کو بھی اپنی کلاس درجہ بندی میں خلاصہ کیا جاسکتا ہے۔ اس مرحلے پر اس سلسلے کے مضامین کے اندر غیر ضروری پیچیدگی متعارف کرایا جاتا ہے لہذا ہم فی الحال اس پر مزید بحث نہیں کریں گے۔ بعد کے سبق میں ہم ممکنہ طور پر نظام کو مزید حقیقت پسندی کو شامل کرنے کے لئے وسعت دیں گے۔
یہاں پیتھون کوڈ کا ایک ٹکڑا ہے جو ظاہر کرتا ہے کہ بیک ٹیسٹر عملی طور پر کس طرح کام کرتا ہے۔ کوڈ میں دو لوپ ہوتے ہیں۔ بیرونی لوپ کا استعمال بیک ٹیسٹر کو دل کی دھڑکن دینے کے لئے کیا جاتا ہے۔ براہ راست تجارت کے ل this یہ وہ تعدد ہے جس پر نئے مارکیٹ کے اعداد و شمار کی پولنگ کی جاتی ہے۔ بیک ٹیسٹنگ کی حکمت عملیوں کے ل this یہ سختی سے ضروری نہیں ہے کیونکہ بیک ٹیسٹر ڈرپ فیڈ کی شکل میں فراہم کردہ مارکیٹ کے اعداد و شمار کا استعمال کرتا ہے (بارس دیکھیں.update_bars))) لائن).
اندرونی لوپ دراصل واقعات کی قطار آبجیکٹ سے واقعات کو سنبھالتا ہے۔ مخصوص واقعات کو متعلقہ جزو میں تفویض کیا جاتا ہے اور اس کے بعد قطار میں نئے واقعات شامل کیے جاتے ہیں۔ جب واقعات کی قطار خالی ہوتی ہے تو ، دل کی دھڑکن کا لوپ جاری رہتا ہے:
# Declare the components with respective parameters
bars = DataHandler(..)
strategy = Strategy(..)
port = Portfolio(..)
broker = ExecutionHandler(..)
while True:
# Update the bars (specific backtest code, as opposed to live trading)
if bars.continue_backtest == True:
bars.update_bars()
else:
break
# Handle the events
while True:
try:
event = events.get(False)
except Queue.Empty:
break
else:
if event is not None:
if event.type == 'MARKET':
strategy.calculate_signals(event)
port.update_timeindex(event)
elif event.type == 'SIGNAL':
port.update_signal(event)
elif event.type == 'ORDER':
broker.execute_order(event)
elif event.type == 'FILL':
port.update_fill(event)
# 10-Minute heartbeat
time.sleep(10*60)
یہ ایک ایونٹ سے چلنے والے بیک ٹیسٹر کے ڈیزائن کا بنیادی خاکہ ہے۔ اگلے مضمون میں ہم ایونٹ کلاس درجہ بندی پر تبادلہ خیال کریں گے۔