扩展指标
This commit is contained in:
@@ -0,0 +1,113 @@
|
||||
"""Unit tests for ferro_ta.indicators.price_transform"""
|
||||
|
||||
import numpy as np
|
||||
|
||||
from ferro_ta.indicators.price_transform import AVGPRICE, MEDPRICE, TYPPRICE, WCLPRICE
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Shared fixtures
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
O = np.array([10.0, 11.0, 12.0, 13.0])
|
||||
H = np.array([12.0, 13.0, 14.0, 15.0])
|
||||
L = np.array([9.0, 10.0, 11.0, 12.0])
|
||||
C = np.array([11.0, 12.0, 13.0, 14.0])
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# AVGPRICE
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
class TestAVGPRICE:
|
||||
def test_known_formula(self):
|
||||
result = AVGPRICE(O, H, L, C)
|
||||
expected = (O + H + L + C) / 4.0
|
||||
np.testing.assert_allclose(result, expected, rtol=1e-10)
|
||||
|
||||
def test_first_bar(self):
|
||||
result = AVGPRICE(O, H, L, C)
|
||||
np.testing.assert_allclose(result[0], (10 + 12 + 9 + 11) / 4.0, rtol=1e-10)
|
||||
|
||||
def test_no_nan(self):
|
||||
result = AVGPRICE(O, H, L, C)
|
||||
assert np.all(np.isfinite(result))
|
||||
|
||||
def test_length(self):
|
||||
assert len(AVGPRICE(O, H, L, C)) == len(O)
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# MEDPRICE
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
class TestMEDPRICE:
|
||||
def test_known_formula(self):
|
||||
result = MEDPRICE(H, L)
|
||||
expected = (H + L) / 2.0
|
||||
np.testing.assert_allclose(result, expected, rtol=1e-10)
|
||||
|
||||
def test_first_bar(self):
|
||||
result = MEDPRICE(H, L)
|
||||
np.testing.assert_allclose(result[0], (12 + 9) / 2.0, rtol=1e-10)
|
||||
|
||||
def test_no_nan(self):
|
||||
result = MEDPRICE(H, L)
|
||||
assert np.all(np.isfinite(result))
|
||||
|
||||
def test_length(self):
|
||||
assert len(MEDPRICE(H, L)) == len(H)
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# TYPPRICE
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
class TestTYPPRICE:
|
||||
def test_known_formula(self):
|
||||
result = TYPPRICE(H, L, C)
|
||||
expected = (H + L + C) / 3.0
|
||||
np.testing.assert_allclose(result, expected, rtol=1e-10)
|
||||
|
||||
def test_first_bar(self):
|
||||
result = TYPPRICE(H, L, C)
|
||||
np.testing.assert_allclose(result[0], (12 + 9 + 11) / 3.0, rtol=1e-10)
|
||||
|
||||
def test_no_nan(self):
|
||||
result = TYPPRICE(H, L, C)
|
||||
assert np.all(np.isfinite(result))
|
||||
|
||||
def test_length(self):
|
||||
assert len(TYPPRICE(H, L, C)) == len(H)
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# WCLPRICE
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
class TestWCLPRICE:
|
||||
def test_known_formula(self):
|
||||
result = WCLPRICE(H, L, C)
|
||||
expected = (H + L + 2.0 * C) / 4.0
|
||||
np.testing.assert_allclose(result, expected, rtol=1e-10)
|
||||
|
||||
def test_first_bar(self):
|
||||
result = WCLPRICE(H, L, C)
|
||||
np.testing.assert_allclose(result[0], (12 + 9 + 2 * 11) / 4.0, rtol=1e-10)
|
||||
|
||||
def test_no_nan(self):
|
||||
result = WCLPRICE(H, L, C)
|
||||
assert np.all(np.isfinite(result))
|
||||
|
||||
def test_close_weight_double(self):
|
||||
# WCLPRICE weights close twice vs TYPPRICE
|
||||
wcl = WCLPRICE(H, L, C)
|
||||
# On a rising series (H > L > 0), WCLPRICE > TYPPRICE when C > (H+L)/2
|
||||
# Just verify formula correctness already done above
|
||||
assert np.all(np.isfinite(wcl))
|
||||
|
||||
def test_length(self):
|
||||
assert len(WCLPRICE(H, L, C)) == len(H)
|
||||
Reference in New Issue
Block a user