یہ مضمون پائتھون میں ایونٹ سے چلنے والے بیک ٹیسٹرز کی بحث کا سلسلہ جاری رکھتا ہے۔ پچھلے مضمون میں ہم نے ایک پورٹ فولیو کلاس درجہ بندی پر غور کیا جس نے موجودہ پوزیشنوں کو سنبھالا ، تجارتی احکامات تیار کیے اور منافع اور نقصان (پی این ایل) کا سراغ لگایا۔
اس مضمون میں ہم ان احکامات کے نفاذ کا مطالعہ کریں گے، ایک کلاس درجہ بندی کی تخلیق کی طرف سے جو ایک مشابہت شدہ آرڈر ہینڈلنگ میکانزم کی نمائندگی کرے گا اور آخر میں بروکرج یا مارکیٹ کنیکٹوٹی کے دیگر ذرائع میں منسلک کرے گا.
یہاں بیان کردہ ایگزیکشن ہینڈلر انتہائی آسان ہے ، کیونکہ یہ موجودہ مارکیٹ کی قیمت پر تمام آرڈرز کو پورا کرتا ہے۔ یہ انتہائی غیر حقیقت پسندانہ ہے ، لیکن بہتری کے لئے ایک اچھی بنیاد کے طور پر کام کرتا ہے۔
پچھلے تجریدی بیس کلاس درجہ بندیوں کی طرح ، ہمیں بھی ضروری خصوصیات اور سجاوٹ کو لائبریری سے درآمد کرنا ہوگا۔ اس کے علاوہ ہمیں فل ایونٹ اور آرڈر ایونٹ کو بھی درآمد کرنے کی ضرورت ہے۔
# execution.py
import datetime
import Queue
سے abc درآمد ABCMeta، خلاصہ طریقہ
ایونٹ درآمد سے FillEvent، OrderEvent ایگزیکشن ہینڈلر پچھلے تجریدی بیس کلاسوں کی طرح ہے اور اس میں صرف ایک خالص ورچوئل طریقہ کار ہے ، execute_order:
# execution.py
class ExecutionHandler(object):
"""
The ExecutionHandler abstract class handles the interaction
between a set of order objects generated by a Portfolio and
the ultimate set of Fill objects that actually occur in the
market.
The handlers can be used to subclass simulated brokerages
or live brokerages, with identical interfaces. This allows
strategies to be backtested in a very similar manner to the
live trading engine.
"""
__metaclass__ = ABCMeta
@abstractmethod
def execute_order(self, event):
"""
Takes an Order event and executes it, producing
a Fill event that gets placed onto the Events queue.
Parameters:
event - Contains an Event object with order information.
"""
raise NotImplementedError("Should implement execute_order()")
بیک ٹسٹ کی حکمت عملیوں کے ل we ہمیں اس بات کا اندازہ لگانے کی ضرورت ہے کہ تجارت کس طرح کی جائے گی۔ سب سے آسان ممکن نفاذ یہ فرض کرتا ہے کہ تمام مقدار کے لئے تمام آرڈرز کو موجودہ مارکیٹ کی قیمت پر پورا کیا جاتا ہے۔ یہ واضح طور پر انتہائی غیر حقیقت پسندانہ ہے اور بیک ٹسٹ حقیقت پسندی کو بہتر بنانے کا ایک بڑا حصہ سلائپج اور مارکیٹ کے اثرات کے زیادہ نفیس ماڈل ڈیزائن کرنے سے آئے گا۔
نوٹ کریں کہ FillEvent کو fill_cost کے لئے کوئی قدر نہیں دی جاتی ہے (execute_order میں آخری سطر دیکھیں) کیونکہ ہم نے پہلے ہی پچھلے مضمون میں بیان کردہ NaivePortfolio آبجیکٹ میں بھرنے کی لاگت کا خیال رکھا ہے۔ ایک زیادہ حقیقت پسندانہ نفاذ میں ہم
میں نے صرف اے آر سی اے کو تبادلہ کے طور پر استعمال کیا ہے اگرچہ بیک ٹسٹنگ کے مقاصد کے لئے یہ محض ایک پلیس ہولڈر ہے۔ براہ راست عمل درآمد کے ماحول میں یہ مقام انحصار بہت زیادہ اہم ہوگا:
# execution.py
class SimulatedExecutionHandler(ExecutionHandler):
"""
The simulated execution handler simply converts all order
objects into their equivalent fill objects automatically
without latency, slippage or fill-ratio issues.
This allows a straightforward "first go" test of any strategy,
before implementation with a more sophisticated execution
handler.
"""
def __init__(self, events):
"""
Initialises the handler, setting the event queues
up internally.
Parameters:
events - The Queue of Event objects.
"""
self.events = events
def execute_order(self, event):
"""
Simply converts Order objects into Fill objects naively,
i.e. without any latency, slippage or fill ratio problems.
Parameters:
event - Contains an Event object with order information.
"""
if event.type == 'ORDER':
fill_event = FillEvent(datetime.datetime.utcnow(), event.symbol,
'ARCA', event.quantity, event.direction, None)
self.events.put(fill_event)
اس سے ایونٹ سے چلنے والے بیک ٹیسٹر کو تیار کرنے کے لئے درکار کلاس درجہ بندی کا اختتام ہوتا ہے۔ اگلے مضمون میں ہم اس بات پر تبادلہ خیال کریں گے کہ بیک ٹیسٹ شدہ حکمت عملی کے لئے کارکردگی کی پیمائش کے ایک سیٹ کا حساب کیسے لگایا جائے۔