基本面数据源

📎 引用文件

本文引用的文件 - sec_edgar_client.py - fundamentals_loader.py - _fundamental_schema.py - sec_frames.py - tushare_fundamentals.py - rsshub_events.py - _http.py - test_fundamentals_pit.py - test_tushare_fundamentals_provider.py

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考虑
  8. 故障排查指南
  9. 结论
  10. 附录

简介

本文件为 Vibe-Trading 的基本面数据源提供系统化文档,覆盖 SEC EDGAR、Tushare 基本面接口与事件/舆情数据源的集成方式;阐述财务报表(资产负债表、利润表、现金流量表)的标准化处理流程;说明公司事件(财报发布、高管变动、重大公告)的获取与点时安全(Point-in-Time, PIT)处理;给出财务比率、估值指标与基本面因子的构建方法;并提供数据质量验证、缺失值处理与历史数据回溯的技术方案。

项目结构

本项目将基本面数据源按“数据提供者 + 加载器 + 统一模式”组织: - SEC EDGAR 客户端负责与 SEC 公开 API 交互(CIK 映射、提交索引、XBRL 公司事实)。 - 基本面加载器将稀疏 XBRL 事实转换为按日对齐的面板数据,并支持 TTM/季度/年度频率与 PIT 约束。 - 统一模式模块定义字段语义、SEC 概念别名映射与派生字段计算。 - Tushare 基本面提供商封装中国 A 股三大报表及指标查询,提供 PIT 裁剪与去重。 - RSSHub 事件提供商拉取新闻/公告/情绪信号,生成可交易的事件分数列。 - HTTP 工具提供按主机桶限流与连接复用,避免触发第三方速率限制。

graph TB subgraph "数据源" SEC["SEC EDGAR<br/>companyfacts / submissions"] TUSHARE["Tushare<br/>income/balancesheet/cashflow/fina_indicator"] RSSHUB["RSSHub<br/>事件/舆情"] end subgraph "加载层" SEC_CLIENT["SEC 客户端<br/>cik_for / get_company_facts"] FUND_LOADER["基本面加载器<br/>load_fundamental_panel"] TUSHARE_PROVIDER["Tushare 基本面提供商"] EVENT_PROVIDER["事件提供商"] end subgraph "统一模式" SCHEMA["统一字段模式<br/>RAW_FIELDS/DERIVED_FIELDS/SEC_CONCEPT_MAP"] SEC_FRAMES["周期帧判定<br/>quarter/annual/ytd/instant"] HTTP_UTIL["HTTP 限流/会话复用"] end SEC --> SEC_CLIENT SEC_CLIENT --> FUND_LOADER TUSHARE --> TUSHARE_PROVIDER RSSHUB --> EVENT_PROVIDER FUND_LOADER --> SCHEMA FUND_LOADER --> SEC_FRAMES SEC_CLIENT --> HTTP_UTIL EVENT_PROVIDER --> HTTP_UTIL

图示来源 - sec_edgar_client.py:1-235 - fundamentals_loader.py:1-501 - _fundamental_schema.py:1-227 - sec_frames.py:1-129 - tushare_fundamentals.py:1-380 - rsshub_events.py:1-569 - _http.py:1-180

章节来源 - sec_edgar_client.py:1-235 - fundamentals_loader.py:1-501 - _fundamental_schema.py:1-227 - sec_frames.py:1-129 - tushare_fundamentals.py:1-380 - rsshub_events.py:1-569 - _http.py:1-180

核心组件

章节来源 - sec_edgar_client.py:1-235 - fundamentals_loader.py:1-501 - _fundamental_schema.py:1-227 - tushare_fundamentals.py:1-380 - rsshub_events.py:1-569 - _http.py:1-180

架构总览

下图展示从数据源到最终面板/增强的端到端流程,强调 PIT 安全与标准化。

sequenceDiagram participant Caller as "调用方" participant Loader as "基本面加载器" participant SEC as "SEC 客户端" participant Schema as "统一模式" participant Frames as "周期帧判定" participant Panel as "面板输出" Caller->>Loader : load_fundamental_panel(symbols, fields, start, end, freq, pit) Loader->>Schema : resolve_field()/collect_raw_fields() Loader->>SEC : cik_for(symbol) alt 找到 CIK Loader->>SEC : get_company_facts(cik) SEC-->>Loader : XBRL facts Loader->>Frames : classify_span()/frame_key() Loader->>Loader : _extract_concept_series() Loader->>Loader : _to_ttm_flow_series() (freq=ttm) Loader->>Loader : _ffill_pit(filed锚点) Loader-->>Caller : {field : DataFrame(index=dates, columns=symbols)} else 未找到 CIK Loader-->>Caller : 空面板(该symbol全NaN) end

图示来源 - fundamentals_loader.py:196-277 - sec_edgar_client.py:166-227 - _fundamental_schema.py:196-227 - sec_frames.py:42-129

详细组件分析

SEC EDGAR 客户端

flowchart TD Start(["请求 CIK"]) --> CheckCache{"缓存命中?"} CheckCache --> |是| ReturnCIK["返回CIK"] CheckCache --> |否| FetchTickers["拉取 company_tickers.json"] FetchTickers --> BuildMap["构建 ticker→CIK 映射"] BuildMap --> CacheStore["写入进程缓存"] CacheStore --> ReturnCIK

图示来源 - sec_edgar_client.py:118-163 - sec_edgar_client.py:166-195 - sec_edgar_client.py:198-227 - _http.py:120-180

章节来源 - sec_edgar_client.py:1-235 - _http.py:1-180

基本面加载器(SEC)

flowchart TD S(["开始"]) --> Extract["_extract_concept_series()"] Extract --> FilterForm{"表单允许?"} FilterForm --> |否| Drop["丢弃行"] FilterForm --> |是| Dedup["按(period_start,end)去重"] Dedup --> TTMCalc{"freq==ttm且为流量概念?"} TTMCalc --> |是| TTM["_to_ttm_flow_series()"] TTMCalc --> |否| Next["继续"] TTM --> Next Next --> FFill["_ffill_pit(filed锚点)"] FFill --> Output["输出DataFrame"]

图示来源 - fundamentals_loader.py:47-131 - fundamentals_loader.py:134-166 - fundamentals_loader.py:169-193 - sec_frames.py:42-129

章节来源 - fundamentals_loader.py:1-501 - sec_frames.py:1-129

统一模式(字段与派生)

classDiagram class 统一模式 { +RAW_FIELDS +DERIVED_FIELDS +SEC_CONCEPT_MAP +resolve_field(field) +list_supported_fields() } class 派生计算 { +_safe_divide(numerator, denominator) +roe = net_income / total_equity +roa = net_income / total_assets +accruals = (net_income - cfo) / total_assets +leverage = total_debt / total_equity } 统一模式 --> 派生计算 : "使用"

图示来源 - _fundamental_schema.py:22-26 - _fundamental_schema.py:28-79 - _fundamental_schema.py:86-153 - _fundamental_schema.py:156-189 - _fundamental_schema.py:196-227

章节来源 - _fundamental_schema.py:1-227

Tushare 基本面提供商

sequenceDiagram participant Client as "调用方" participant Provider as "TushareFundamentalProvider" participant API as "Tushare API" Client->>Provider : query_fundamentals(table, codes, as_of, periods, fields) Provider->>API : 逐代码拉取报表 API-->>Provider : DataFrame Provider->>Provider : 校验schema / 选择PIT列 / 去重 Provider-->>Client : 结果DataFrame

图示来源 - tushare_fundamentals.py:110-179 - tushare_fundamentals.py:181-251 - tushare_fundamentals.py:264-380

章节来源 - tushare_fundamentals.py:1-380 - test_tushare_fundamentals_provider.py:1-200

事件/舆情数据(RSSHub)

flowchart TD Q(["query_events(codes, as_of)"]) --> Fetch["按feed拉取XML"] Fetch --> Parse["解析item(title/description/pubDate)"] Parse --> Score["打分(title, summary)"] Score --> PIT{"knowable_date <= as_of?"} PIT --> |否| Drop["丢弃"] PIT --> |是| Keep["保留"] Keep --> Merge["去重/排序"] Merge --> Result["返回事件表"]

图示来源 - rsshub_events.py:288-400 - rsshub_events.py:449-484 - rsshub_events.py:501-569

章节来源 - rsshub_events.py:1-569

依赖关系分析

graph LR FundLoader["fundamentals_loader"] --> SECClient["sec_edgar_client"] FundLoader --> Schema["_fundamental_schema"] FundLoader --> SecFrames["sec_frames"] TushareProv["tushare_fundamentals"] -.-> HTTP["_http"] EventProv["rsshub_events"] -.-> HTTP SECClient -.-> HTTP

图示来源 - fundamentals_loader.py:1-501 - sec_edgar_client.py:1-235 - _fundamental_schema.py:1-227 - sec_frames.py:1-129 - tushare_fundamentals.py:1-380 - rsshub_events.py:1-569 - _http.py:1-180

章节来源 - fundamentals_loader.py:1-501 - sec_edgar_client.py:1-235 - _fundamental_schema.py:1-227 - sec_frames.py:1-129 - tushare_fundamentals.py:1-380 - rsshub_events.py:1-569 - _http.py:1-180

性能考虑

[本节为通用指导,不直接分析具体文件]

故障排查指南

章节来源 - fundamentals_loader.py:386-416 - fundamentals_loader.py:459-492 - tushare_fundamentals.py:125-135 - tushare_fundamentals.py:232-236 - rsshub_events.py:324-341 - rsshub_events.py:383-391

结论

Vibe-Trading 的基本面数据源以 SEC EDGAR 与 Tushare 为核心,辅以 RSSHub 事件数据,形成“多源采集—统一模式—PIT 安全—面板输出”的完整链路。通过严格的周期帧判定、TTM 聚合、filed 锚点前填与 PIT 裁剪,确保回测与实盘的一致性;统一的字段与派生规则使因子构建与估值指标生成具备可扩展性与可比性。配合 HTTP 限流与缓存机制,系统在稳定性与性能上达到生产可用水平。

[本节为总结,不直接分析具体文件]

附录

财务报表标准化映射(摘要)

章节来源 - _fundamental_schema.py:28-79 - _fundamental_schema.py:156-189

数据质量与回溯

章节来源 - fundamentals_loader.py:169-193 - fundamentals_loader.py:292-300 - tushare_fundamentals.py:145-179 - test_fundamentals_pit.py:71-101 - test_fundamentals_pit.py:104-145 - test_fundamentals_pit.py:147-176 - test_tushare_fundamentals_provider.py:73-92 - test_tushare_fundamentals_provider.py:148-196