|
|
c79cde5d7f
|
fix(tushare): 修复ETF复权qfq支持和溢价率获取
- 移除fetch()方法中ETF复权路由的qfq硬编码限制
- 修改ETF复权调用从fetch_etf_adj改为fetch_etf
- 确保qfq/hfq模式也能获取净值和溢价率数据
- 溢价率始终基于原始价格计算,不受复权影响
修复前:
- qfq返回404错误
- hfq无溢价率数据
修复后:
- raw/qfq/hfq三种模式均正常
- 所有模式都返回溢价率数据
- 本地测试全部通过
|
2026-05-25 20:25:29 +08:00 |
|
|
|
c0195c5bca
|
refactor(tushare): 合并ETF复权方法,消除冗余设计
- 合并 fetch_etf_adj 和 _fetch_etf_adj 为单一方法
- 删除 _fetch_etf_qfq 转发方法
- 减少~26行代码,优化代码结构(从3个方法→1个方法)
- 保持公共接口签名不变,完全向后兼容
- 全面测试通过:raw/qfq/hfq三种模式数据正确
- 更新 VALID_ADJ_BY_TYPE 配置,ETF支持前复权/后复权
|
2026-05-25 19:59:49 +08:00 |
|
|
|
798a316ad5
|
feat: ETF复权功能扩展至支持前复权qfq
核心变更:
- TushareSource: _fetch_etf_adj() 支持 qfq 和 hfq 双模式
* 后复权(hfq): close × adj_factor
* 前复权(qfq): close × adj_factor / latest_factor
- UniversalDataFetcher: VALID_ADJ_BY_TYPE 更新
* CHINA_ETF: ['raw', 'hfq'] → ['raw', 'qfq', 'hfq']
复权公式验证:
- 纳指ETF(513100.SH): HFQ / QFQ = latest_factor (5.0020) ✅
- 5/5 个交易日全部通过验证
技术实现:
- fetch_etf_adj(): 公共接口支持 adj='qfq' 或 'hfq'
- _fetch_etf_adj(): 内部实现根据 adj 参数分支计算
- 前复权使用全量最新复权因子确保准确性
|
2026-05-25 00:15:59 +08:00 |
|
|
|
c07974ad94
|
feat: 重构ETF和股票复权逻辑,抛弃pro_bar自行实现
核心变更:
- 放弃 Tushare pro_bar 接口(pandas 3.x 不兼容)
- A股股票: 使用 pro.daily() + pro.adj_factor() 自行计算复权
- ETF: 使用 fund_daily() + fund_adj() 分段获取复权因子
- 修复 pandas 兼容性: 使用 ffill() 替代 fillna(method='ffill')
验证结果 (4层独立验证):
1. AKShare新浪交叉验证: AKShare_raw × Tushare_factor ≈ Our_hfq, 差异 < 0.0001
2. 数学公式验证: Tushare_raw × factor = Our_hfq, 差异 < 0.0001
3. 股票复权对比: 我们的实现 vs pro_bar, 差异 < 0.00005
4. 浏览器直接验证: 东方财富官方后复权 vs Our_hfq, 差异 0.0024 (0.04%)
技术实现:
- fetch_stock_adj(): 完整重写A股股票复权逻辑
- fetch_etf_adj(): 新增ETF复权公共接口
- _fetch_etf_hfq(): 重写ETF后复权,支持分段请求(单次限2000条)
- 前复权计算使用全量最新复权因子,确保准确性
|
2026-05-25 00:06:37 +08:00 |
|
|
|
feb7c78e68
|
refactor: 统一ETF获取接口为单个DataFrame返回
重构说明:
- TushareSource.fetch_etf(): 新增 adj 参数,统一接口
- 返回单个 DataFrame
- df.attrs['nav']: 净值 DataFrame
- df.attrs['premium']: 溢价率 Series
- 移除冗余方法:
- fetch_etf_with_nav() → 合并到 fetch_etf()
- fetch_etf_adj() → 重命名为 _fetch_etf_hfq()(内部方法)
- UniversalDataFetcher: 适配新接口
- fetch_etf_with_nav(): 从 df.attrs 提取元数据(兼容旧接口)
- fetch_etf_adj(): 调用 fetch_etf(adj='hfq')
- Flask: 更新注释说明
架构优势:
- 单一接口:一个方法搞定所有 ETF 数据获取
- 数据一致:所有数据在一个 DataFrame 对象中
- 缓存友好:只需缓存一个 DataFrame
- 扩展性强:新增数据直接添加到 attrs
|
2026-05-23 22:36:23 +08:00 |
|
|
|
2867ae8d21
|
refactor: 将ETF净值和溢价率逻辑下移到TushareSource层
重构说明:
- TushareSource: 新增 fetch_etf_with_nav() 和 _calculate_premium_series()
- UniversalDataFetcher: 简化 fetch_etf_with_nav() 为透传调用
- Flask: 更新注释说明数据层已处理
架构优势:
- 职责分离:TushareSource 封装完整数据获取逻辑
- 可复用性:任何调用 TushareSource 的地方都有净值
- 维护性:业务逻辑集中在数据源层
- 符合单一职责原则
|
2026-05-23 22:28:21 +08:00 |
|
|
|
3697c9d38b
|
fix: 修复数据获取架构逻辑Bug
修复内容:
1. Bug #1: TushareSource.fetch(adj='raw') ETF 无法获取
- 在 adj='raw' 分支优先判断 ETF
- ETF 代码现在正确路由到 fetch_etf()
2. Bug #2: is_china_index 判断范围过宽
- 添加 ETF 排除逻辑
- ETF 不再被误判为指数
3. 接口一致性:CCXTSource 添加 adj 参数
- fetch(code, start, end, adj='raw', timeframe)
- 加密货币仅支持 adj='raw'
- UniversalDataFetcher._fetch_crypto() 同步更新
影响:
- ETF 原始价格数据获取恢复正常
- 类型判断逻辑更准确
- 数据源接口签名统一
|
2026-05-23 21:46:01 +08:00 |
|
|
|
02dbc7bd7d
|
refactor(datasource): 底层fetch方法添加adj参数
TushareSource.fetch() 和 YFinanceSource.fetch() 新增 adj 参数支持 raw/qfq/hfq
- TushareSource.fetch(adj='raw'): 内部路由到 fetch_index/fetch_stock_adj/fetch_etf_adj
- YFinanceSource.fetch(adj='raw'): 内部路由到 fetch_adj() 或原始逻辑
- 添加 is_china_stock() 和 _is_etf_code() 方法用于资产类型判断
|
2026-05-23 18:32:00 +08:00 |
|
|
|
209dd7fd83
|
refactor(tushare): 移除代理清除/恢复逻辑
Tushare是国内服务,不需要代理切换操作
移除内容:
- _clear_proxy 方法
- _restore_proxy 方法
- 所有方法中的代理清除和恢复调用
代码精简37行,保持原有功能不变
|
2026-05-23 11:55:02 +08:00 |
|
|
|
b066b23495
|
feat(tushare): 新增ETF后复权价格和交易日历获取方法
新增方法:
- fetch_etf_adj: 获取ETF后复权价格数据,消除份额拆分对收益率的影响
通过 fund_daily + fund_adj 手动计算后复权价格
fund_adj 单次限2000条,按5年分段请求
- fetch_trade_cal: 获取A股SSE官方交易日历
验证结果:
- 纳指ETF后复权正确识别2022-01-14拆分(复权因子5.0)
- 累计收益100.54%与纳指100指数一致
|
2026-05-23 11:51:32 +08:00 |
|
|
|
19131c41dd
|
fix: 数据源路由修复与因子计算改进
1. 修复期货路由逻辑:NYMEX期货(.NYM)走YFinance而非Tushare
2. 添加SSH隧道路径修复(原引擎)
3. 因子计算只使用close列(处理部分指数只有收盘价的情况)
4. 添加数据不足和缺失率剔除日志
收益对比:
- 原引擎(剔除国债): 累计1804%, 调仓459次
- 新框架: 累计772%, 调仓1276次
差异原因待查:
- 国债剔除逻辑不同
- 调仓频率差异
|
2026-05-12 00:47:43 +08:00 |
|
|
|
a7a4a69153
|
fix: 修复回测日期对齐问题,优化收益率计算
- 使用对齐后的index_close数据计算日收益率
- 添加日期对齐逻辑确保信号和收益率数据一致
- 修复pivot重复索引问题,使用pivot_table
- 修复tushare期货接口调用(futures_daily -> fut_daily)
回测结果:
- 最终净值: 0.9435
- 累计收益: -5.65%
- 信号日期: 2302天
|
2026-05-12 00:12:46 +08:00 |
|
|
|
e56bd39400
|
feat: 创建数据源模块 datasource/
核心功能:
- ssh_tunnel.py: SSH隧道管理器(连接香港ECS)
- tushare_source.py: A股数据获取(指数、ETF、期货)
- yfinance_source.py: 境外数据获取(港股、美股)
- hybrid_source.py: 混合数据源(整合所有)
使用方式:
from datasource import HybridDataSource
source = HybridDataSource.from_yaml('config/strategies/rotation.yaml')
result = source.fetch_all()
更新 RotationStrategy 使用新数据源模块
|
2026-05-12 00:03:25 +08:00 |
|