
shuo-hugeandClaude Fable 5
2f7a4b0979
feat(strategy): 策略可读取指数/ETF日K (market_data 模块 + 白名单 + 测试)
Custom/AI 策略此前被沙箱隔离, filter_history(df, params) 只能拿到个股历史窗口,
无法读取指数K线, 也就做不了「大盘指数 MACD 死叉」这类市场级过滤。
本改动新增框架侧受信模块 backend/app/strategy/market_data.py, 暴露只读纯函数:
- get_index_daily / get_etf_daily: 读取指数/ETF 日K(含技术指标, 支持列下推)
- get_daily: 按 repo.resolve_asset_type 自动分派(指数/ETF/股票)
- list_index_symbols: 枚举已收录指数
模块线程安全懒加载 repo (DataStore() 默认 settings.data_dir, 与 main.py 同源),
未知 symbol/缺数据返回空 DataFrame 不抛; 不向策略暴露文件访问或写能力。
ai_generator._ALLOWED_IMPORT_MODULES 放行 "app.strategy.market_data",
使 AI 生成与磁盘 Custom 策略均可 import 该模块; 其余模块/危险调用照旧拦截。
附 9 项框架级测试: 白名单放行/拦截、注入 fake repo 后委托与日期规范化、
按资产类型分派、坏 symbol/缺数据返回空、list_index_symbols。对既有策略零影响。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-26 09:36:06 +08:00
..
2026-08-22 20:57:40 +08:00
2026-08-21 17:41:35 +08:00
2026-07-18 18:31:02 +08:00
2026-08-24 17:14:39 +08:00
2026-08-13 20:16:02 +08:00
2026-08-05 17:56:27 +08:00
2026-07-12 13:52:49 +08:00
2026-08-23 12:34:40 +08:00
2026-08-02 10:56:03 +08:00
2026-08-02 10:56:03 +08:00
2026-08-02 10:56:03 +08:00
2026-08-05 17:56:27 +08:00
2026-08-23 19:36:00 +08:00
2026-07-25 22:51:27 +08:00
2026-08-24 17:14:55 +08:00
2026-08-24 14:21:55 +08:00
2026-07-26 18:35:31 +08:00
2026-08-23 19:13:03 +08:00
2026-08-23 19:12:57 +08:00
2026-08-16 23:39:07 +08:00
2026-07-08 13:42:53 +08:00
2026-07-15 21:34:44 +08:00
2026-08-23 19:13:03 +08:00
2026-08-16 23:39:07 +08:00
2026-08-16 23:39:07 +08:00
2026-08-16 23:39:07 +08:00
2026-07-18 00:49:28 +08:00
2026-07-16 14:34:07 +08:00
2026-07-31 19:56:33 +08:00
2026-08-13 20:16:02 +08:00
2026-08-16 23:39:07 +08:00
2026-07-19 16:42:03 +08:00
2026-08-16 23:39:07 +08:00
2026-08-24 14:21:38 +08:00
2026-08-16 23:39:07 +08:00
2026-08-16 23:39:07 +08:00
2026-07-16 12:17:27 +08:00
2026-08-16 23:39:07 +08:00
2026-07-31 19:38:36 +08:00
2026-07-26 19:59:10 +08:00
2026-08-23 14:57:12 +08:00
2026-08-16 23:39:07 +08:00
2026-08-16 23:39:07 +08:00
2026-08-16 23:39:07 +08:00
2026-07-18 00:49:28 +08:00
2026-07-28 09:46:51 +08:00
2026-08-16 23:39:07 +08:00
2026-08-24 17:14:48 +08:00
2026-08-16 23:39:07 +08:00
2026-08-23 17:46:54 +08:00
2026-08-16 23:39:07 +08:00
2026-08-16 23:39:07 +08:00
2026-08-16 23:39:07 +08:00
2026-08-16 23:39:07 +08:00
2026-08-16 23:39:07 +08:00
2026-08-16 23:39:07 +08:00
2026-08-16 23:39:07 +08:00
2026-08-16 23:39:07 +08:00
2026-08-16 23:39:07 +08:00
2026-08-10 23:32:44 +08:00
2026-07-08 12:12:29 +08:00
2026-08-22 20:26:34 +08:00
2026-07-28 21:13:10 +08:00
2026-08-16 23:39:07 +08:00
2026-07-09 17:38:44 +08:00
2026-08-05 17:57:05 +08:00
2026-08-16 23:39:07 +08:00
2026-08-16 23:39:07 +08:00
2026-07-19 09:36:55 +08:00
2026-07-19 10:06:26 +08:00
2026-07-28 21:13:10 +08:00
2026-08-16 23:39:07 +08:00
2026-07-19 10:06:26 +08:00
2026-07-30 13:09:07 +08:00
2026-08-16 23:39:07 +08:00
2026-08-17 16:49:28 +08:00
2026-08-16 23:39:07 +08:00
2026-07-26 18:35:31 +08:00
2026-08-16 23:39:07 +08:00
2026-07-20 13:01:03 +08:00
2026-07-16 12:17:27 +08:00
2026-08-06 19:28:39 +08:00
2026-08-16 23:39:07 +08:00
2026-08-16 23:39:07 +08:00
2026-07-26 18:35:31 +08:00
2026-07-08 14:19:52 +08:00
2026-08-13 20:16:02 +08:00
2026-07-20 13:01:03 +08:00
2026-08-23 19:29:44 +08:00
2026-07-22 11:21:13 +08:00
2026-08-13 20:16:02 +08:00
2026-08-26 09:36:06 +08:00
2026-08-13 20:16:02 +08:00
2026-08-13 20:16:02 +08:00
2026-07-16 12:17:27 +08:00
2026-08-13 20:16:02 +08:00
2026-08-23 19:36:00 +08:00
2026-08-13 20:16:02 +08:00
2026-08-13 20:16:02 +08:00
2026-07-28 21:13:10 +08:00
2026-07-26 18:35:31 +08:00
2026-08-20 16:15:13 +08:00
2026-07-26 12:19:55 +08:00
2026-07-26 18:35:31 +08:00