diff --git a/tests/test_transforms.py b/tests/test_transforms.py index 69ab0ac1..e515d725 100644 --- a/tests/test_transforms.py +++ b/tests/test_transforms.py @@ -1,4 +1,5 @@ import pytz +import numpy from datetime import timedelta, datetime from collections import defaultdict @@ -270,27 +271,44 @@ class FinanceTransformsTestCase(TestCase): assert tnfm_volumes == expected_volumes def test_moving_stddev(self): - trade_history = factory.create_trade_history( 133, [10.0, 15.0, 13.0, 12.0], [100, 100, 100, 100], - timedelta(days=1), + timedelta(hours = 1), self.trading_environment ) stddev = StatefulTransform( MovingStandardDev, market_aware = False, - delta = timedelta(days = 2), + delta = timedelta(minutes = 150), ) self.source = SpecificEquityTrades(event_list=trade_history) transformed = list(stddev.transform(self.source)) - + vals = [message.tnfm_value for message in transformed] + + expected = [ + None, + numpy.std([10.0, 15.0], ddof = 1), + numpy.std([10.0, 15.0, 13.0], ddof = 1), + numpy.std([15.0, 13.0, 12.0], ddof = 1), + ] - assert vals == [0.0, 2.5, 1.0, 0.5] + # numpy has odd rounding behavior, cf. + # http://docs.scipy.org/doc/numpy/reference/generated/numpy.std.html + for v1, v2 in zip(vals, expected): + + if v1 == None: + assert v2 == None + continue + assert round(v1, 5) == round(v2, 5) + + + + diff --git a/zipline/gens/stddev.py b/zipline/gens/stddev.py index 144f3ace..1f46429a 100644 --- a/zipline/gens/stddev.py +++ b/zipline/gens/stddev.py @@ -88,13 +88,13 @@ class MovingStandardDevWindow(EventWindow): def get_stddev(self): - # Stddev is 0 if we have only one event. len(self) is - # provided by EventWindow superclass. - if len(self) == 1: - return 0.0 + # Sample standard deviation is undefined for a single event or + # no events. + if len(self) <= 1: + return None else: - average = self.sum /len(self.ticks) - variance = (self.sum_sqr - self.sum*average) / len(self) - stddev = sqrt(variance) + average = self.sum /len(self) + s_squared = (self.sum_sqr - self.sum*average) / (len(self) - 1) + stddev = sqrt(s_squared) return stddev