796a695eef
feat(factors): 实现因子层抽象
...
核心组件:
- FactorBase: 因子抽象基类(compute方法 + 数据验证)
- FactorRegistry: 因子注册器(注册/获取/按类别筛选)
- FactorCombiner: 因子组合器(加权组合4种方法)
已实现因子:
- MomentumFactor: 加权动量因子(含崩盘过滤)
- TrendFactor: 趋势因子(MA交叉/MACD)
- ReversalFactor: 反转因子(RSI/KDJ)
- VolatilityFactor: 波动率因子(ATR/标准差)
测试覆盖:18个测试全部通过
2026-05-11 22:17:53 +08:00
c54ba442ad
docs: 添加策略框架调研与设计方案
...
包含4份核心文档:
- 轮动策略系统架构分析报告
- 量化策略通用框架抽象设计
- Freqtrade架构调研与对比分析
- ETF轮动策略通用化重构方案
调研结论:三种策略可抽象通用框架
设计决策:因子注册器风格 + 5个核心回调钩子 + TopN/Trend/Reversal信号生成器
2026-05-11 22:17:41 +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
8f1d72d1d8
fix(report): HTML报告文件名固定为strategy_report.html
...
修改内容:
- visualization/report_generator/generate_report.py
- 移除日期时间后缀,固定输出文件名为 strategy_report.html
- 方便用户快速访问和更新报告
效果:
- 每次生成报告都覆盖同一文件
- 文件路径固定: reports/strategy_report.html
- 无需查找最新的时间戳文件
2026-05-08 22:38:16 +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
5c87bea4fc
fix(visualization): 修复净值计算逻辑,与轮动策略结果对齐
...
问题:
- HTML报告错误地将所有品种持仓收益简单累加
- 没有考虑仓位占比权重
- 导致净值曲线和KPI指标与策略实际结果不一致
修复:
- 使用出场净值和仓位占比计算每日组合净值
- 净值 = sum(出场净值 * 仓位占比)
- 总收益 = (最终净值 - 初始净值) / 初始净值 * 100
- 月度收益使用净值变化率计算
- 最大回撤基于真实净值曲线计算
- 胜率基于每日净值涨跌计算
- 修复pandas FutureWarning警告
现在HTML报告的净值曲线、收益指标与轮动策略完全一致
2026-05-08 22:17:47 +08:00
4d784f961a
feat(visualization): 添加策略报告生成器
...
- 创建 visualization/report_generator 模块
- 支持生成精美的 HTML 策略报告
- 包含8个 KPI 指标卡片(收益、胜率、夏普比等)
- 集成 ECharts 交互式图表(净值曲线、月度收益、盈亏分布)
- 支持按日期和品种筛选调仓记录
- 使用 Jinja2 模板引擎 + Bootstrap 5 样式
- 支持打印为 PDF
- 提供 CLI 和 Python API 两种使用方式
2026-05-08 22:06:40 +08:00
519a4144e6
chore: 移除 Streamlit 可视化应用
...
- 删除 streamlit_app.py
- 删除 dashboard_app.py
- 删除 requirements_streamlit.txt
- 删除 start_streamlit.sh
2026-05-08 21:20:48 +08:00
d47a29f09e
feat(viz): 添加 Streamlit 可视化应用
...
- 创建 streamlit_app.py: 交互式回测结果展示
- 支持4个标签页:策略概览、收益分析、调仓记录、品种详情
- 集成 Plotly 图表:收益对比、胜率散点图、月度收益、收益分布
- 支持数据筛选和导出功能
- 添加启动脚本和依赖文件
2026-05-08 20:56:38 +08:00
a539a7d096
fix(api): 修复缓存状态判断逻辑
...
- fetch_data_with_ttl 返回 (data, is_cached) 元组
- 修复 cached 字段始终为 false 的问题
- 批量接口适配新的返回格式
2026-05-07 23:57:19 +08:00
7cf20268cf
feat(api): 为美股/港股数据添加 stock info 信息
...
- 在 universal_fetcher._fetch_yfinance 中获取公司信息
- 包含 sector、industry、market_cap 字段
- 将信息存储在 DataFrame.attrs 中
- Flask API 自动提取并返回 info 字段
2026-05-07 23:45:00 +08:00
270f4fe7f4
fix(api): 修复 JSON 序列化错误
...
- 支持多种日期列名(date, Date, index, trade_date, datetime)
- 添加对 Timestamp 对象的递归转换
- 修复 yfinance 返回数据中的 Timestamp 序列化问题
2026-05-07 23:36:10 +08:00
be12686f13
config(cache): 将默认缓存TTL从5分钟调整为2小时
...
- CACHE_TTL_SECONDS 默认值从 300s (5分钟) 改为 7200s (2小时)
- 适合日线数据场景,减少重复请求
2026-05-07 23:30:47 +08:00
b4a45e479f
feat(api): 使用 functools.lru_cache 实现数据缓存
...
- 使用 Python 标准库 functools.lru_cache 实现 LRU 缓存
- 添加 TTL 机制实现缓存过期(默认5分钟)
- 双缓存机制:LRU + TTL 结合
- 支持环境变量配置:CACHE_MAXSIZE(默认128)、CACHE_TTL_SECONDS(默认300)
- 新增缓存管理端点:
- POST /api/v1/cache/clear - 清理缓存
- GET /api/v1/cache/stats - 查看缓存统计(hits/misses/maxsize/currsize)
- /api/v1/ohlcv 支持 nocache 参数跳过缓存
- 批量接口自动使用缓存
- 响应中包含 cached 字段标识缓存状态
- 更新 API 版本到 1.1.0
2026-05-07 23:23:06 +08:00
d703974c5b
feat(api): 为 Flask 服务添加内存缓存机制
...
- 添加内存缓存,默认TTL 5分钟(可通过 CACHE_TTL_SECONDS 环境变量配置)
- 新增缓存相关端点:
- POST /api/v1/cache/clear - 清理缓存
- GET /api/v1/cache/stats - 缓存统计信息
- /api/v1/ohlcv 支持 nocache 参数跳过缓存
- 响应中返回 cached 字段标识是否命中缓存
- 更新 API 文档和版本号到 1.1.0
- 删除不需要的 build-flask-and-push.sh 和 docker-compose.flask.yml
2026-05-07 23:12:32 +08:00
ae4cf5d3c8
build: 添加 Flask 服务构建脚本
...
- 新增 build-flask-and-push.sh:一键构建和推送 Flask API 镜像
- 支持自定义镜像名称和标签
- 自动检查基础镜像、构建、打标签、推送
- 提供运行示例和测试命令
2026-05-07 22:15:17 +08:00
18a1b2b01f
feat(docker): 添加 Flask API 服务容器化配置
...
- 更新 requirements.txt 添加 flask 和 flask-cors 依赖
- 新增 Dockerfile.flask:Flask API 服务专用镜像
- 新增 docker-compose.flask.yml:支持 docker-compose 部署
- 配置健康检查、资源限制、环境变量映射
- 支持 SSH 隧道配置通过环境变量注入
2026-05-07 22:15:10 +08:00
0e531a1876
docs: 添加完整项目文档
...
- universal_fetcher_README.md:统一数据获取接口完整文档
- universal_fetcher_QUICKSTART.md:5分钟快速上手指南
- universal_fetcher_ARCHITECTURE.md:架构设计说明
- universal_fetcher_TEST_REPORT.md:测试报告与修复记录
- flask_api_README.md:Flask API 完整文档
- FLASK_SERVICE_SUMMARY.md:项目实现总结
总计 2000+ 行文档,涵盖 API 说明、使用示例、架构设计
2026-05-07 21:20:03 +08:00
cc2f7cb6c8
docs(examples): 添加 Flask API 客户端示例
...
- 新增 flask_api_client.py:DataFetcherClient 类封装
- 提供健康检查、资产类型检测、单只/批量数据获取方法
- 包含命令行调用示例和 DataFrame 转换示例
- 新增 universal_fetcher_examples.py:7个完整使用示例
- 涵盖基础用法、资产检测、批量获取、跨市场分析、技术指标
2026-05-07 21:19:52 +08:00
fbaa3f9d73
test: 添加 UniversalDataFetcher 和 Flask API 测试
...
- 新增 test_universal_fetcher.py:资产类型检测、单只/批量获取、边界测试
- 新增 test_ssh_tunnel.py:SSH 隧道连接、港美股数据获取、混合市场测试
- 新增 test_flask_api.py:API 端点测试、健康检查、批量获取测试
- 所有测试已通过验证(A股100%,SSH隧道港美股正常)
2026-05-07 21:19:37 +08:00
8b2c2be6f3
feat(api): 实现 Flask RESTful API 数据服务
...
- 新增 Flask 服务提供统一 HTTP 接口
- 支持 6 个 API 端点:health、asset-type、ohlcv、batch、supported-codes
- 集成 SSH 隧道自动管理(环境变量配置)
- 提供一键启动脚本 start_flask_server.sh
- 支持 CORS 跨域访问
- 完善的错误处理和响应格式化
2026-05-07 21:19:29 +08:00
e319426c10
feat(datasource): 实现统一数据获取接口 UniversalDataFetcher
...
- 新增 AssetTypeDetector 自动识别8种资产类型
- 支持 A股指数/ETF/股票、港股、美股、期货、加密货币
- 自动路由到 Tushare/YFinance/CCXT 数据源
- 集成 SSH 隧道支持港美股数据获取
- 提供便捷函数 fetch_kline 和 detect_asset_type
- 修复资产类型检测边界情况(.CSI后缀、000001股票等)
2026-05-07 21:19:19 +08:00
9776ae7de0
test(experiments): add France CAC40 and SEA ETF experiments
...
- Add France CAC40 market test (004)
- Add SEA ETF limited test (005)
- Add France in EU category test (006)
- Update experiment README with new results
- Modify emerging market test description
2026-05-06 22:23:12 +08:00
17e806045f
experiment(rotation): 添加新兴市场大类(印度)影响验证
...
实验设计:
- A组:当前7大类配置(无新兴市场)
- B组:添加印度作为第8大类(EM = Emerging Market)
- 标的:^NSEI → 164824.SZ(工银瑞信印度市场LOF)
实验结果:
├─ 大类数量: 7 → 8 (+1) ✓ 跨类分散提升
├─ 累计收益: 1467.35% → 1261.83% (-205.52%)
├─ CAGR: 48.10% → 45.16% (-2.94%)
├─ Sharpe: 2.21 → 2.09 (-0.11)
├─ 日胜率: 56.45% → 57.25% (+0.80%) ✓
└─ 调仓次数: 459 → 451 (-8)
核心发现:
1. 大类数量增加确实提升跨类分散
2. 但收益反而下降205%(与预期相反)
3. 印度LOF流动性不足(日均~3000万)
4. 印度动量信号不如主流市场强
5. Top3权重被印度占用,错过其他机会
重要结论:添加新大类 ≠ 必然提升收益
- 标的本身表现能力比大类归属更重要
- 流动性、动量信号强度是关键因素
与001实验对比:
- 001(同大类添加):大类不变 → 收益-291%
- 003(新大类添加):大类+1 → 收益-205%
→ 标的质量比大类数量更重要
策略建议:
- 暂不添加印度(LOF流动性不足)
- 可测试东南亚科技ETF(513730.SH)
新增文件:
- tests/experiments/ab_test_emerging_market.py
- docs/experiments/003_emerging_market_india.md
2026-05-06 20:55:54 +08:00
6b59855c28
experiment(rotation): 同大类扩充与纳指vs标普替换对比实验
...
技术修复:
- SOCKS5代理IPv6问题:socks5:// → socks5h:// (hybrid_source.py, yfinance_source.py)
目录整理:
- scripts/ → 仅保留策略入口(daily_scheduler, run_rotation, run_cci_screener)
- 实验脚本移至 tests/experiments/
- 工具脚本移至 tests/utils/
- 实验记录新增 docs/experiments/
- results/ 添加到 gitignore
实验结果:
实验001 - 同大类扩充(添加标普500):
├─ 累计收益: 1467.35% → 1176.26% (-291%)
├─ CAGR: 48.10% → 43.82% (-4.28%)
├─ 调仓次数: 459 → 501 (+42次)
└─ 结论: 添加同大类标的不增加跨类分散,反而侵蚀收益
实验002 - 纳指vs标普替换对比:
├─ 累计收益: 1467.35% → 1118.77% (-348%)
├─ CAGR: 48.10% → 42.87% (-5.22%)
├─ Sharpe: 2.21 → 2.08 (-0.13)
├─ MaxDD: -17.33% → -15.14% (+2.18%)
└─ 结论: 纳指100优于标普500,成长风格更适合动量策略
策略建议:
- 保持纳指100作为美股大类代表
- 不添加同大类新标的(避免类内切换成本)
- 新增标的应优先考虑新大类(增加跨类分散)
2026-05-06 20:43:38 +08:00
a4e8a6050e
docs: 跨市场动量策略有效性度量与资产组合优化文献综述
...
核心内容:
- 相关性结构:资产相关性低(ρ≈0.3),但动量收益相关性较高(ρ≈0.5)
Moskowitz发现动量因子跨资产共同驱动
- 跨市场有效性度量框架(三层体系):
Layer1定性:地理差异+资产类别+周期敏感度(0-9分)
Layer2定量:分散化有效性指数DEI=(1-ρ)/(1+ρ)
Layer3组合:综合评分Σw_i w_j Q_ij D_ij
- 选择偏差风险:池选择偏差=基于后视信息选池
本策略恒生科技/铜存在中等偏差风险,建议随机池对照实验
- 高波动池机制:Conrad-Kaul风险补偿理论
高波动→高动量收益(部分补偿+部分异象)
- 业界最佳实践:
Bridgewater All Weather经济四季框架(增长/通胀四象限)
AQR Risk Parity波动率倒数加权(风险平衡而非市值权重)
- 分散化收益公式:DR=Σwσ/σ_p,本策略≈14%
- 改进建议:
增加债券标的(Risk Parity权重应高)
减少A股同类冗余(创业板vs红利低波DEI=0.18)
显式计算风险贡献而非等权
参考文献:
- Conrad & Kaul(1998)风险补偿理论
- Moskowitz et al.(2012)跨资产动量相关性
- AQR Risk Parity白皮书
- Bridgewater All Weather故事
- CFA资产配置原则
附录:5个核心公式+改进建议清单
2026-04-30 21:59:40 +08:00
336bceef92
docs: 基于动量因子的跨市场ETF轮动策略系统性文献综述
...
文献综述内容:
- 学术定位:资产定价、资产配置、量化投资、行为金融学、组合管理五大交叉领域
- 理论基础:Jegadeesh-Titman(1993)动量效应发现 + Barberis等(1998)行为金融解释
- 经典文献:截面动量、时间序列动量(Moskowitz 2012)、跨资产动量普遍性(Asness 2013)
- 实证证据:动量效应在股票/债券/商品/外汇等所有资产类别中显著
- 分散化依据:Markowitz(1952) MPT理论,跨大类资产低相关性降低组合波动
- 崩盘风险:Barroso-Santa-Clara(2015)动量崩盘现象与风险管理方法
- 待解决问题:动量起源之谜、因子标准化、动态窗口机制、因子衰减
- 中国A股:短期动量(1-3月)有效、行业轮动频繁、残差动量2024年表现优越
参考文献:
- 10篇经典学术论文(Jegadeesh-Titman, Moskowitz, Asness, Barberis等)
- 业界策略报告(AQR, QuantPedia, Robeco)
- 券商金工研报(华泰、东方、招商)
附录:动量因子公式对比 + 本策略V2配置摘要
2026-04-30 14:27:23 +08:00
48ff15d92a
docs: 新增轮动策略核心逻辑V2文档
...
V2相对于V1的核心升级:
- 候选池: 22只(以A股行业为主) → 11只(全球7大类精选)
- 因子类型: slope_r2(等权回归) → weighted_momentum(加权回归,近期权重2.0)
- 选股模式: 纯Top5 → 跨大类分散化(每大类Top1→全局Top3,等权33%)
- 崩盘过滤: 无 → 有(连续3天跌>5%得分清零)
- 商品信号源: 指数价格 → 期货价格(AU.SHF/CL.NYM/CU.SHF)
- 加密货币: 保留 → 移除(全部使用A股场内ETF交易)
V2实证数据(2019-02~2026-04):
累计收益1473%, CAGR 46.42%, Sharpe 2.22, MaxDD -17.33%, Calmar 2.68
diversified=true全面优于false(2022年差异+17.63%)
文档包含完整配置清单、因子计算公式、分散化选股机制、
调仓控制逻辑、溢价率控制、跨市场数据对齐方案、V1 vs V2对比表
2026-04-30 13:49:42 +08:00
5cf5bfc7d6
chore: 清理根目录已迁移到docs/的旧md文件
2026-04-30 13:41:13 +08:00
d0a9d66a11
feat(config): 添加CU.SHF有色金属期货信号源,移除冗余上证红利
...
讨论背景:
- 159980.SZ(有色ETF)是商品型基金,跟踪上期所有色金属期货价格指数
- 应使用期货价格(CU.SHF沪铜)作为信号源,与黄金(AU.SHF)/原油(CL.NYM)保持一致
- 上证红利(000015.SH)与中证红利低波(H30269.CSI)高度相关,同属A股大类
在diversified模式下只能选1个,保留两个无实际意义
配置变更:
- rotation.yaml: 新增CU.SHF→159980.SZ映射(market=COMMODITY)
- rotation.yaml: 移除000015.SH上证红利(与红利低波冗余)
- hybrid_source.py: FUTURES_CODE_MAP新增CU.SHF铜期货
- ab_test_iterations.py: 同步更新有色market为COMMODITY
实证结果 - CU.SHF加入前后对比(11只池,2019-2026):
无CU(11只): CAGR=47.37%, Sharpe=2.25, MaxDD=-17.86%, Calmar=2.65
含CU(12只): CAGR=46.16%, Sharpe=2.21, MaxDD=-17.86%, Calmar=2.58
影响: CAGR-1.2%, 商品大类内部竞争加剧(黄金/原油/有色三选一)
2020/2022铜价暴涨时有色贡献额外收益,整体影响很小
实证结果 - 移除上证红利后(11只,2019-2026):
含上证红利: CAGR=46.16%, Sharpe=2.21, MaxDD=-17.86%, Calmar=2.58
移除后: CAGR=46.42%, Sharpe=2.22, MaxDD=-17.33%, Calmar=2.68
所有指标均改善,消除冗余标的提升选择效率
实证结果 - diversified=true vs false(11只,select_num=3):
true(跨类分散): CAGR=46.45%, Sharpe=2.22, MaxDD=-17.33%, Calmar=2.68
false(纯Top3): CAGR=44.19%, Sharpe=2.13, MaxDD=-18.12%, Calmar=2.44
关键差异在2022年(+17.63%): false模式选3只商品同时回调
结论: diversified=true全面优于false,保持当前配置
最终候选池(11只,7大类):
A股: 创业板(399006.SZ), 红利低波(H30269.CSI)
美股: 纳指100(NDX) | 日本: 日经225(N225) | 欧洲: 德国DAX(GDAXI)
港股: 恒生指数(HSI), 恒生科技(HSTECH.HK)
商品: 黄金(AU.SHF), 原油(CL.NYM), 有色金属(CU.SHF)
固收: 30年国债(931862.CSI)
2026-04-30 13:37:46 +08:00
4df3ac4e31
chore(docs): reorganize documentation files into docs/ folder
...
Moved markdown documentation from root to docs/ directory to improve project structure.
2026-04-30 01:06:25 +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
e946dbe804
docs(experiment): add experimental backtest script and pool analysis
...
实验与分析文档补充:
1. 脚本: scripts/full_pool_top3_backtest.py
- 用于快速测试不同标的池组合的脚本。
- 支持跨大类 Top 1 逻辑的独立验证。
2. 文档: data_logic_analysis.md
- 记录了从 43 只全市场池精简到 11 只核心池的逻辑推演。
- 详细对比了“相关性管理”对回撤的影响数据。
2026-04-30 00:15:21 +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
48cd6dd524
docs(analysis): ETF轮动策略深度分析报告
...
包含:
- 收益归因分析: 高收益来源拆解、持仓分布、事件日历
- 选池偏差实验: 原始4只 vs 扩展9只 vs 反面池对比
- 后视镜偏差量化: 选池偏差仅贡献5-7% CAGR
- A股可交易全球资产完整候选池: 44个方向/5大类
- 关键结论: ETF价格优先于指数、未来预期CAGR区间
2026-04-29 22:51:15 +08:00
eb6a07548c
feat(全球市场): 迁移聚宽策略为Tushare独立回测版本
...
从聚宽平台迁移全球市场ETF轮动策略,复用动量.py核心模块。ETF池: 纳指100/日经225/德国DAX/黄金/有色金属/南方原油/30年国债/红利低波/创业板。回测(2019~2026): CAGR=44.29%, Sharpe=1.50, MaxDD=-16.93%, Calmar=2.62, 盈利年份8/8, 跑赢基准7/8
2026-04-29 22:20:13 +08:00
2829f80427
feat(backtest): 消除前视偏差,实现动态ETF池重建
...
消除回测前视偏差(Look-Ahead Bias):
- 新增 ETFDataCache 本地缓存系统,预下载全量ETF(含已退市)基础信息和日线数据
- 改造 ETFUniverseBuilder 支持纯历史模式,每个时间点只使用当时可获得的数据
- 动量.py 新增 dynamic 模式,回测中每60交易日动态重建ETF候选池
- momentum_experiment.py 同步支持动态重建
- 新增 ETF筛选引擎文档和动态池方案文档
无前视偏差实验结果(6组对比,2015-2026):
A: 全仓1只 CAGR=3.32%, MaxDD=-63.19%, Sharpe=0.26
B: 等权3只 CAGR=3.40%, MaxDD=-49.72%, Sharpe=0.30 ← 最优
C: 反波动率3只 CAGR=1.73%, MaxDD=-38.59%, Sharpe=0.21
D: 等权5只 CAGR=2.77%, MaxDD=-42.39%, Sharpe=0.29
E: 反波动率5只 CAGR=-0.37%, MaxDD=-19.56%, Sharpe=-0.03
F: 动量>0全选等权 CAGR=2.02%, MaxDD=-43.27%, Sharpe=0.24
最优方案: B(等权3只)夏普、Calmar、CAGR三项均最高
2026-04-29 22:15:01 +08:00
e301a08724
注释加密货币(BTC/ETH)并新增回测数据导出脚本
...
变更内容:
- rotation.yaml: 注释掉BTC和ETH加密货币配置,候选池从22只缩减为20只
- 新增 scripts/export_rotation_data.py: 导出回测原始数据到本地文件夹
回测结果 (2020-02-14 ~ 2026-04-28, 20只标的, 无加密货币):
- 累计收益: 171.36% (基准沪深300: 20.16%)
- CAGR(年化): 17.48% (基准: 2.89%)
- 年化夏普比率: 0.90 (基准: 0.26)
- 最大回撤: -30.85% (基准: -45.60%)
- Calmar比率: 0.57
- 日胜率: 52.49%
- 调仓次数: 478次 (年均80次, 平均持仓3.1天)
2026-04-28 20:28:35 +08:00
4a500ca5bf
feat(notify): 支持钉钉多群推送 & 添加轮动策略核心逻辑文档
...
- settings.py: 新增 get_all_dingtalk_configs() 自动扫描所有钉钉群配置
- notify.py: 新增 send_to_all_groups() 多群推送函数
- daily_scheduler.py: 报告和错误通知改用多群推送
- .env: 添加第二个钉钉群配置 (DINGTALK_WEBHOOK_2/SECRET_2)
- 轮动策略核心逻辑.md: 策略核心逻辑总结文档
2026-04-23 22:58:16 +08:00
3cca4d79c4
chore: 忽略知乎文章下载目录 zhihu-articles/
2026-04-09 11:45:40 +08:00
3530e05875
docs: 新增动量时间窗口选择调研报告
...
- 综合 arXiv 学术论文与 A 股实证研究,分析最优动量窗口
- 核心发现:25日窗口偏短,最优区间为60-240日
- 动态窗口选择(DMS)可提升Sharpe 52%,回撤减半
- 提供三阶段优化方案:多窗口等权 → 动态选择 → 经济周期自适应
2026-04-09 11:27:24 +08:00
9096d933a3
refactor(config): 更新创业板指中的红利ETF配置
...
- 将中证红利(000922.CSI)替换为上证红利(000015.SH)
- 更新对应的ETF代码为510880.SH,注释同步调整
- 保持市场标识为"A"不变
2026-03-27 22:46:01 +08:00
e7dca3fec8
fix(core): 修正中国A股指数判断逻辑及更新指数配置
...
- 在中国A股指数判断中增加对中证指数(.CSI)的支持
- 替换创业板指配置中的红利指数代码和对应ETF信息
- 更新中证银行ETF代码为最新的华宝银行ETF编码
2026-03-27 22:37:41 +08:00
70bb69fd98
fix(core): 修复计算与数据对齐等多处逻辑问题
...
- 修正CAGR计算,去除NaN并检查起始值有效性以避免异常结果
- 优化混合数据源的数据对齐逻辑,使用配置结束日期与A股最新数据日期的较早者
- 计算因子时对齐A股交易日历,重新基于对齐价格计算日收益率,改进因子对齐准确度
- 轮动策略中跳过空信号,避免空信号影响持仓和调仓逻辑
- 调整信号处理,过滤空字符串和NaN,保证轮动信号数据有效性
- 多品种轮动持仓中加入空信号判断,避免无效信号导致错误
- 调整调仓明细和品种汇总保存逻辑,增加空文件创建以保证输出路径文件稳定生成
- 完善多处打印信息和注释,增强代码可读性与调试便利性
2026-03-26 22:21:38 +08:00
2faea1517f
chore(deps): 更新HTTP请求相关依赖
...
- 在requests依赖中添加对socks的支持
- 新增pysocks依赖以支持socks代理
- 保持了requests和urllib3的最低版本要求不变
2026-03-26 22:21:15 +08:00
57939ce677
fix(rotation): 修正报告图表操作列的索引错误
...
- 将操作列索引从第8列调整为第11列(索引10)
- 保持不同操作对应的行背景色不变
- 修复因操作列索引错误导致的行着色问题
2026-03-26 21:23:55 +08:00
4b8e1dbec6
fix(build): 修复基础镜像存在性检查及构建逻辑
...
- 使用docker images --format精确匹配镜像名称和标签
- 修正基础镜像检查条件,确保检测index-base:latest
- 添加未找到Dockerfile_base时的脚本退出逻辑
- 优化基础镜像构建流程提示信息
2026-03-26 21:23:21 +08:00
091ee05e58
chore(docker): 优化Dockerfile_base镜像构建配置
...
- 更换阿里云镜像源提升apt-get安装速度
- 新增openssh-client和autossh系统依赖
- 所有apt-get操作后统一清理缓存
- Playwright依赖安装使用阿里云源镜像
- 安装中文字体时允许失败不影响构建
- 保持时区配置为Asia/Shanghai
- 安装Playwright chromium浏览器版本一致
2026-03-26 21:21:59 +08:00