feat(cli): daily --resume 对已最新股票直接跳过并明示增量结果

- 增量基准改为「本地全局最新交易日」:股票本地已含该日期 → 跳过,不再发空区间 API 请求(此前 end=今天 在周末/盘前会多调一次返回 0 根,观感像非增量)
- 汇总输出区分写入量与跳过数:…写入 N 根;增量跳过(已最新)M 只(本地最新 YYYY-MM-DD)
- smoke:600519.SH(已到 2026-09-04)→ 即时返回『跳过 1 只』,无 API 空调用
This commit is contained in:
Simon
2026-09-06 20:43:49 +08:00
parent 778c4beb07
commit e2741a0236
+17 -1
View File
@@ -91,21 +91,34 @@ def _symbols_of(args) -> list[str]:
def cmd_daily(args) -> int: def cmd_daily(args) -> int:
from sqlalchemy import func
from app.infrastructure.persistence.sqlalchemy.models.market import StockDailyModel
symbols = _symbols_of(args) symbols = _symbols_of(args)
start = _parse_day(args.start) if args.start else date(2005, 1, 1) start = _parse_day(args.start) if args.start else date(2005, 1, 1)
end = _parse_day(args.end) if args.end else date.today() end = _parse_day(args.end) if args.end else date.today()
total = 0 total = 0
skipped = 0
with _session_ctx() as session: with _session_ctx() as session:
provider = _failover_provider(session) provider = _failover_provider(session)
bar_repo = SqlAlchemyDailyBarRepository(session) bar_repo = SqlAlchemyDailyBarRepository(session)
factor_repo = SqlAlchemyAdjustFactorRepository(session) factor_repo = SqlAlchemyAdjustFactorRepository(session)
# 增量基准:本地数据已到该日期即视为「已最新」,resume 时不再调 API
global_latest = (
session.scalar(select(func.max(StockDailyModel.trade_date))) if args.resume else None
)
for i, symbol in enumerate(symbols, start=1): for i, symbol in enumerate(symbols, start=1):
begin = start begin = start
if args.resume: if args.resume:
latest = bar_repo.latest_date(symbol) latest = bar_repo.latest_date(symbol)
if latest is not None: if latest is not None:
if global_latest is not None and latest >= global_latest:
skipped += 1 # 已同步到本地最新交易日,无需续拉
continue
begin = max(begin, latest + timedelta(days=1)) begin = max(begin, latest + timedelta(days=1))
if begin > end: if begin > end:
skipped += 1 # 无待拉区间(如区间已含在本地)
continue continue
try: try:
bars = provider.get_daily(symbol, begin, end) bars = provider.get_daily(symbol, begin, end)
@@ -119,7 +132,10 @@ def cmd_daily(args) -> int:
except DataSourceError as exc: except DataSourceError as exc:
print(f" [warn] {symbol} 拉取失败: {exc}", file=sys.stderr) print(f" [warn] {symbol} 拉取失败: {exc}", file=sys.stderr)
session.commit() session.commit()
print(f"[daily] {len(symbols)} 只股票合计写入 {total} 根日线(含复权因子)") detail = f"[daily] {len(symbols)} 只股票合计写入 {total} 根日线(含复权因子)"
if args.resume:
detail += f";增量跳过(已最新){skipped} 只(本地最新 {global_latest})"
print(detail)
return 0 return 0