Artikel ini melanjutkan diskusi tentang backtester event-driven di Python. Dalam artikel sebelumnya kami mempertimbangkan hierarki kelas portofolio yang menangani posisi saat ini, menghasilkan pesanan perdagangan dan melacak laba dan kerugian (PnL).
Dalam artikel ini kita akan mempelajari pelaksanaan pesanan ini, dengan menciptakan hierarki kelas yang akan mewakili mekanisme pemrosesan pesanan yang disimulasikan dan akhirnya terikat ke dalam perantara atau sarana konektivitas pasar lainnya.
ExecutionHandler yang dijelaskan di sini sangat sederhana, karena memenuhi semua pesanan dengan harga pasar saat ini.
Seperti halnya hierarki kelas dasar abstrak sebelumnya, kita harus mengimpor properti dan dekorator yang diperlukan dari perpustakaan abc.
# execution.py
import datetime
import Queue
dari abc import ABCMeta, metode abstrak
dari event import FillEvent, OrderEvent ExecutionHandler mirip dengan kelas dasar abstrak sebelumnya dan hanya memiliki satu metode virtual murni, 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()")
Untuk melakukan backtest strategi kita perlu untuk mensimulasikan bagaimana perdagangan akan ditransaksi. implementasi yang paling sederhana adalah dengan mengasumsikan semua pesanan dipenuhi pada harga pasar saat ini untuk semua kuantitas. ini jelas sangat tidak realistis dan bagian besar dari meningkatkan realisme backtest akan datang dari merancang model yang lebih canggih dari slippage dan dampak pasar.
Perhatikan bahwa FillEvent diberi nilai None untuk fill_cost (lihat baris penultimate di execute_order) karena kita sudah mengurus biaya pengisian dalam objek NaivePortfolio yang dijelaskan dalam artikel sebelumnya.
Saya hanya menggunakan ARCA sebagai pertukaran meskipun untuk tujuan backtesting ini murni placeholder.
# 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)
Ini menyimpulkan hierarki kelas yang diperlukan untuk menghasilkan backtester event-driven.