diff --git a/datasource/ccxt_source.py b/datasource/ccxt_source.py index 4477175..33c2329 100644 --- a/datasource/ccxt_source.py +++ b/datasource/ccxt_source.py @@ -212,6 +212,13 @@ class CCXTSource: # 过滤日期范围 df = df.loc[start_dt:end_dt] + # 添加元数据到 attrs + df.attrs['source'] = 'ccxt' + df.attrs['exchange'] = self.exchange_name + df.attrs['symbol'] = symbol + df.attrs['timeframe'] = tf + df.attrs['adj'] = 'raw' + print(f"✓ 获取成功: {len(df)} 条数据") return df @@ -263,6 +270,13 @@ class CCXTSource: df = df.set_index('date') df = df[['open', 'high', 'low', 'close', 'volume']] + # 添加元数据到 attrs + df.attrs['source'] = 'ccxt' + df.attrs['exchange'] = self.exchange_name + df.attrs['symbol'] = symbol + df.attrs['timeframe'] = tf + df.attrs['adj'] = 'raw' + # 注意:不再使用 normalize(),保留完整时间精度 return df diff --git a/datasource/universal_fetcher.py b/datasource/universal_fetcher.py index f4b540e..aa2fc6a 100644 --- a/datasource/universal_fetcher.py +++ b/datasource/universal_fetcher.py @@ -12,8 +12,10 @@ # 单标的获取(自动识别类型) df = fetcher.fetch("000300.SH", "2024-01-01", "2024-12-31") - # ETF获取(含净值) - price_df, nav_df = fetcher.fetch_etf_with_nav("513100.SH", "2024-01-01", "2024-12-31") + # ETF获取(含净值,从 df.attrs 提取) + df = fetcher.fetch_etf("513100.SH", "2024-01-01", "2024-12-31") + nav_df = df.attrs.get('nav') + premium_series = df.attrs.get('premium') # 批量获取 results = fetcher.fetch_batch(["000300.SH", "NDX", "N225"], "2024-01-01", "2024-12-31") @@ -306,9 +308,12 @@ class UniversalDataFetcher: end_date: str ) -> Tuple[Optional[pd.DataFrame], Optional[pd.DataFrame], Optional[pd.Series]]: """ - 获取ETF价格 + 净值 + 溢价率序列(兼容旧接口) + 获取ETF价格 + 净值 + 溢价率序列(⚠️ DEPRECATED 兼容旧接口) - 内部调用统一的 fetch_etf() 方法,从 DataFrame.attrs 提取元数据 + ⚠️ 推荐使用新接口: + df = fetcher.fetch_etf(code, start_date, end_date, adj='raw') + nav_df = df.attrs.get('nav') + premium_series = df.attrs.get('premium') Args: code: ETF代码 @@ -321,6 +326,14 @@ class UniversalDataFetcher: - nav_df: ETF净值数据(来自 df.attrs['nav']) - premium_series: 溢价率序列(来自 df.attrs['premium']) """ + import warnings + warnings.warn( + "fetch_etf_with_nav() is deprecated. " + "Use fetch_etf(code, start, end, adj='raw') and access df.attrs['nav'] and df.attrs['premium'] instead.", + DeprecationWarning, + stacklevel=2 + ) + # 调用统一的 fetch_etf() 方法 df = self._tushare.fetch_etf(code, start_date, end_date, adj='raw')