refactor(flask_api_fetcher): 暴露adj参数,增强接口透明度和灵活性
改进: - fetch_indices()添加adj参数,默认'raw',可自定义 - fetch_etf()添加adj参数,默认'hfq',可自定义 - 改进日志输出,显示实际使用的adj参数 - 保持向后兼容,默认值保持原有行为 优势: - 透明性:调用者清楚知道使用的复权方式 - 灵活性:可按需获取raw/qfq/hfq数据 - 一致性:两个方法接口统一 - 向后兼容:不影响现有代码
This commit is contained in:
@@ -60,7 +60,8 @@ class FlaskAPIFetcher(DataFetcher):
|
|||||||
self,
|
self,
|
||||||
codes: List[str],
|
codes: List[str],
|
||||||
start: str,
|
start: str,
|
||||||
end: str
|
end: str,
|
||||||
|
adj: str = 'raw'
|
||||||
) -> Dict[str, pd.DataFrame]:
|
) -> Dict[str, pd.DataFrame]:
|
||||||
"""
|
"""
|
||||||
获取指数 OHLCV 数据
|
获取指数 OHLCV 数据
|
||||||
@@ -69,6 +70,7 @@ class FlaskAPIFetcher(DataFetcher):
|
|||||||
codes: 指数代码列表(如 ["000300.SH", "000905.SH"])
|
codes: 指数代码列表(如 ["000300.SH", "000905.SH"])
|
||||||
start: 开始日期 (YYYY-MM-DD)
|
start: 开始日期 (YYYY-MM-DD)
|
||||||
end: 结束日期 (YYYY-MM-DD)
|
end: 结束日期 (YYYY-MM-DD)
|
||||||
|
adj: 复权类型,默认 'raw'(指数通常用原始价格)
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
{code: DataFrame} 字典,DataFrame 包含 OHLCV 列
|
{code: DataFrame} 字典,DataFrame 包含 OHLCV 列
|
||||||
@@ -82,7 +84,7 @@ class FlaskAPIFetcher(DataFetcher):
|
|||||||
... )
|
... )
|
||||||
>>> print(data["000300.SH"].head())
|
>>> print(data["000300.SH"].head())
|
||||||
"""
|
"""
|
||||||
print(f"\n[FlaskAPI] 获取 {len(codes)} 只指数数据...")
|
print(f"\n[FlaskAPI] 获取 {len(codes)} 只指数数据(adj='{adj}')...")
|
||||||
|
|
||||||
results = {}
|
results = {}
|
||||||
for i, code in enumerate(codes, 1):
|
for i, code in enumerate(codes, 1):
|
||||||
@@ -92,7 +94,7 @@ class FlaskAPIFetcher(DataFetcher):
|
|||||||
code=code,
|
code=code,
|
||||||
start_date=start,
|
start_date=start,
|
||||||
end_date=end,
|
end_date=end,
|
||||||
adj='raw' # 指数通常用原始价格
|
adj=adj # 使用传入的 adj 参数
|
||||||
)
|
)
|
||||||
|
|
||||||
if df is not None:
|
if df is not None:
|
||||||
@@ -110,7 +112,8 @@ class FlaskAPIFetcher(DataFetcher):
|
|||||||
self,
|
self,
|
||||||
codes: List[str],
|
codes: List[str],
|
||||||
start: str,
|
start: str,
|
||||||
end: str
|
end: str,
|
||||||
|
adj: str = 'hfq'
|
||||||
) -> Dict[str, pd.DataFrame]:
|
) -> Dict[str, pd.DataFrame]:
|
||||||
"""
|
"""
|
||||||
获取 ETF 数据(价格 + 净值)
|
获取 ETF 数据(价格 + 净值)
|
||||||
@@ -119,6 +122,7 @@ class FlaskAPIFetcher(DataFetcher):
|
|||||||
codes: ETF 代码列表(如 ["510300.SH", "159919.SZ"])
|
codes: ETF 代码列表(如 ["510300.SH", "159919.SZ"])
|
||||||
start: 开始日期 (YYYY-MM-DD)
|
start: 开始日期 (YYYY-MM-DD)
|
||||||
end: 结束日期 (YYYY-MM-DD)
|
end: 结束日期 (YYYY-MM-DD)
|
||||||
|
adj: 复权类型,默认 'hfq'(ETF 收益计算推荐后复权)
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
{code: DataFrame} 字典
|
{code: DataFrame} 字典
|
||||||
@@ -128,15 +132,23 @@ class FlaskAPIFetcher(DataFetcher):
|
|||||||
|
|
||||||
示例:
|
示例:
|
||||||
>>> fetcher = FlaskAPIFetcher()
|
>>> fetcher = FlaskAPIFetcher()
|
||||||
|
>>> # 默认使用 hfq(后复权)
|
||||||
>>> data = fetcher.fetch_etf(
|
>>> data = fetcher.fetch_etf(
|
||||||
... ["510300.SH", "159919.SZ"],
|
... ["510300.SH", "159919.SZ"],
|
||||||
... "2024-01-01",
|
... "2024-01-01",
|
||||||
... "2024-12-31"
|
... "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')
|
>>> nav = data["510300.SH"].attrs.get('nav')
|
||||||
"""
|
"""
|
||||||
print(f"\n[FlaskAPI] 获取 {len(codes)} 只 ETF 数据...")
|
print(f"\n[FlaskAPI] 获取 {len(codes)} 只 ETF 数据(adj='{adj}')...")
|
||||||
|
|
||||||
results = {}
|
results = {}
|
||||||
for i, code in enumerate(codes, 1):
|
for i, code in enumerate(codes, 1):
|
||||||
@@ -146,7 +158,7 @@ class FlaskAPIFetcher(DataFetcher):
|
|||||||
code=code,
|
code=code,
|
||||||
start_date=start,
|
start_date=start,
|
||||||
end_date=end,
|
end_date=end,
|
||||||
adj='hfq', # ETF 收益计算必须使用后复权价格(处理份额拆分)
|
adj=adj, # 使用传入的 adj 参数
|
||||||
asset_type='china_etf' # 强制指定 ETF 类型
|
asset_type='china_etf' # 强制指定 ETF 类型
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user