feat(data-source): 支持指数-ETF双轨数据获取及因子计算
- 新增使用Tushare获取A股ETF价格及净值数据的私有方法 - fetch_all方法支持接收完整代码配置,区分指数与ETF及市场类别 - 指数数据和ETF数据分别下载,ETF净值数据用于溢价率计算 - 采用A股交易日为主交易日历,非A股数据前向填充对齐 - 调整因子计算,支持指数价格计算因子,ETF价格计算收益率 - run_rotation脚本和RotationStrategy引擎适配指数-ETF配置格式 - 代码结构优化,增强多市场及加密货币处理能力
This commit is contained in:
@@ -34,31 +34,40 @@ class RotationStrategy(BacktestStrategy):
|
||||
self.backtest_result = None
|
||||
|
||||
def fetch_data(self) -> pd.DataFrame:
|
||||
"""获取数据"""
|
||||
"""获取数据(支持指数-ETF双轨数据)"""
|
||||
from config.settings import DEFAULT_BENCHMARK_CODE
|
||||
|
||||
# 从配置中读取基准代码,或使用默认值
|
||||
benchmark_code = self.config.get("benchmark", {}).get("code", DEFAULT_BENCHMARK_CODE)
|
||||
|
||||
# 获取代码配置(包含 name, etf, market)
|
||||
code_config = self.config.get("code_list", {})
|
||||
|
||||
# 使用上下文管理器管理 SSH 隧道(如果是 YFinance 数据源)
|
||||
# 使用上下文管理器管理 SSH 隧道
|
||||
with self.data_source:
|
||||
etf_data, benchmark_data, valid_codes = self.data_source.fetch_all(
|
||||
self.config["code_list"],
|
||||
index_data, etf_data, etf_nav_data, benchmark_data, valid_codes = self.data_source.fetch_all(
|
||||
code_config,
|
||||
benchmark_code,
|
||||
self.config["start_date"],
|
||||
self.config["end_date"],
|
||||
)
|
||||
|
||||
self.etf_data = etf_data
|
||||
# 存储数据和配置
|
||||
self.index_data = index_data # 指数数据(用于因子计算)
|
||||
self.etf_data = etf_data # ETF价格数据(用于收益计算)
|
||||
self.etf_nav_data = etf_nav_data # ETF净值数据(用于溢价率计算)
|
||||
self.benchmark_data = benchmark_data
|
||||
self.valid_codes = valid_codes
|
||||
self.code_config = code_config # 代码配置(用于判断市场类型)
|
||||
|
||||
# 计算因子
|
||||
# 计算因子(传入两套数据:指数数据用于因子,ETF数据用于收益)
|
||||
factor_data, valid_codes = compute_factors(
|
||||
etf_data,
|
||||
index_data,
|
||||
valid_codes,
|
||||
n=self.config["n_days"],
|
||||
factor_type=self.config["factor_type"],
|
||||
etf_data=etf_data, # 传入ETF数据用于收益计算
|
||||
code_config=code_config, # 传入配置以判断加密货币
|
||||
)
|
||||
|
||||
self.data = factor_data
|
||||
|
||||
Reference in New Issue
Block a user