策略是策略引擎、回测、监控的基础。本文介绍策略体系与三种扩展方式。
完整策略开发规范(AI 生成与手写)见 backend/app/strategy/prompts/strategy-guide.md。
策略全部是用户自定义文件,每个策略一个独立 Python 文件,基于 Polars 表达式向量化实现,存放在 data/strategies/custom/(可编辑、可删除);原 25 个示例策略已随数据目录一次性迁移为普通自定义策略。按类型概览:
| 类型 | 代表策略 |
|---|---|
| 趋势 / 形态 | 趋势突破 · 均线多头 · MA 金叉 · MACD 金叉放量 · 布林突破 · 均线粘合突破 · 平台整理突破 · 放量创60日新高 |
| 量价 / 涨停 | 量价齐升 · 高换手强势 · 连板股 · 断板反包 · 涨停动量 · 接近涨停 · 涨停基因活跃股 |
| 反转 / 波动 | 超跌反弹 · 超卖反转 · 新低反转 · 低波动龙头 · 回踩 MA20 · 回踩支撑 · 强势开盘 · MACD 零下回升 · 长下影反击 · RSI 中轴回踩 |
backend/app/strategy/research/ 保留一个仅供挖掘 worker 使用的受控因子排名研究模板(research_only)。它不出现在普通策略列表,也不能通过普通策略 API 直接运行或删除;挖掘结果发布时会生成独立策略。详见 因子与策略挖掘。
策略引擎只加载用户数据目录(data/strategies/custom|ai|composite)与研究模板目录,不再有内置策略目录;新装环境策略库为空。旧版本升级用户首次启动时自动把 25 个原内置策略补回为自定义文件(按 ID 补缺、不覆盖已有,删除后重启不复活)。AI 生成的策略只落入 data/strategies/ai/。
在策略页 UI 上用 字段 + 操作符 + 阈值 组合,编译成 Polars 表达式热加载。适合:
- 快速验证一个简单的筛选思路(如
RSI < 30 AND 量比 > 2) - 不熟悉 Python 但想自定义筛选条件
底层实现在 backend/app/strategy/custom_signals.py。
一句话描述思路,LLM 读取精简运行时指南生成完整策略文件:
- 配置 AI 接口(留空即关闭,见 configuration.md → AI):
AI_PROVIDER=openai_compat AI_BASE_URL=https://api.deepseek.com/v1 AI_API_KEY=sk-... AI_MODEL=deepseek-chat
- 在策略页打开「AI 策略生成器」,用自然语言描述你的策略思路
- 前端流式接收生成代码,后端经
ast安全校验(import 白名单 + 危险内建引用/dunder 遍历/模块命名空间句柄/文件读写原语拦截,实现见ai_generator._validate_safety)后返回结果 - 保存后落入
data/strategies/ai/,文件名/ID 用ai_前缀
生成策略相关提示词位于 backend/app/strategy/prompts/:
strategy-guide-compact.md— AI 运行时精简指南(用于降低长请求超时概率)strategy-guide.md— 完整策略开发规范(供人工开发和详细参考)strategy-builder-step2.md— 步骤 2 提示词模板(修改已有策略)strategy-example.md— 从零创建强势反包策略的三步演示
💡 文件与范围铁律:AI 生成的策略只生成一个
.py文件,只import polars as pl,绝不修改backend/、docs/、frontend/等现有文件。
生成之后的持续改进(假设—验证—判定闭环),见 AI 策略迭代指南。
可以在策略页「自定义编写」中直接编辑策略代码并保存,新建自定义策略会落入 data/strategies/custom/,文件名/ID 用 custom_ 前缀。也可以手动把已有策略改写为 Polars 文件后放入该目录,引擎会自动发现;或用策略池对话框右上角的**「导入策略」**按钮直接上传 .py 文件(新装空库上手的最快路径)。
手写策略需遵循 strategy-guide.md 的文件结构(META / basic_filter / scoring / ENTRY_SIGNALS / filter 等),完整规范见该文档。
一个策略 .py 文件通常包含:
| 部分 | 作用 |
|---|---|
META |
策略元信息(名称、参数、方向等),用户可在 UI 调整阈值 |
basic_filter(df, params) |
模式 A:单日过滤,返回 pl.Expr |
filter_history(df, params) |
模式 B:历史窗口过滤,返回 pl.DataFrame(配 LOOKBACK_DAYS) |
scoring |
策略权重,总和 = 1.0 |
ENTRY_SIGNALS / EXIT_SIGNALS |
进出场信号列(回测用) |
完整字段说明与示例见 strategy-guide.md。
如果你想随项目分发一个示例策略:在 backend/tests/fixtures/strategies/ 维护参考实现(仅测试用);面向用户的策略分发请直接提供 .py 文件由用户导入 data/strategies/custom/,引擎会自动发现并加载。