feat: init the repo
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
"""Property-based tests (Hypothesis) for ferro-ta."""
|
||||
|
||||
import numpy as np
|
||||
import pytest
|
||||
|
||||
from ferro_ta import BBANDS, CDLDOJI, EMA, RSI, SMA
|
||||
|
||||
try:
|
||||
from hypothesis import given, settings
|
||||
from hypothesis.strategies import floats, integers, lists
|
||||
|
||||
HAS_HYPOTHESIS = True
|
||||
except ImportError:
|
||||
HAS_HYPOTHESIS = False
|
||||
|
||||
if HAS_HYPOTHESIS:
|
||||
# Strategy: finite floats, reasonable length
|
||||
finite_floats = floats(
|
||||
min_value=1e-6, max_value=1e6, allow_nan=False, allow_infinity=False
|
||||
)
|
||||
price_arrays = lists(finite_floats, min_size=2, max_size=500).map(np.array)
|
||||
periods = integers(min_value=1, max_value=100)
|
||||
|
||||
@given(price_arrays, periods)
|
||||
@settings(max_examples=50, deadline=5000)
|
||||
def test_sma_output_length_matches_input(close, timeperiod):
|
||||
if len(close) < timeperiod:
|
||||
timeperiod = min(timeperiod, len(close))
|
||||
if timeperiod < 1:
|
||||
timeperiod = 1
|
||||
result = SMA(close, timeperiod=timeperiod)
|
||||
assert len(result) == len(close)
|
||||
|
||||
@given(price_arrays, periods)
|
||||
@settings(max_examples=50, deadline=5000)
|
||||
def test_ema_output_length_matches_input(close, timeperiod):
|
||||
if len(close) < timeperiod:
|
||||
timeperiod = min(timeperiod, len(close))
|
||||
if timeperiod < 1:
|
||||
timeperiod = 1
|
||||
result = EMA(close, timeperiod=timeperiod)
|
||||
assert len(result) == len(close)
|
||||
|
||||
@given(price_arrays, periods)
|
||||
@settings(max_examples=50, deadline=5000)
|
||||
def test_rsi_output_length_matches_input(close, timeperiod):
|
||||
if len(close) < timeperiod:
|
||||
timeperiod = min(timeperiod, len(close))
|
||||
if timeperiod < 1:
|
||||
timeperiod = 1
|
||||
result = RSI(close, timeperiod=timeperiod)
|
||||
assert len(result) == len(close)
|
||||
|
||||
@given(price_arrays, periods)
|
||||
@settings(max_examples=30, deadline=5000)
|
||||
def test_bbands_three_outputs_same_length(close, timeperiod):
|
||||
if len(close) < timeperiod:
|
||||
timeperiod = min(timeperiod, len(close))
|
||||
if timeperiod < 1:
|
||||
timeperiod = 1
|
||||
upper, middle, lower = BBANDS(close, timeperiod=timeperiod)
|
||||
assert len(upper) == len(close)
|
||||
assert len(middle) == len(close)
|
||||
assert len(lower) == len(close)
|
||||
|
||||
@given(
|
||||
lists(finite_floats, min_size=3, max_size=100).map(np.array),
|
||||
lists(finite_floats, min_size=3, max_size=100).map(np.array),
|
||||
lists(finite_floats, min_size=3, max_size=100).map(np.array),
|
||||
lists(finite_floats, min_size=3, max_size=100).map(np.array),
|
||||
)
|
||||
@settings(max_examples=20, deadline=5000)
|
||||
def test_cdl_pattern_output_values_in_set(open_, high, low, close):
|
||||
n = min(len(open_), len(high), len(low), len(close))
|
||||
open_ = open_[:n]
|
||||
high = high[:n]
|
||||
low = low[:n]
|
||||
close = close[:n]
|
||||
result = CDLDOJI(open_, high, low, close)
|
||||
assert len(result) == n
|
||||
assert all(v in (-100, 0, 100) for v in result)
|
||||
|
||||
|
||||
@pytest.mark.skipif(not HAS_HYPOTHESIS, reason="hypothesis not installed")
|
||||
class TestPropertyBased:
|
||||
"""Placeholder for running property-based tests as a class."""
|
||||
|
||||
def test_import(self):
|
||||
assert HAS_HYPOTHESIS
|
||||
Reference in New Issue
Block a user