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:
@@ -306,9 +306,9 @@ class UniversalDataFetcher:
|
||||
end_date: str
|
||||
) -> Tuple[Optional[pd.DataFrame], Optional[pd.DataFrame], Optional[pd.Series]]:
|
||||
"""
|
||||
获取ETF价格 + 净值 + 溢价率序列
|
||||
获取ETF价格 + 净值 + 溢价率序列(兼容旧接口)
|
||||
|
||||
直接调用 TushareSource 的完整方法,封装业务逻辑
|
||||
内部调用统一的 fetch_etf() 方法,从 DataFrame.attrs 提取元数据
|
||||
|
||||
Args:
|
||||
code: ETF代码
|
||||
@@ -318,12 +318,20 @@ class UniversalDataFetcher:
|
||||
Returns:
|
||||
(price_df, nav_df, premium_series)
|
||||
- price_df: ETF价格数据 (OHLCV)
|
||||
- nav_df: ETF净值数据
|
||||
- premium_series: 溢价率序列 (每天计算)
|
||||
- nav_df: ETF净值数据(来自 df.attrs['nav'])
|
||||
- premium_series: 溢价率序列(来自 df.attrs['premium'])
|
||||
"""
|
||||
return self._tushare.fetch_etf_with_nav(code, start_date, end_date)
|
||||
|
||||
# 移除 _calculate_premium_series 方法(已下移到 TushareSource)
|
||||
# 调用统一的 fetch_etf() 方法
|
||||
df = self._tushare.fetch_etf(code, start_date, end_date, adj='raw')
|
||||
|
||||
if df is None:
|
||||
return None, None, None
|
||||
|
||||
# 从 attrs 提取元数据
|
||||
nav_df = df.attrs.get('nav')
|
||||
premium_series = df.attrs.get('premium')
|
||||
|
||||
return df, nav_df, premium_series
|
||||
|
||||
# ============================================================
|
||||
# 内部方法:特殊资产类型(保留)
|
||||
@@ -450,11 +458,9 @@ class UniversalDataFetcher:
|
||||
end_date: str
|
||||
) -> Optional[pd.DataFrame]:
|
||||
"""
|
||||
获取 A股 ETF 后复权价格
|
||||
获取 A股 ETF 后复权价格(兼容旧接口)
|
||||
|
||||
通过 fund_daily + fund_adj 手动计算后复权价格
|
||||
- 消除份额折算(拆分)对收益率的影响
|
||||
- 适用于计算真实收益率
|
||||
内部调用统一的 fetch_etf(adj='hfq') 方法
|
||||
|
||||
Args:
|
||||
code: ETF代码,如 '159915.SZ', '513100.SH'
|
||||
@@ -463,13 +469,10 @@ class UniversalDataFetcher:
|
||||
|
||||
Returns:
|
||||
DataFrame with columns: date, open, close, adj_factor, close_hfq
|
||||
|
||||
示例:
|
||||
# 纳指ETF后复权(正确计算收益率)
|
||||
df = fetcher.fetch_etf_adj("513100.SH", "2020-01-01", "2024-12-31")
|
||||
# 使用 close_hfq 计算收益率,而非 close
|
||||
DataFrame.attrs['nav']: 净值 DataFrame
|
||||
DataFrame.attrs['premium']: 溢价率 Series(基于原始价格计算)
|
||||
"""
|
||||
return self._tushare.fetch_etf_adj(code, start_date, end_date)
|
||||
return self._tushare.fetch_etf(code, start_date, end_date, adj='hfq')
|
||||
|
||||
def fetch_us_adj(
|
||||
self,
|
||||
|
||||
Reference in New Issue
Block a user