""" 数据获取器抽象基类 """ from abc import ABC, abstractmethod from typing import Dict, List, Optional import pandas as pd class DataFetcher(ABC): """ 数据获取器抽象基类 所有数据获取器必须实现必要方法 """ name: str = "base" def __init__(self, **params): """ 初始化数据获取器参数 Args: **params: 数据源参数(如 api_url, ssh_config 等) """ self._params = params @abstractmethod def fetch_indices( self, codes: List[str], start: str, end: str ) -> Dict[str, pd.DataFrame]: """ 获取指数 OHLCV 数据 Args: codes: 指数代码列表 start: 开始日期 (YYYY-MM-DD) end: 结束日期 (YYYY-MM-DD) Returns: {code: DataFrame} 字典 """ pass @abstractmethod def fetch_etf( self, codes: List[str], start: str, end: str ) -> Dict[str, pd.DataFrame]: """ 获取 ETF 数据(价格 + 净值) Args: codes: ETF 代码列表 start: 开始日期 end: 结束日期 Returns: {code: DataFrame} 字典 """ pass @abstractmethod def get_trading_calendar(self, market: str = 'A') -> pd.Index: """ 获取交易日历 Args: market: 市场代码('A', 'US', 'HK' 等) Returns: 交易日历 Index """ pass def get_benchmark(self, code: str, start: str, end: str) -> pd.Series: """ 获取基准数据(可选) Args: code: 基准代码 start: 开始日期 end: 结束日期 Returns: 基准收盘价 Series """ raise NotImplementedError("Optional method") def __repr__(self) -> str: params_str = ', '.join([f"{k}={v}" for k, v in self._params.items()]) return f"{self.__class__.__name__}(name={self.name})"