76faf78a42
fix: 完整匹配原引擎剔除逻辑和因子对齐顺序
...
关键修复:
1. OHLCV整行dropna()剔除逻辑(匹配原引擎)
- 国债 931862.CSI 因 open/high/low 全空被剔除
- 原引擎: df = index_ohlcv_data[code].dropna()
- 新框架: 同样逻辑
2. 因子计算顺序:先计算因子再对齐到A股交易日历
- 原引擎: factor_series = rolling(n).apply(); factor_aligned = reindex(ffill)
- 新框架: 同样顺序,避免ffill填充的重复值影响rolling窗口
对比结果:
| 指标 | 原引擎 | 新框架(修复后) |
|------|--------|---------------|
| 累计收益 | 1804% | 1999% |
| 信号匹配率 | - | 90.3% |
| 调仓次数 | 459 | ~578 |
剩余195%收益差距可能来自收益计算细节差异
2026-05-12 01:14:07 +08:00
f5d748257e
fix: 关键修复-境外数据对齐到A股交易日历后计算因子
...
问题根因:
- 2019-02-18等日期是A股交易日但不是美股交易日(总统日假期)
- 新框架因子计算使用原始境外数据索引,导致这些日期因子值为NaN
- 原引擎使用 reindex(a_share_dates, method='ffill') 前向填充
修复:
- 因子计算前将所有标的数据对齐到A股交易日历
- 使用前向填充(ffill)处理境外市场交易日缺失
收益对比:
- 原引擎: 1804% 累计收益, 459次调仓
- 新框架(修复后): 1703% 累计收益, 578次调仓
剩余差异:
- 新框架保留国债(931862.CSI),原引擎剔除
- 信号匹配率36.5%,但收益接近说明策略逻辑有效
2026-05-12 01:01: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
e6b2c8cfb7
fix: 适配归档数据源接口,添加dotenv加载
...
- 使用 fetch_all() 替代 fetch_batch()
- 添加 from dotenv import load_dotenv 加载环境变量
- 返回完整数据结构(index_data, etf_data, nav_data, benchmark)
回测验证成功:
- 累计收益: 164.47%
- 最终净值: 2.6447
- 信号日期: 1780 天
2026-05-11 23:56:05 +08:00
893a75a27f
refactor: 将回测逻辑整合到策略类,简化执行入口
...
重构 RotationStrategy:
- 添加 from_yaml() 从配置创建实例
- 添加 get_data() 获取数据
- 添加 compute_factors() 计算因子
- 添加 generate_signals() 生成信号
- 添加 run_backtest() 完整回测流程
简化 run_rotation.py:
- 从 264 行简化为 9 行
- 只做策略调用入口
执行方式:
python run_rotation.py --config config/strategies/rotation.yaml
python run_rotation.py --save-path results/my_rotation
代码方式:
strategy = RotationStrategy.from_yaml('config/strategies/rotation.yaml')
result = strategy.run_backtest()
2026-05-11 23:50:40 +08:00
9e1ba2db03
refactor: 移除screener目录到archive
...
- strategies/screener/ → archive/legacy_screener/
- base.py (Screener抽象基类) 功能已被 framework/signals/SignalGenerator 覆盖
- cci.py (CCI策略) 依赖已归档的 core.factors.technical 和 core.common
保留新框架结构,使用 SignalGenerator 替代 Screener 抽象
2026-05-11 23:36:29 +08:00
1fca536c95
refactor: 归档旧代码,保留新框架结构
...
归档内容:
- core/ (数据源、因子计算、通用工具) → archive/legacy_core/
- strategies/rotation/engine.py, portfolio.py, report.py → archive/legacy_core/
- scripts/ (run_rotation, daily_scheduler) → archive/legacy_scripts/
- examples/ → archive/legacy_examples/
- tests/ (实验、对比测试) → archive/legacy_tests/
- 单独文件 (fetch_*.py, 动量.py, 全球市场.py等) → archive/single_files/
保留新结构:
- framework/ (抽象接口)
- strategies/shared/ (定制组件)
- strategies/rotation/strategy.py (新策略)
- 外层配置: .env, .dockerignore, build-and-push.sh, hk_ecs.pem, README.md, requirements.txt
- Docker相关: Dockerfile, Dockerfile_base, docker-compose.yml
更新README反映新框架架构
2026-05-11 23:34:23 +08:00
774758c3b0
feat(data): 实现数据获取层抽象接口
...
- OHLCVData: 标准化K线数据结构
- DataSource: 数据源抽象接口(fetch/fetch_batch)
- DataCache: 缓存抽象接口(get/set/is_fresh)
- LocalFileCache: 本地文件缓存实现
- HybridDataSourceAdapter/TushareDataSource/YFinanceDataSource: 定制数据源适配器
2026-05-11 23:24:11 +08:00
c5a41b71ae
feat(signals): 完善TopNSelector分散化选股和调仓控制
...
- 支持group_mapping分组映射(替代group_info列)
- 每大类选Top1,然后跨类排序选Top3
- 添加调仓周期控制(rebalance_days)
- 添加调仓阈值检查(rebalance_threshold)
- 支持最小得分过滤(min_score过滤负分)
2026-05-11 23:23:37 +08:00
de31271ab3
feat(rotation): 实现轮动策略(使用框架抽象+定制组件)
...
- RotationStrategy: 继承StrategyBase,使用MomentumFactor+TopNSelector
- 实现before_entry溢价过滤、dynamic_stoploss动态止损、custom_exit自定义出场
- 策略配置从类属性读取,支持config覆盖
2026-05-11 23:09:49 +08:00
69081297c5
feat(strategies): 实现定制组件(因子、信号生成器、风控)
...
- strategies/shared/factors/momentum.py: MomentumFactor/TrendFactor/ReversalFactor/VolatilityFactor
- strategies/shared/signals/selectors.py: TopNSelector/TrendFollower/ReversalTrader
- strategies/shared/risk/controls.py: StopLossControl/PositionLimitControl/PremiumControl
- strategies/shared/__init__.py: 统一入口导出所有定制组件
2026-05-11 23:09:35 +08:00
baeeb13c34
fix(engine): 修复净值起点归一化问题,确保净值从1.0开始
...
问题分析:
1. 策略净值起点原为1.0051,不是标准的1.0
2. 根本原因:日收益率在factor_data中已计算好,第一行包含前一天价格变化
3. cumprod()从第一行开始,导致起点不是1.0
4. 累计收益计算错误:
- 原计算方式:净值终点-1 = 1822.83%
- 正确收益:净值终点/起点 = 1813.07%
- 差异约10%
修复内容:
- strategies/rotation/engine.py
- 策略净值归一化:净值 = cumprod() / cumprod().iloc[0]
- 基准净值归一化:同样处理确保起点=1.0
- 消除第一行日收益率包含的前一天收益影响
修复效果:
- 策略净值起点:从1.0051 → 1.0000 ✅
- 基准净值起点:从1.0072 → 1.0000 ✅
- 策略累计收益:从1822.83% → 1813.07% ✅
- 基准累计收益:从48.21% → 47.15% ✅
影响:
- HTML报告中净值曲线起点标准化为1.0
- KPI指标中的累计收益计算正确
- 与其他回测系统的净值展示方式一致
2026-05-08 23:07:08 +08:00
9ecc796d36
fix(engine): 修复净值计算中NaN值导致的缺失问题
...
问题分析:
1. HSTECH.HK数据从2020-08-26才开始,早期数据缺失
2. 原净值计算使用iloc[0]作为基准,若首日价格是NaN则整列净值变成NaN
3. 原日收益率计算中,某品种日收益率NaN会导致mean()返回NaN
4. 导致策略净值62个缺失值(3.53%)
修复内容:
1. strategies/rotation/engine.py - 各品种净值计算
- 使用第一个有效价格作为基准(而非iloc[0])
- 若品种无有效数据则净值列全部为NaN
2. strategies/rotation/engine.py - 策略日收益率计算
- select_num=1时:若日收益率是NaN则返回0.0
- select_num>1时:忽略NaN值计算mean()
- 若所有品种日收益率都缺失则返回0.0
修复效果:
- 策略净值缺失:从62个(3.53%)降至0个(0%)
- HSTECH.HK净值缺失:从100%降至21.49%(377/1754)
- 其他品种净值:全部无缺失
说明:
- HSTECH.HK净值377个缺失是正常的(数据从2020-08-26才开始)
- 早期缺失日期(2019年)非HSTECH持仓期,缺失由其他原因导致
2026-05-08 22:52:36 +08:00
987cb38322
feat(report): 净值曲线数据统一来源,直接读取轮动策略输出
...
修改内容:
1. strategies/rotation/report.py
- 新增保存策略净值曲线到CSV文件的功能
- 保存字段:日期、策略净值、基准净值、各品种净值
- 输出路径: results/report_nav.csv
- 包含1754条净值记录
2. visualization/report_generator/generate_report.py
- 加载净值曲线CSV文件(优先)
- 直接使用轮动策略输出的净值数据,不再重新计算
- 保留备用计算逻辑(CSV不存在时)
- 新增 benchmark_values 用于显示基准净值
3. visualization/report_generator/template.html
- 净值曲线图表新增基准净值曲线(红色虚线)
- 添加图例显示(策略净值、基准净值)
- Tooltip 显示双线数据对比
效果:
- 净值曲线数据统一从轮动策略回测结果获取
- 避免重复计算导致的曲线不一致
- HTML报告显示策略vs基准对比曲线
- 数据来源清晰可追溯(1754条完整净值记录)
2026-05-08 22:33:41 +08:00
861e590441
feat(report): 策略KPI数据统一来源,避免重复计算
...
修改内容:
1. strategies/rotation/report.py
- 新增保存策略KPI到JSON文件的功能
- 保存指标:累计收益、年化收益、夏普比率、最大回撤、Calmar比率、日胜率
- 同时保存基准指标和回测区间信息
- 输出路径: results/report_metrics.json
2. visualization/report_generator/generate_report.py
- 加载策略KPI JSON文件(优先)
- 直接使用轮动策略输出的指标,不再重复计算
- 保留备用计算逻辑(JSON不存在时)
- 确保HTML报告与轮动策略结果完全一致
效果:
- KPI指标统一从轮动策略回测结果获取
- 避免重复计算导致的数据不一致
- 数据来源清晰可追溯
- HTML报告指标与终端输出完全一致
2026-05-08 22:25:22 +08:00
c1fbd2c7db
feat(strategy): finalize global rotation system with advanced risk controls
...
Summary of updates:
1. Core Logic (engine.py): Added 'score > 0' filtering to support automatic cash positions during market downturns.
2. Experimental Analysis: Added scripts/analyze_negative_scores.py, scripts/test_select_num.py, and scripts/ab_test_iterations.py.
3. Documentation: Created docs/strategy_evolution_report.md detailing the evolution from benchmark to the final 47% CAGR version.
4. Configuration: Finalized rotation.yaml with 11 core assets and optimal risk parameters.
2026-04-30 00:56:20 +08:00
63a100cef0
feat(config): finalize 11-asset global pool with cross-market diversification
...
标的池优化与分散化配置更新:
1. 最终标的池确立 (11 只):
- 精选 9 只原始核心标的 + 恒生科技 + 恒生指数。
- 相比全市场 43 只池子,精简后的池子大幅减少了 A 股细分行业的噪声干扰。
2. 关键参数调整:
- 开启 'diversified: true':强制跨大类(美股、港股、A股、商品、固收)选择 Top 1 标的。
- 启用 'weighted_momentum' 因子与 'auto_day' 动态周期。
- 放宽溢价率阈值至 10%,以适应跨境资产的高溢价常态。
回测影响分析:
- 引入恒生双指后,2022年回撤得到显著对冲(22.6% 正收益)。
- 跨大类分散化逻辑将最大回撤从 43 只池子时的 -33% 压缩至 -14.5%。
- 该配置在保持 20%+ 稳健年化的同时,提供了 1.5 以上的顶级夏普比率。
2026-04-30 00:14:55 +08:00
70bb69fd98
fix(core): 修复计算与数据对齐等多处逻辑问题
...
- 修正CAGR计算,去除NaN并检查起始值有效性以避免异常结果
- 优化混合数据源的数据对齐逻辑,使用配置结束日期与A股最新数据日期的较早者
- 计算因子时对齐A股交易日历,重新基于对齐价格计算日收益率,改进因子对齐准确度
- 轮动策略中跳过空信号,避免空信号影响持仓和调仓逻辑
- 调整信号处理,过滤空字符串和NaN,保证轮动信号数据有效性
- 多品种轮动持仓中加入空信号判断,避免无效信号导致错误
- 调整调仓明细和品种汇总保存逻辑,增加空文件创建以保证输出路径文件稳定生成
- 完善多处打印信息和注释,增强代码可读性与调试便利性
2026-03-26 22:21:38 +08:00
57939ce677
fix(rotation): 修正报告图表操作列的索引错误
...
- 将操作列索引从第8列调整为第11列(索引10)
- 保持不同操作对应的行背景色不变
- 修复因操作列索引错误导致的行着色问题
2026-03-26 21:23:55 +08:00
b7bf8c1eb4
fix(report): 修正溢价率计算逻辑为使用ETF收盘价替代净值
...
- 修改生成性能报告时溢价率计算逻辑,改用信号日期的ETF收盘价
- 溢价率仅在当天净值数据存在时计算,避免使用前一日数据
- 更新打印最新调仓信号函数,支持显示ETF收盘价而非净值
- 修改报告图表部分,显示ETF收盘价和对应溢价率
- 优化时间基准日期计算,使用信号日期或前一交易日作为数据基准
- 保持对跨市场ETF映射的兼容性和显示一致性
2026-03-26 01:27:04 +08:00
c196e33648
fix(report): 修复调仓信号报告中ETF代码显示与表格布局
...
- 在调仓信号表格中添加ETF代码列,完善持仓数据展示
- 处理ETF代码缺失情况,显示为“直接交易”
- 调整表格列宽,优化整体排版宽度
- 完善调入和调出持仓部分的ETF信息获取逻辑
2026-03-25 22:16:04 +08:00
e6ddea518c
feat(report): 支持ETF净值和溢价率的绩效报告展示
...
- 在生成绩效报告接口中新增code_config、index_data、etf_price_data和etf_nav_data_raw参数
- 计算溢价率并基于信号前一日数据进行校验和计算
- 打印最新调仓信号时增加ETF代码、ETF净值、溢价率及高溢价警告显示
- 调整信号数据基准日期展示,更准确反映信号计算依据
- 报告图表支持显示ETF净值和溢价率列,完善调仓信息视觉效果
- 统一处理跨市场ETF映射和特殊市场(如加密货币)情况,避免溢价率误报
- 完善打印表格和图表的列宽和格式,增强可读性
2026-03-25 22:02:05 +08:00
ec749314bc
feat(data-source): 支持指数-ETF双轨数据获取及因子计算
...
- 新增使用Tushare获取A股ETF价格及净值数据的私有方法
- fetch_all方法支持接收完整代码配置,区分指数与ETF及市场类别
- 指数数据和ETF数据分别下载,ETF净值数据用于溢价率计算
- 采用A股交易日为主交易日历,非A股数据前向填充对齐
- 调整因子计算,支持指数价格计算因子,ETF价格计算收益率
- run_rotation脚本和RotationStrategy引擎适配指数-ETF配置格式
- 代码结构优化,增强多市场及加密货币处理能力
2026-03-25 22:01:44 +08:00
6454e6823f
fix(datasource): 修正混合数据源导入路径错误
...
- 修正 strategies.rotation.engine 中 hybrid_source 模块导入路径错误
- 新增 core.datasource 目录下多个数据源实现模块
- 增加 Akshare 数据源支持 A股指数数据拉取
- 实现数据缓存管理机制,支持本地数据缓存读写
- 新增 YFinance 数据源,支持通过 SSH 隧道访问美股和港股数据
- 实现混合数据源支持 A股/Tushare、港美股/YFinance、加密货币/CCXT 的统一访问
- 集成 SSH 隧道管理,支持 SOCKS5 转 HTTP 代理转发
- 新增 socks2http.py 代理转发工具,解决 CCXT 仅支持 HTTP 代理问题
- 修改 rotation.yaml 加密货币注释,明确使用 OKX 现货和 SSH->HTTP 代理访问
- 删除.gitignore中无用的 data/ 忽略规则,保留 test/ 文件夹忽略规则
2026-03-25 01:32:33 +08:00
e26db9767f
fix(docker): 优化中文字体安装及清理缓存
...
- 将中文字体从 wqy-microhei 改为 wqy-zenhei,提高字体兼容性
- 清理 matplotlib 缓存文件,减少镜像体积
- 更新报告图表中文字体设置,兼容 macOS 和 Linux
- 简化字体配置,避免多余字体加载
2026-03-24 00:41:03 +08:00
029b5e7f60
style(rotation): 优化报告图表字体设置
...
- 英文字体改为 DejaVu Sans,中文字体设置为文泉驿微米黑和文泉驿正黑
- 取消原有的 Times New Roman 字体设置,避免中文显示问题
- 保持负号正常显示,优化图表整体字体效果
2026-03-20 19:00:35 +08:00
7cb89fa0e1
refactor(report): 优化报告中的字体和表头文本
...
- 将报告中表头 “品种名称” 修改为更精准的 “标的名称”
- 将报告图表的中文字体设置改为使用 Times New Roman 以统一字体样式
- 更新表格列标签中的对应文本,保持一致性
- 清理旧的字体配置,简化字体设置逻辑
2026-03-19 23:05:49 +08:00
fb2f814111
feat(docker): 优化镜像支持中文字体及调度运行模式
...
- 基础镜像中添加多款中文字体,支持中文显示
- 主镜像安装中文字体并设置上海时区环境变量
- Dockerfile中创建日志目录并修改默认启动命令为定时调用调度器脚本
- 构建脚本支持动态镜像名,自动构建基础镜像,完善运行容器示例
- docker-compose修改为仅启动调度器服务,挂载相关配置、密钥、数据和日志目录
- 依赖更新,丰富金融数据、技术分析、绘图、机器学习及环境变量支持库
- 调度脚本参数调整,支持立即运行并退出及非后台模式运行切换
- 报告绘图中优先使用基础镜像预装的中文字体配置,提高字体兼容性和显示效果
2026-03-19 22:53:06 +08:00
8d24fb91eb
refactor(scheduler): 重构每日任务调度逻辑并优化配置路径
...
- 将等待目标时间逻辑改为基于schedule库的定时任务调度
- 支持后台守护进程模式持续执行定时任务
- 优化命令行参数说明,默认执行时间改为15:30
- 简化立即执行和循环运行的逻辑
- 修改SSH私钥路径为相对于项目根目录
- 更新rotation.yaml配置中指数及加密货币标签说明
- 回测开始日期由2022-01-01调整为2020-01-01
refactor(report): 优化轮动策略绩效报告图表与指标展示
- 新增策略与基准绩效指标对比表格,展示累计收益、年化收益等关键指标
- 调整绩效表布局,增加绩效指标面板高度,保持与信号表格一致视觉
- 丰富绘图函数参数,支持传入绩效指标字典避免重复计算
- 规范调仓信号表操作列索引及样式,保持统一字体大小和行高
- 净值曲线、回撤及持仓分布面板分离,调整图表索引和标题名称
- 优化持仓分布图显示,提升整体报告信息完整性与易读性
2026-03-19 21:56:17 +08:00
9ea84f0e57
feat(rotation): 支持混合数据源并优化因子计算和策略逻辑
...
- 删除旧的Tushare Token环境变量函数,简化配置
- 在配置文件中新增全市场指数及SSH隧道配置支持YFinance数据访问
- 更新compute_factors函数,支持长格式混合数据源,兼容旧宽格式数据
- 修改RotationStrategy使用HybridDataSource,支持Tushare与YFinance数据源混合
- 添加SSH隧道支持,实现安全访问非主市场数据
- 优化因子计算逻辑,提升缺失值处理和因子合并的鲁棒性
- 修正基准净值计算,兼容长宽格式基准数据处理
- 增强信号生成逻辑,处理因子得分中的NaN情况防止异常
2026-03-19 20:38:13 +08:00
062f500369
refactor(rotation): 统一与配置文件代码映射和基准指数使用方式
...
- 将默认代码映射字典和基准指数改为可被策略配置覆盖的形式
- 修改配置文件rotation.yaml中候选池配置从列表变为代码与名称的字典映射
- 在运行脚本中加载配置时支持字典格式的code_list和benchmark,兼容旧格式列表
- 更新回测策略引擎通过配置动态获取基准指数代码
- 打印输出和函数调用中统一使用从配置加载的代码映射和基准名称数据
2026-03-19 00:33:06 +08:00
9b154a1a25
feat(rotation): 增加最新调仓信号展示功能
...
- 配置中取消固定end_date,改为默认使用当前日期
- 添加打印最新调仓信号的功能,显示持仓明细及调出品种
- 在报告生成流程中调用最新调仓信号打印函数
- 图表展示中新增最新调仓信号表格,支持颜色区分调入、调出和维持
- 优化报告图表布局,调整画布高度适应信号表内容
- 删除无用test.py测试脚本及相关冗余代码
2026-03-19 00:22:25 +08:00
988c2335fb
chore(config): 添加环境变量示例及.gitignore更新
...
- 新增 .env.example,包含 Tushare API、钉钉机器人和PostgreSQL数据库配置模板
- 更新.gitignore,忽略本地配置文件如 .env.local 和 config_local.py
- 添加对报表文件命名规则的支持,保留示例文件不忽略
- 删除废弃的 chart.py 及相关图表模块代码
- 新增 config/settings.py,实现从环境变量读取配置的统一接口
- 设置数据目录及缓存目录,确保目录存在,提高配置管理规范性
2026-03-18 23:33:40 +08:00