From 2ff48e8d56cdfbee72b24e038b6cce46ef6f36e7 Mon Sep 17 00:00:00 2001 From: aszerW Date: Tue, 26 May 2026 19:54:41 +0800 Subject: [PATCH] =?UTF-8?q?refactor(flask=5Fapi=5Ffetcher):=20=E6=9A=B4?= =?UTF-8?q?=E9=9C=B2adj=E5=8F=82=E6=95=B0=EF=BC=8C=E5=A2=9E=E5=BC=BA?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E9=80=8F=E6=98=8E=E5=BA=A6=E5=92=8C=E7=81=B5?= =?UTF-8?q?=E6=B4=BB=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 改进: - fetch_indices()添加adj参数,默认'raw',可自定义 - fetch_etf()添加adj参数,默认'hfq',可自定义 - 改进日志输出,显示实际使用的adj参数 - 保持向后兼容,默认值保持原有行为 优势: - 透明性:调用者清楚知道使用的复权方式 - 灵活性:可按需获取raw/qfq/hfq数据 - 一致性:两个方法接口统一 - 向后兼容:不影响现有代码 --- framework_v2/shared/data/flask_api_fetcher.py | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/framework_v2/shared/data/flask_api_fetcher.py b/framework_v2/shared/data/flask_api_fetcher.py index 72dcf64..98cf82b 100644 --- a/framework_v2/shared/data/flask_api_fetcher.py +++ b/framework_v2/shared/data/flask_api_fetcher.py @@ -60,7 +60,8 @@ class FlaskAPIFetcher(DataFetcher): self, codes: List[str], start: str, - end: str + end: str, + adj: str = 'raw' ) -> Dict[str, pd.DataFrame]: """ 获取指数 OHLCV 数据 @@ -69,6 +70,7 @@ class FlaskAPIFetcher(DataFetcher): codes: 指数代码列表(如 ["000300.SH", "000905.SH"]) start: 开始日期 (YYYY-MM-DD) end: 结束日期 (YYYY-MM-DD) + adj: 复权类型,默认 'raw'(指数通常用原始价格) Returns: {code: DataFrame} 字典,DataFrame 包含 OHLCV 列 @@ -82,7 +84,7 @@ class FlaskAPIFetcher(DataFetcher): ... ) >>> print(data["000300.SH"].head()) """ - print(f"\n[FlaskAPI] 获取 {len(codes)} 只指数数据...") + print(f"\n[FlaskAPI] 获取 {len(codes)} 只指数数据(adj='{adj}')...") results = {} for i, code in enumerate(codes, 1): @@ -92,7 +94,7 @@ class FlaskAPIFetcher(DataFetcher): code=code, start_date=start, end_date=end, - adj='raw' # 指数通常用原始价格 + adj=adj # 使用传入的 adj 参数 ) if df is not None: @@ -110,7 +112,8 @@ class FlaskAPIFetcher(DataFetcher): self, codes: List[str], start: str, - end: str + end: str, + adj: str = 'hfq' ) -> Dict[str, pd.DataFrame]: """ 获取 ETF 数据(价格 + 净值) @@ -119,6 +122,7 @@ class FlaskAPIFetcher(DataFetcher): codes: ETF 代码列表(如 ["510300.SH", "159919.SZ"]) start: 开始日期 (YYYY-MM-DD) end: 结束日期 (YYYY-MM-DD) + adj: 复权类型,默认 'hfq'(ETF 收益计算推荐后复权) Returns: {code: DataFrame} 字典 @@ -128,15 +132,23 @@ class FlaskAPIFetcher(DataFetcher): 示例: >>> fetcher = FlaskAPIFetcher() + >>> # 默认使用 hfq(后复权) >>> data = fetcher.fetch_etf( ... ["510300.SH", "159919.SZ"], ... "2024-01-01", ... "2024-12-31" ... ) + >>> # 或者显式指定 raw(原始价格,用于计算溢价率) + >>> data_raw = fetcher.fetch_etf( + ... ["510300.SH"], + ... "2024-01-01", + ... "2024-12-31", + ... adj='raw' + ... ) >>> # 访问净值 >>> nav = data["510300.SH"].attrs.get('nav') """ - print(f"\n[FlaskAPI] 获取 {len(codes)} 只 ETF 数据...") + print(f"\n[FlaskAPI] 获取 {len(codes)} 只 ETF 数据(adj='{adj}')...") results = {} for i, code in enumerate(codes, 1): @@ -146,7 +158,7 @@ class FlaskAPIFetcher(DataFetcher): code=code, start_date=start, end_date=end, - adj='hfq', # ETF 收益计算必须使用后复权价格(处理份额拆分) + adj=adj, # 使用传入的 adj 参数 asset_type='china_etf' # 强制指定 ETF 类型 )