feat(data): 财务/日线同步增量 + 新浪「两边一致」校验兜底 + 逐只进度

- financial 默认增量:按 A 股披露节奏判断已最新并跳过;--full 强制全量重拉
- Tushare fina_indicator 增加报告期窗口与 100 条/请求自动分页(修复老报告期静默截断)
- 新浪兜底收紧为校验兜底:两源重叠历史一致才导入缺失键,行标记 source=sina;
  财务可比字段取 eps/销售毛利率(ROE 两端口径不同不作依据),日线只比较最近重叠交易日
- CLI 输出逐只进度与导入内容描述(来源/行数/报告期与公告区间),失败股票留待重跑
- financial_indicator 增 source 列(迁移 d3f6c9a21b04);新增一致性/分页/服务测试
This commit is contained in:
Simon
2026-09-08 21:48:09 +08:00
parent a77d3c13c3
commit 442999f701
17 changed files with 1519 additions and 55 deletions
+7
View File
@@ -83,11 +83,18 @@ class FinancialIndicator(BaseModel):
可见性红线:研究侧查询一律按 announce_date <= as_of_date 过滤,
report_date 只表示报告所属期间,不代表公开时间。
source 标记数据来源:tushare(首选,字段全)| sina(兜底,字段
可能不全——新浪关键指标只含 eps/roe/gross_margin 等少数项)。
新浪兜底行只在「该股票本地历史与新浪重叠部分两边一致」通过校验后
才导入(见 application/services/data_sync.py),且只补本地缺失键。
研究侧对同一报告期应优先消费 source=tushare 的行。
"""
symbol: str
report_date: date
announce_date: date
source: str = Field(default="tushare", description="tushare | sina")
eps: Decimal | None = None
roe: Decimal | None = None
total_revenue: Decimal | None = None
+12 -1
View File
@@ -37,4 +37,15 @@ class MarketDataProvider(Protocol):
def get_adjust_factor(self, symbol: str, start: date, end: date) -> list[AdjustFactor]: ...
def get_financial(self, symbol: str) -> list[FinancialIndicator]: ...
def get_financial(
self,
symbol: str,
start: date | None = None,
end: date | None = None,
) -> list[FinancialIndicator]:
"""财务指标快照。
start/end 为**报告期**窗口(对应 Tushare fina_indicator 的
start_date/end_date 参数,按报告期过滤);不传表示全量历史。
新浪接口不支持按窗口拉取,提供方会忽略窗口后由调用方自行过滤。
"""
@@ -72,6 +72,12 @@ class AdjustFactorRepository(Protocol):
class FinancialRepository(Protocol):
def upsert_many(self, rows: Sequence[FinancialIndicator]) -> int: ...
def list_symbol(self, symbol: str) -> list[FinancialIndicator]:
"""该股票本地全部财务行(增量判断 / 新浪校验重叠用,量级小)。"""
def has_report_period(self, symbol: str, report_date: date) -> bool:
"""本地是否已含该报告期(最新应披露报告期是否已入库)。"""
def list_announced(
self,
symbol: str,