mirror of
https://github.com/wassname/catalyst.git
synced 2026-09-12 12:12:04 +08:00
Refactored stdev transform to be applied to multiple fields, not just price
UnitTest for transforms refactored to account for changed stdev transform, introduced AssertAlmostEqual
This commit is contained in:
+28
-16
@@ -13,12 +13,11 @@
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
from collections import deque
|
||||
|
||||
import pytz
|
||||
import numpy as np
|
||||
import pandas as pd
|
||||
|
||||
from collections import deque
|
||||
from datetime import timedelta, datetime
|
||||
from unittest import TestCase
|
||||
|
||||
@@ -273,44 +272,57 @@ class TestFinanceTransforms(TestCase):
|
||||
assert tnfm_volumes == expected_volumes
|
||||
|
||||
def test_moving_stddev(self):
|
||||
|
||||
stddev = MovingStandardDev(
|
||||
fields=['price', 'volume'],
|
||||
market_aware=False,
|
||||
delta=timedelta(days=3),
|
||||
)
|
||||
|
||||
trade_history = factory.create_trade_history(
|
||||
133,
|
||||
[10.0, 15.0, 13.0, 12.0],
|
||||
[100, 100, 100, 100],
|
||||
timedelta(hours=1),
|
||||
[100, 200, 100, 200],
|
||||
timedelta(days=1),
|
||||
self.trading_environment
|
||||
)
|
||||
|
||||
stddev = MovingStandardDev(
|
||||
market_aware=False,
|
||||
delta=timedelta(minutes=150),
|
||||
)
|
||||
self.source = SpecificEquityTrades(event_list=trade_history)
|
||||
|
||||
transformed = list(stddev.transform(self.source))
|
||||
# Output values
|
||||
tnfm_prices = [message.tnfm_value.price for message in transformed]
|
||||
tnfm_volumes = [message.tnfm_value.volume for message in transformed]
|
||||
|
||||
vals = [message.tnfm_value for message in transformed]
|
||||
|
||||
expected = [
|
||||
expected_prices = [
|
||||
None,
|
||||
np.std([10.0, 15.0], ddof=1),
|
||||
np.std([10.0, 15.0, 13.0], ddof=1),
|
||||
np.std([15.0, 13.0, 12.0], ddof=1),
|
||||
]
|
||||
|
||||
# np has odd rounding behavior, cf.
|
||||
# http://docs.scipy.org/doc/np/reference/generated/np.std.html
|
||||
for v1, v2 in zip(vals, expected):
|
||||
expected_volumes = [
|
||||
None,
|
||||
np.std([100, 200], ddof=1),
|
||||
np.std([100, 200, 100], ddof=1),
|
||||
np.std([200, 100, 200], ddof=1),
|
||||
]
|
||||
|
||||
for v1, v2 in zip(tnfm_prices, expected_prices):
|
||||
if v1 is None:
|
||||
assert v2 is None
|
||||
continue
|
||||
assert round(v1, 5) == round(v2, 5)
|
||||
|
||||
self.assertAlmostEqual(v1, v2)
|
||||
|
||||
for v1, v2 in zip(tnfm_volumes, expected_volumes):
|
||||
if v1 is None:
|
||||
assert v2 is None
|
||||
continue
|
||||
self.assertAlmostEqual(v1, v2)
|
||||
############################################################
|
||||
# Test BatchTransform
|
||||
|
||||
|
||||
class TestBatchTransform(TestCase):
|
||||
def setUp(self):
|
||||
setup_logger(self)
|
||||
|
||||
Reference in New Issue
Block a user