Files
market_intel/tests/test_move_aggregate.py
T
2026-08-01 10:33:19 +08:00

58 lines
2.2 KiB
Python

from packages.domain.aggregate import aggregate_move_points, build_move_samples, move_points_stats_payload
from packages.domain.range import resolve_range
def test_build_move_samples_settled_and_pending():
from datetime import datetime
from zoneinfo import ZoneInfo
sh = ZoneInfo("Asia/Shanghai")
ts = int(datetime(2026, 7, 30, 10, 0, tzinfo=sh).timestamp() * 1000)
rows = [
{"ts_ms": ts, "side": "C", "expiry_ymd": "260720", "index_px": 3400}, # settled
{"ts_ms": ts, "side": "P", "expiry_ymd": "260720", "index_px": 3450},
{"ts_ms": ts, "side": "C", "expiry_ymd": "991231", "index_px": 3500}, # pending far
]
settlements = {
"260720": {"settle_ts_ms": ts - 1000, "settle_index_px": 3500},
}
samples, meta = build_move_samples(rows, settlements, side="both", now_ms=ts)
assert meta["settled_count"] == 2
assert meta["pending_count"] == 1
assert meta["pending_expiry"] is True
assert samples[0]["move_signed"] == 100.0 # 3500-3400
assert samples[1]["move_abs"] == 50.0
def test_aggregate_move_points():
from datetime import datetime
from zoneinfo import ZoneInfo
sh = ZoneInfo("Asia/Shanghai")
ts = int(datetime(2026, 7, 30, 14, 20, tzinfo=sh).timestamp() * 1000)
samples = [
{"ts_ms": ts, "move_signed": 100, "move_abs": 100},
{"ts_ms": ts, "move_signed": -40, "move_abs": 40},
]
buckets = aggregate_move_points(samples, bucket_minutes=60)
b14 = next(b for b in buckets if b["bucket_start_min"] == 14 * 60)
assert b14["n"] == 2
assert b14["mean_signed"] == 30.0
assert b14["mean_abs"] == 70.0
def test_move_points_payload_pending_message():
info = resolve_range("day", "2026-07-30")
payload = move_points_stats_payload(
[{"ts_ms": info["start_ms"] + 3600_000, "side": "C", "expiry_ymd": "991231", "index_px": 1}],
{},
range_info=info,
bucket_minutes=60,
side="both",
now_ms=info["start_ms"],
)
assert payload["status"] == "ok"
assert payload["pending_expiry"] is True
assert payload["settled_count"] == 0
assert payload["sample_count"] == 0