mirror of
https://ghfast.top/https://github.com/aeroxw/tick-stock-panel.git
synced 2026-09-12 23:44:16 +08:00
- 市场环境: 新增情绪周期6阶段(冰点/启动/主升/高潮/退潮/修复, 连板梯队驱动, EMA平滑+2日确认+弱档否决, 平均段长9.7天)与概念/行业主线排名(涨停梯队聚合, 可配置宽基/风格标签过滤); 市场环境页重构, regime 透明加列, 与5档state并存 - 挖掘: 因子与策略挖掘全链路(API/worker/进程锁/候选库/前端工作台/文档), 周度调度默认关闭且永不自动发布 - 回测: 财务快照因子(点时口径), 批量回测预计算共享下期收益, 信号路径矩阵列依赖展开修复(consecutive_limit_ups 缺列报错) - 数据/性能: enriched 生成与预热治理, 重任务限流, 行情/K线缓存复用, 时区修复 - 测试: 后端全量 914 通过; GUI 黑盒验证截图存证 gui-test-screenshots/
39 lines
1.4 KiB
Python
39 lines
1.4 KiB
Python
"""时区契约测试 — 分时拉取窗口必须按北京时间解释, 与服务器本地时区无关。
|
|
|
|
fetch_minute_single 构造的 naive datetime 会被 _datetime_to_ms 的 .timestamp()
|
|
按服务器本地时区解释: UTC 容器 (Docker 默认) 上窗口偏移 8 小时, 补拉必为空。
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
from datetime import date, datetime
|
|
|
|
from app.market_time import CN_TZ
|
|
from app.services import kline_sync
|
|
|
|
|
|
def test_fetch_minute_single_window_is_beijing_wall_clock(monkeypatch):
|
|
captured: dict[str, int] = {}
|
|
|
|
def _fake_try_custom_minute(*args, **kwargs):
|
|
return (None, True) # 未配自定义源 → 走 TickFlow 分支
|
|
|
|
class _FakeKlines:
|
|
@staticmethod
|
|
def batch(symbols, period, start_time, end_time, **kwargs):
|
|
captured["start_ms"] = start_time
|
|
captured["end_ms"] = end_time
|
|
return []
|
|
|
|
class _FakeClient:
|
|
klines = _FakeKlines
|
|
|
|
monkeypatch.setattr(kline_sync, "_try_custom_minute", _fake_try_custom_minute)
|
|
monkeypatch.setattr(kline_sync, "get_client", lambda: _FakeClient())
|
|
|
|
kline_sync.fetch_minute_single("600000.SH", date(2026, 8, 14))
|
|
|
|
start = datetime.fromtimestamp(captured["start_ms"] / 1000, tz=CN_TZ)
|
|
end = datetime.fromtimestamp(captured["end_ms"] / 1000, tz=CN_TZ)
|
|
assert (start.date(), start.hour, start.minute) == (date(2026, 8, 14), 9, 25)
|
|
assert (end.date(), end.hour, end.minute) == (date(2026, 8, 14), 15, 5)
|