功能更新
This commit is contained in:
@@ -16,7 +16,7 @@ from sqlalchemy import delete, func, insert, select
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
|
||||
from ..config import settings
|
||||
from ..models import DailySnapshot, MarketDaily, StockBasic, TradeCalendar
|
||||
from ..models import AdjFactor, DailySnapshot, MarketDaily, StockBasic, TradeCalendar
|
||||
from .llm import ScreenerError
|
||||
|
||||
# 进程内单例任务状态(uvicorn --reload 单进程场景够用)
|
||||
@@ -160,6 +160,18 @@ def _fetch_basic(pro, d: str) -> list[dict]:
|
||||
return rows
|
||||
|
||||
|
||||
def _fetch_adj_factor(pro, d: str) -> list[dict]:
|
||||
"""拉取某交易日全市场复权因子(K线 bfq->qfq/hfq 本地换算的底座)。"""
|
||||
time.sleep(settings.screener_sync_interval)
|
||||
df = _call_retry(pro.adj_factor, trade_date=d)
|
||||
if df is None or df.empty:
|
||||
return []
|
||||
return [
|
||||
{"trade_date": _parse_d(d), "ts_code": r["ts_code"], "adj_factor": float(r["adj_factor"])}
|
||||
for _, r in df.iterrows()
|
||||
]
|
||||
|
||||
|
||||
def _sync_stock_list_sync(pro) -> list[dict]:
|
||||
"""拉取在市股票列表。"""
|
||||
time.sleep(settings.screener_sync_interval)
|
||||
@@ -243,6 +255,16 @@ async def _run_sync(days: int, force: bool) -> None:
|
||||
await _replace_day(session, MarketDaily, daily_rows, d)
|
||||
_sync_state["done_days"] += 1
|
||||
|
||||
# 2.5) 复权因子(与日线同窗口增量;历史全量由 scripts/backfill_adj_factor.py 回补)
|
||||
async with async_session() as session:
|
||||
have_adj = set() if force else await _existing_dates(session, AdjFactor)
|
||||
for d in [d for d in dates if d not in have_adj]:
|
||||
_sync_state["step"] = f"正在同步 {d} 复权因子"
|
||||
adj_rows = await asyncio.to_thread(_fetch_adj_factor, pro, d)
|
||||
if adj_rows:
|
||||
async with async_session() as session:
|
||||
await _replace_day(session, AdjFactor, adj_rows, d)
|
||||
|
||||
# 3) 最新「有数据」交易日的快照(daily_basic,仅 1 次调用)
|
||||
# 用 market_daily 实际最大交易日(今天的数据收盘后才生成,日历最新日会拉到空)
|
||||
async with async_session() as session:
|
||||
|
||||
Reference in New Issue
Block a user