mirror of
https://github.com/wassname/catalyst.git
synced 2026-07-07 17:32:20 +08:00
fixed bessel correction in stddev
This commit is contained in:
@@ -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)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user