এই নিবন্ধটি পাইথনে ইভেন্ট-চালিত ব্যাকটেস্টারগুলির আলোচনা চালিয়ে যায়। পূর্ববর্তী নিবন্ধে আমরা একটি পোর্টফোলিও শ্রেণির শ্রেণিবিন্যাস বিবেচনা করেছি যা বর্তমান অবস্থানগুলি পরিচালনা করে, ট্রেডিং অর্ডার তৈরি করে এবং লাভ এবং ক্ষতির ট্র্যাক রাখে (পিএনএল) ।
এই প্রবন্ধে আমরা এই আদেশগুলির কার্যকরকরণ অধ্যয়ন করব, একটি শ্রেণী শ্রেণী গঠন করে যা একটি সিমুলেটেড অর্ডার হ্যান্ডলিং প্রক্রিয়া উপস্থাপন করবে এবং শেষ পর্যন্ত একটি ব্রোকারেজ বা বাজারের সংযোগের অন্যান্য উপায়ে লিঙ্ক করবে।
এখানে বর্ণিত এক্সিকিউশন হ্যান্ডলার অত্যন্ত সহজ, যেহেতু এটি বর্তমান বাজার মূল্যে সমস্ত অর্ডার পূরণ করে। এটি অত্যন্ত অবাস্তব, তবে উন্নতির জন্য একটি ভাল বেসলাইন হিসাবে কাজ করে।
পূর্ববর্তী বিমূর্ত বেস ক্লাস হাইয়ারারচির মতো, আমাদের অবশ্যই abc লাইব্রেরি থেকে প্রয়োজনীয় বৈশিষ্ট্য এবং সজ্জা আমদানি করতে হবে। উপরন্তু আমাদের FillEvent এবং OrderEvent আমদানি করতে হবেঃ
# 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()")
ব্যাকটেস্ট কৌশলগুলি করার জন্য আমাদের একটি বাণিজ্য কীভাবে লেনদেন করা হবে তা সিমুলেট করতে হবে। সর্বাধিক সহজ সম্ভাব্য বাস্তবায়নটি হ'ল সমস্ত অর্ডার বর্তমান বাজারের দামের জন্য সমস্ত পরিমাণে পূরণ করা হয়। এটি স্পষ্টতই অত্যন্ত অবাস্তব এবং ব্যাকটেস্ট বাস্তবতা উন্নত করার একটি বড় অংশ স্লিপ এবং বাজারের প্রভাবের আরও পরিশীলিত মডেল ডিজাইন থেকে আসবে।
মনে রাখবেন যে FillEvent-এ fill_cost-এর জন্য None এর মান দেওয়া হয় (execute_order-এ penultimate line দেখুন) কারণ আমরা ইতিমধ্যে পূর্ববর্তী নিবন্ধে বর্ণিত NaivePortfolio অবজেক্টে ভরাট করার খরচ নিয়ে যত্ন নিয়েছি। আরও বাস্তবসম্মত বাস্তবায়নে আমরা একটি বাস্তবসম্মত ভরাট খরচ পেতে
আমি কেবল এক্সচেঞ্জ হিসাবে ARCA ব্যবহার করেছি যদিও ব্যাকটেস্টিংয়ের উদ্দেশ্যে এটি কেবলমাত্র একটি স্থানধারক। লাইভ এক্সিকিউশন পরিবেশে এই ভেন্যু নির্ভরতা অনেক বেশি গুরুত্বপূর্ণ হবেঃ
# 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)
এটি একটি ইভেন্ট-চালিত ব্যাকটেস্টার তৈরির জন্য প্রয়োজনীয় শ্রেণীর শ্রেণিবিন্যাসগুলিকে শেষ করে। পরবর্তী নিবন্ধে আমরা ব্যাকটেস্ট করা কৌশলটির জন্য পারফরম্যান্স মেট্রিক্সের একটি সেট গণনা করার বিষয়ে আলোচনা করব।