Commit Graph

22 Commits

Author SHA1 Message Date
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
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
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
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
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
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
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
5f4470d53e fix(datasource): 修正数据日期对齐与复权问题
- 修改yfinance获取历史数据时end_date加一天,auto_adjust设置为False,以获取不复权价格
- 调整ETF净值数据获取时end_date加一天,解决净值数据滞后问题
- 数据对齐策略改为以A股最新数据日期为基准,调整交易日历范围
- 移除对非A股数据的前向/后向填充,保持原始价格数据不填充
- ETF净值数据重新索引到A股交易日但不做缺失值填充,保持NaN以表示无数据
- 增加打印输出辅助调试数据日期及交易日信息
2026-03-26 01:26:43 +08:00
ec9c808e6c refactor(momentum): 优化因子计算流程并对齐A股交易日历
- 添加辅助函数判断是否为A股指数
- 调整compute_factors函数结构,分别计算每个标的技术指标
- 严格实现T+1规则,确保信号只用T日及以前数据
- 对齐所有数据到A股交易日历,使用前向填充避免未来数据泄漏
- 增加有效代码有效性检查,剔除数据不足或缺失率过高的标的
- 完善函数注释,明确输入输出及核心逻辑说明
- 优化打印信息,清晰展示因子类型、窗口、有效标的及时间范围
2026-03-26 01:26:14 +08:00
e4a5845916 feat(datasource): 添加期货数据支持及优化数据对齐逻辑
- 新增期货代码映射及判断函数,支持上海期货交易所黄金主力合约
- 实现通过Tushare接口获取期货日线数据,包含夜盘数据处理
- fetch_single方法新增期货数据的调用逻辑
- 细化标的分类,将期货单独列出用于数据处理和日志输出
- 强制从Tushare获取A股交易日历,确保数据对齐的准确性
- 优化各类标的对齐逻辑,区别处理港股美股、加密货币与期货的前后向填充
- 统一ETF和基准数据对齐到A股交易日,改进数据一致性和完整性
2026-03-26 00:06:26 +08:00
b7478bf2ef fix(datasource): 修正非A股指数前向填充逻辑
- 将前向填充范围扩大至所有非A股指数
- 说明所有市场(港股、美股、黄金、加密货币)在T+1日09:00前已收盘
- 保障数据针对多市场的时效性和完整性
2026-03-25 22:25:48 +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
098c13a006 feat(notification): 增加钉钉发送图片和文件功能,支持OSS图片上传
- 在DingTalkBot中添加发送图片消息(自动压缩)功能,支持大小限制自动处理
- 添加发送图文混合消息、发送文件消息接口,优化钉钉通知能力
- 实现发送本地图片链接和通过OSS上传图片再发送Markdown图文两种机制
- 新增阿里云OSS上传工具模块,支持文件和图片上传及预签名URL生成
- 创建每日任务调度脚本,实现每日交易日检查、策略执行、结果上传并通知
- 调整回测策略开始日期至2022年,适配最新数据范围
2026-03-19 21:21:52 +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
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