Commit Graph

12 Commits

Author SHA1 Message Date
fb755fc31e refactor: 加密货币默认不缓存,简化分层缓存策略
问题:
- 加密货币分钟级数据量大,不适合全量缓存
- 原分层策略过于复杂

优化方案:
- 日级别数据(股票/指数/ETF/期货): 缓存全量数据,切片返回
- 加密货币: 每次实时下载,不缓存

代码简化:
- 删除 CRYPTO_CACHE_DAYS 配置
- 删除 _get_crypto_cache_start 函数
- _fetch_full_data_cached: 加密货币直接返回None
- fetch_data_with_ttl: 加密货币分支直接下载

优势:
- 日级别数据:减少重复下载
- 加密货币:避免内存爆炸,实时获取最新价格
2026-05-12 23:27:44 +08:00
1d3483bc02 feat: DEFAULT_START_DATE改为1980-01-01支持最长历史数据
数据历史深度调研:
- YFinance 标普500: 1980-01-02 (45年, 11685条)
- YFinance 日经225: 1980-01-04 (45年, 11396条)
- YFinance 纳斯达克100: 1985-10-01 (40年, 10232条)
- YFinance 恒生指数: 1986-12-31 (38年, 9712条)
- Tushare 沪深300: 2005-01-04 (21年, 5183条)

修改:
- DEFAULT_START_DATE: '2015-01-01' -> '1980-01-01'
- 支持最长45年的历史数据下载
- A股数据会在数据源端自动截取有效范围
2026-05-12 23:03:37 +08:00
4cee249823 feat: 优化缓存策略 - 全量数据缓存 + 按日期切片
缓存策略改进:
- Key改为(code, today_date):每天缓存一次全量数据
- 下载全量数据:从DEFAULT_START_DATE(2015-01-01)到今天
- 返回时切片:从缓存数据中按start-end范围切片返回

新增功能:
- DEFAULT_START_DATE配置项(可通过环境变量覆盖)
- _fetch_full_data_cached:缓存全量数据
- _slice_data_from_cache:从缓存切片指定日期范围

优势:
- 同一天内不同日期范围请求不会重复下载
- 第二天请求自动更新缓存(today_date变化)
- 减少对外部数据源的请求次数

修改文件:
- datasource/flask_server.py
2026-05-12 22:47:03 +08:00
2fba6d82f4 fix: SSH隧道启动前清理残留进程
问题:
- 多次运行回测后残留SSH进程干扰代理连接
- yfinance因代理冲突无法获取数据

修复:
- SSHTunnelManager添加 _cleanup_old_processes 方法
- 启动新隧道前自动清理同端口残留进程

验证:
- 清理后YFinance成功下载纳指、日经、DAX等数据
2026-05-12 22:40:35 +08:00
5c98b1cb6a refactor: SSH密钥移到根目录,删除config目录
迁移内容:
- config/hk_ecs.pem → hk_ecs.pem(根目录)
- 删除 config 目录(无其他内容)

路径更新:
- datasource/flask_server.py:默认路径改为 hk_ecs.pem
- strategies/rotation/config.yaml:SSH配置路径
- docker-compose.yml:挂载路径
- build-and-push.sh:示例命令
- README.md:项目结构说明

设计原则:敏感文件集中放在根目录
- .env:环境变量
- hk_ecs.pem:SSH密钥
2026-05-12 22:31:43 +08:00
aeb95a6f4c refactor: 配置文件迁移到策略目录(模块自包含)
迁移内容:
- config/strategies/rotation.yaml → strategies/rotation/config.yaml

路径更新(核心文件):
- strategies/rotation/strategy.py(注释示例)
- scripts/generate_legacy_report.py(config_path)
- run_rotation.py(注释和默认参数)
- datasource/hybrid_source.py(from_yaml示例和fetch_rotation_data)

保留:
- config/strategies/cci.yaml(无对应策略目录,暂保留)

设计原则:策略模块自包含,配置与实现同目录,方便移植和复制

验证:策略加载成功(候选池11只,回测区间2019-01-01 ~ 2026-05-12)
2026-05-12 22:14:35 +08:00
70515ab169 fix: SSH密钥路径从根目录迁移到config目录
修改内容:
1. datasource/flask_server.py
   - 默认路径从 'hk_ecs.pem' 改为 'config/hk_ecs.pem'

2. docker-compose.yml
   - 挂载路径从 './hk_ecs.pem:/app/hk_ecs.pem'
   - 改为 './config/hk_ecs.pem:/app/config/hk_ecs.pem'

3. build-and-push.sh
   - 示例命令中的路径同步更新

4. README.md
   - 项目结构说明中更新密钥位置

验证:
- rotation.yaml 已使用 config/hk_ecs.pem(无需修改)
- flask_server 默认路径正确指向 config/hk_ecs.pem
- 密钥文件存在于 config/hk_ecs.pem
2026-05-12 22:02:35 +08:00
16affb2368 feat: fetch_etf_with_nav 返回历史溢价率序列
修改内容:
1. universal_fetcher.py
   - fetch_etf_with_nav 返回三值:(price_df, nav_df, premium_series)
   - 新增 _calculate_premium_series 方法:计算每一天的溢价率
   - 溢价率 = (ETF收盘价 - ETF净值) / ETF净值
   - 净值用ffill对齐价格日期(处理T+1延迟)

2. flask_server.py
   - /api/v1/etf/nav 端点返回历史溢价率序列
   - 添加 premium_series 字段:[{date, premium}]
   - 添加 latest_premium: 最新溢价率
   - 添加 premium_stats: 统计数据(mean/std/min/max/median)

测试结果(513100.SH 纳指100 ETF):
- 价格数据: 8条
- 净值数据: 8条
- 溢价率序列: 8条
- 最新溢价率: 0.1500%
- 溢价率均值: 1.1433%
- 溢价率范围: 0.15% ~ 1.69%
2026-05-12 21:39:07 +08:00
4e3aac5e0e feat: Flask统一数据服务迁移(分层架构)
架构设计:
- 对外统一接口 fetch():自动识别资产类型并路由
- 对内分层实现:各资产类型独立方法,职责单一

新增文件:
- datasource/universal_fetcher.py: 统一数据获取器
  - _fetch_china_index: A股指数(Tushare)
  - _fetch_china_etf: A股ETF(含净值)
  - _fetch_us_index: 美股指数(YFinance+SSH)
  - _fetch_hk_index: 港股指数(YFinance+SSH)
  - _fetch_futures: 期货(Tushare/YFinance)
  - fetch_etf_with_nav: ETF价格+净值(计算溢价率)

- datasource/asset_type_detector.py: 资产类型检测器
  - AssetType枚举:9种资产类型
  - detect(): 自动识别资产类型
  - group_by_type(): 批量分组

- datasource/flask_server.py: Flask API服务
  - LRU + TTL 双缓存机制
  - 8个API端点:ohlcv、etf/nav、batch、cache等

更新:
- datasource/__init__.py: 导出新模块

验证:
- 模块导入成功
- 资产类型检测正确
- A股数据获取正常(沪深300: 5条)
2026-05-12 21:33:19 +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