fix(HEL-494): 修复个股缺失指标、问天遮罩、四爻外显并回补250日K
Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: multica-agent <github@multica.ai>
This commit is contained in:
co-authored by
Cursor
multica-agent
parent
c8a9376adb
commit
3e828b346c
@@ -5,7 +5,7 @@ from datetime import date, timedelta
|
||||
|
||||
from datahub.coverage import calendar_coverage, point_coverage, published_range_coverage
|
||||
from datahub.serving import V1API
|
||||
from tests.fixtures import TRADE_DATE, fake_transport
|
||||
from tests.fixtures import RAW, TRADE_DATE, fake_transport
|
||||
from tests.test_pipeline import make_pipeline
|
||||
|
||||
|
||||
@@ -48,6 +48,8 @@ def history_transport(open_dates: list[str], extra_closed: list[str] | None = No
|
||||
}
|
||||
)
|
||||
|
||||
dated_apis = ("daily", "daily_basic", "adj_factor", "moneyflow", "stk_auction")
|
||||
|
||||
def transport(api_name, params, fields):
|
||||
if api_name == "trade_cal":
|
||||
start = str(params.get("start_date") or "")
|
||||
@@ -66,6 +68,11 @@ def history_transport(open_dates: list[str], extra_closed: list[str] | None = No
|
||||
if end:
|
||||
rows = [row for row in rows if row["trade_date"] <= end]
|
||||
return rows
|
||||
if api_name in dated_apis:
|
||||
day = str(params.get("trade_date") or "")
|
||||
if day not in open_set:
|
||||
return []
|
||||
return [{**row, "trade_date": day} for row in RAW.get(api_name) or []]
|
||||
return fake_transport(api_name, params, fields)
|
||||
|
||||
return transport
|
||||
@@ -221,6 +228,54 @@ class HistoryBackfillTests(unittest.TestCase):
|
||||
self.assertEqual(result["rows"], 1)
|
||||
self.assertEqual(calls["n"], before)
|
||||
|
||||
def test_daily_history_is_idempotent_and_covers_requested_days(self) -> None:
|
||||
open_dates = consecutive_open_days(TRADE_DATE, 5)
|
||||
pipe, db = make_pipeline(
|
||||
quality={
|
||||
"index_history_trading_days": 5,
|
||||
"daily_history_trading_days": 5,
|
||||
"calendar_start": open_dates[0],
|
||||
}
|
||||
)
|
||||
pipe.adapter._transport = history_transport(open_dates)
|
||||
first = pipe.backfill_history(TRADE_DATE, index_days=5, daily_days=5)
|
||||
self.assertTrue(first["ok"])
|
||||
self.assertEqual(first["daily"]["requested_days"], 5)
|
||||
self.assertEqual(len(first["daily"]["published"]), 5)
|
||||
pubs = db.fetchall("SELECT trade_date FROM publications WHERE dataset='daily'")
|
||||
self.assertEqual(sorted(row["trade_date"] for row in pubs), open_dates)
|
||||
for day in open_dates:
|
||||
rows = db.fetchall(
|
||||
"""
|
||||
SELECT COUNT(*) AS n FROM eod_bars
|
||||
WHERE trade_date = ? AND batch_id = (
|
||||
SELECT active_batch FROM publications WHERE dataset='daily' AND trade_date = ?
|
||||
)
|
||||
""",
|
||||
(day, day),
|
||||
)
|
||||
self.assertEqual(rows[0]["n"], 2)
|
||||
|
||||
second = pipe.backfill_daily_history(end_date=TRADE_DATE, trading_days=5)
|
||||
self.assertTrue(second["ok"])
|
||||
self.assertEqual(second["published"], [])
|
||||
self.assertEqual(second["skipped"], open_dates)
|
||||
|
||||
def test_daily_row_ratio_ignores_later_ipos(self) -> None:
|
||||
pipe, db = make_pipeline()
|
||||
pipe.adapter._transport = history_transport([TRADE_DATE])
|
||||
pipe.ingest_reference(TRADE_DATE, start=TRADE_DATE)
|
||||
with db.write() as connection:
|
||||
connection.execute(
|
||||
"INSERT INTO stock_master(ts_code, symbol, name, list_status, list_date, updated_at) "
|
||||
"VALUES (?,?,?,?,?,?)",
|
||||
("688001.SH", "688001", "未来上市", "L", "20250101", "2024-09-02T00:00:00+08:00"),
|
||||
)
|
||||
self.assertEqual(pipe._listed_count(TRADE_DATE), 2)
|
||||
result = pipe.run_eod_batch_a(TRADE_DATE)
|
||||
self.assertEqual(pipe.eod_failures(result), [])
|
||||
self.assertEqual(result["daily"]["state"], "published")
|
||||
|
||||
def test_coverage_helpers_point_and_calendar(self) -> None:
|
||||
pipe, db = make_pipeline()
|
||||
pipe.ingest_reference(TRADE_DATE)
|
||||
|
||||
Reference in New Issue
Block a user