Files
catalyst/zipline/optimize/algorithms.py
T

106 lines
3.2 KiB
Python

from zipline.gens.mavg import MovingAverage
from datetime import datetime, timedelta
class BuySellAlgorithm(object):
"""Algorithm that buys and sells alternatingly. The amount for
each order can be specified. In addition, an offset that will
quadratically reduce the amount that will be bought can be
specified.
This algorithm is used to test the parameter optimization
framework. If combined with the UpDown trade source, an offset of
0 will produce maximum returns.
"""
def __init__(self, sid, amount, offset):
self.sid = sid
self.amount = amount
self.incr = 0
self.done = False
self.order = None
self.frame_count = 0
self.portfolio = None
self.buy_or_sell = -1
self.offset = offset
self.orders = []
self.prices = []
def initialize(self):
pass
def set_order(self, order_callable):
self.order = order_callable
def set_portfolio(self, portfolio):
self.portfolio = portfolio
def handle_data(self, frame):
order_size = self.buy_or_sell * (self.amount - (self.offset**2))
self.order(self.sid, order_size)
#sell next time around.
self.buy_or_sell *= -1
self.orders.append(order_size)
self.frame_count += 1
self.incr += 1
def get_sid_filter(self):
return [self.sid]
# Algorithm base class, user algorithms inherit from this as they
# don't want to have to copy and know about set_order and
# set_portfolio
class Algorithm(object):
def set_order(self, order_callable):
self.order = order_callable
def get_sid_filter(self):
return [self.sid]
def set_logger(self, logger):
self.logger = logger
def initialize(self):
pass
def add_transform(self, transform_class, tag, *args, **kwargs):
if not hasattr(self, 'registered_transforms'):
self.registered_transforms = {}
self.registered_transforms[tag] = {'class': transform_class,
'args': args,
'kwargs': kwargs}
# Inherits from Algorithm base class
class DMA(Algorithm):
"""Dual Moving Average algorithm.
"""
def __init__(self, sid, amount, short_window=20, long_window=40):
self.sid = sid
self.amount = amount
self.done = False
self.order = None
self.frame_count = 0
self.portfolio = None
self.orders = []
self.market_entered = False
self.prices = []
self.events = 0
self.add_transform(MovingAverage, 'short_mavg', ['price'], market_aware=False, delta=timedelta(days=short_window))
self.add_transform(MovingAverage, 'long_mavg', ['price'], market_aware=False, delta=timedelta(days=long_window))
def handle_data(self, data):
self.events += 1
# access transforms via their user-defined tag
if (data[self.sid].short_mavg > data[self.sid].long_mavg) and not self.market_entered:
self.order(self.sid, 100)
self.market_entered = True
elif (data[self.sid].short_mavg < data[self.sid].long_mavg) and self.market_entered:
self.order(self.sid, -100)
self.market_entered = False