refactor(datasource): 分层接口设计,移除HybridDataSource
架构改动: - 移除 HybridDataSource(功能被 UniversalDataFetcher 覆盖) - 新增分层接口设计:基础层 + 扩展层 基础层(统一接口): - fetch(): 统一 OHLCV 接口,自动识别资产类型 - fetch_batch(): 批量获取 扩展层(资产类型特有): - fetch_etf_adj(): A股 ETF 后复权价格 - fetch_us_adj(): 美股复权价格 - fetch_etf_with_nav(): ETF 价格 + 净值 + 溢价率 其他修改: - YFinanceSource: 新增 fetch_adj() 方法 - strategy.py: 改用 UniversalDataFetcher 替代 HybridDataSource - __init__.py: 移除 HybridDataSource 导出
This commit is contained in:
@@ -455,4 +455,64 @@ class UniversalDataFetcher:
|
||||
|
||||
def is_supported(self, code: str) -> bool:
|
||||
"""判断是否支持该代码"""
|
||||
return AssetTypeDetector.detect(code) != AssetType.UNKNOWN
|
||||
return AssetTypeDetector.detect(code) != AssetType.UNKNOWN
|
||||
|
||||
# ============================================================
|
||||
# 扩展层:资产类型特有方法(复权/净值/溢价率)
|
||||
# ============================================================
|
||||
|
||||
def fetch_etf_adj(
|
||||
self,
|
||||
code: str,
|
||||
start_date: str,
|
||||
end_date: str
|
||||
) -> Optional[pd.DataFrame]:
|
||||
"""
|
||||
获取 A股 ETF 后复权价格
|
||||
|
||||
通过 fund_daily + fund_adj 手动计算后复权价格
|
||||
- 消除份额折算(拆分)对收益率的影响
|
||||
- 适用于计算真实收益率
|
||||
|
||||
Args:
|
||||
code: ETF代码,如 '159915.SZ', '513100.SH'
|
||||
start_date: 开始日期 'YYYY-MM-DD'
|
||||
end_date: 结束日期 'YYYY-MM-DD'
|
||||
|
||||
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
|
||||
"""
|
||||
return self._tushare.fetch_etf_adj(code, start_date, end_date)
|
||||
|
||||
def fetch_us_adj(
|
||||
self,
|
||||
code: str,
|
||||
start_date: str,
|
||||
end_date: str
|
||||
) -> Optional[pd.DataFrame]:
|
||||
"""
|
||||
获取美股复权价格
|
||||
|
||||
使用 YFinance auto_adjust=True
|
||||
- 消除拆分(split)和分红(dividend)对价格的影响
|
||||
- 适用于美股股票/ETF
|
||||
|
||||
Args:
|
||||
code: 美股代码,如 'AAPL', 'TSLA', 'QQQ'
|
||||
start_date: 开始日期 'YYYY-MM-DD'
|
||||
end_date: 结束日期 'YYYY-MM-DD'
|
||||
|
||||
Returns:
|
||||
DataFrame with columns: date, open, high, low, close, volume (复权后)
|
||||
|
||||
示例:
|
||||
# 苹果复权价格(包含分红和拆分调整)
|
||||
df = fetcher.fetch_us_adj("AAPL", "2020-01-01", "2024-12-31")
|
||||
"""
|
||||
self._start_tunnel()
|
||||
return self._yfinance.fetch_adj(code, start_date, end_date)
|
||||
Reference in New Issue
Block a user