پیتھون کے ساتھ ایونٹ سے چلنے والی بیک ٹیسٹنگ - حصہ اول

مصنف:نیکی, تخلیق: 2019-03-22 11:53:50, تازہ کاری:

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

ایونٹ سے چلنے والا سافٹ ویئر

اس طرح کے بیک ٹیسٹر کی ترقی میں گہرائی کرنے سے پہلے ہمیں ایونٹ سے چلنے والے سسٹم کے تصور کو سمجھنے کی ضرورت ہے۔ ویڈیو گیمز ایونٹ سے چلنے والے سافٹ ویئر کے لئے ایک فطری استعمال کا معاملہ فراہم کرتے ہیں اور دریافت کرنے کے لئے ایک سیدھی مثال فراہم کرتے ہیں۔ ایک ویڈیو گیم میں متعدد اجزاء ہوتے ہیں جو ایک دوسرے کے ساتھ اعلی فریم ریٹ پر ریئل ٹائم ترتیب میں تعامل کرتے ہیں۔ یہ ایک لامحدود لوپ کے اندر حساب کتاب کا پورا سیٹ چلانے سے سنبھالا جاتا ہے جسے ایونٹ لوپ یا گیم لوپ کہا جاتا ہے۔

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

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)

یہ ایک ایونٹ سے چلنے والے بیک ٹیسٹر کے ڈیزائن کا بنیادی خاکہ ہے۔ اگلے مضمون میں ہم ایونٹ کلاس درجہ بندی پر تبادلہ خیال کریں گے۔


مزید