From a60154dd6b59272dac0d2a7b5f1a969b0336f137 Mon Sep 17 00:00:00 2001 From: fawce Date: Tue, 1 May 2012 16:00:53 -0400 Subject: [PATCH] intersticial commit for transforms --- zipline/finance/transforms.py | 61 +++++++++++++++++++++++++++++++++++ zipline/messaging.py | 10 +++--- 2 files changed, 66 insertions(+), 5 deletions(-) create mode 100644 zipline/finance/transforms.py diff --git a/zipline/finance/transforms.py b/zipline/finance/transforms.py new file mode 100644 index 00000000..4d32f138 --- /dev/null +++ b/zipline/finance/transforms.py @@ -0,0 +1,61 @@ +from datetime import timedelta +from itertools import ifilter +from collections import defaultdict + +from zipline.messaging import BaseTransform + +class VWAPTransform(BaseTransform): + + def init(self, daycount=3): + self.daycount = daycount + + +class DailyVWAP: + """A class that tracks the volume weighted average price + based on tick updates.""" + def __init__(self, daycount=3): + self.ticks = [] + self.dropped_ticks = [] + self.flux = 0.0 + self.volume = 0 + self.lastTick = None + self.vwap = 0.0 + self.delta = timedelta(days=daycount) + + def update(self, event): + + self.ticks.append(event) + flux, volume = self.calculate_flux([event]) + self.flux += flux + self.volume += volume + + self.last_date = event['dt'] + self.first_date = self.last_date - self.delta + #use a list comprehension to filter the ticks to those within + #desired day range. The dt properties are full datetime objects + #and provide overloads for arithmetic operations. + self.dropped_ticks = [] + for tick in self.ticks: + if tick['dt'] < self.first_date: + self.dropped_ticks.append(tick) + + slice_index = len(self.dropped_ticks) + self.ticks = self.ticks[slice_index:] + + dropped_flux, dropped_volume = self.calculate_flux(self.dropped_ticks) + + self.flux -= dropped_flux + self.volume -= dropped_volume + + if(self.volume != 0): + self.vwap = self.flux / self.volume + else: + self.vwap = None + + def calculate_flux(self, ticks): + flux = 0.0 + volume = 0 + for tick in ticks: + flux += tick['volume'] * tick['price'] + volume += tick['volume'] + return flux, volume \ No newline at end of file diff --git a/zipline/messaging.py b/zipline/messaging.py index fd1875c1..e1011071 100644 --- a/zipline/messaging.py +++ b/zipline/messaging.py @@ -440,14 +440,14 @@ class BaseTransform(Component): method to create a new derived value from the combined feed. """ - def __init__(self, name): + def __init__(self, name, **kwargs): Component.__init__(self) self.state = { 'name': name } - self.init() + self.init(**kwargs) def init(self): pass @@ -564,11 +564,11 @@ class PassthroughTransform(BaseTransform): """ - def __init__(self): + def __init__(self, **kwargs): BaseTransform.__init__(self, "PASSTHROUGH") - self.init() + self.init(**kwargs) - def init(self): + def init(self, **kwargs): pass @property