refactor: 统一ETF获取接口为单个DataFrame返回

重构说明:
- TushareSource.fetch_etf(): 新增 adj 参数,统一接口
  - 返回单个 DataFrame
  - df.attrs['nav']: 净值 DataFrame
  - df.attrs['premium']: 溢价率 Series
- 移除冗余方法:
  - fetch_etf_with_nav() → 合并到 fetch_etf()
  - fetch_etf_adj() → 重命名为 _fetch_etf_hfq()(内部方法)
- UniversalDataFetcher: 适配新接口
  - fetch_etf_with_nav(): 从 df.attrs 提取元数据(兼容旧接口)
  - fetch_etf_adj(): 调用 fetch_etf(adj='hfq')
- Flask: 更新注释说明

架构优势:
- 单一接口:一个方法搞定所有 ETF 数据获取
- 数据一致:所有数据在一个 DataFrame 对象中
- 缓存友好:只需缓存一个 DataFrame
- 扩展性强:新增数据直接添加到 attrs
This commit is contained in:
2026-05-23 22:36:23 +08:00
parent 2867ae8d21
commit feb7c78e68
3 changed files with 66 additions and 57 deletions

View File

@@ -713,12 +713,12 @@ def get_ohlcv():
result['asset_type'] = final_type.value # 使用最终类型
result['adj'] = adj # 返回使用的 adj 参数
# 如果是中国 ETF附加净值和溢价率数据数据层已处理
# 如果是中国 ETF附加净值和溢价率数据数据层已处理,通过 df.attrs 传递
if final_type == AssetType.CHINA_ETF:
try:
f = get_fetcher()
with f:
# 调用 TushareSource 的完整方法
# 调用统一接口,数据通过 DataFrame.attrs 传递
price_df, nav_df, premium_series = f.fetch_etf_with_nav(code, start, end)
# 添加净值数据