fixed bessel correction in stddev

This commit is contained in:
scottsanderson
2012-08-15 16:16:36 -04:00
parent 9537067138
commit 1659cfff45
2 changed files with 30 additions and 12 deletions
+23 -5
View File
@@ -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)
+7 -7
View File
@@ -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