Event-Driven Backtesting dengan Python - Bagian VI

Penulis:Kebaikan, Dibuat: 2019-03-26 09:13:08, Diperbarui:

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.


Lebih banyak