AI选股核心设计思路
一、总体架构
策略拆分为「筛选条件」+「AI提示词」,通过目标日期实现实盘选股与回测选股的统一,回测结果驱动AI自我优化策略。
🔄 策略优化引擎
🎯 目标日期决定模式
🔍 选股引擎
📋 策略(Strategy)
更新策略
更新策略
筛选条件
condition_expr
AI提示词
analysis_prompt
条件初筛
EnhancedStockScreener
数据获取
StockDataService
AI深度分析
OpenClawGateway
结果持久化
PersistenceService
实盘选股
targetDate = 今天
回测选股
targetDate = 历史日期
回测统计
BacktestResultService
AI优化策略
OpenClawGateway
条件验证
StrategyParseService
二、选股流程(实盘 & 回测统一)
实盘选股与回测选股走的是同一条链路,唯一区别是 targetDate 不同:实盘填今天,回测填历史日期。
REALTIME
BACKTEST
是
否
REALTIME
BACKTEST
否
是
🚀 开始选股
输入:策略ID + 目标日期
创建 SelectionTask
状态 = PENDING
获取策略信息
condition_expr + analysis_prompt
selectionType?
targetTime = 当前时间
expectedBuyTime = 今日收盘前
targetTime = 目标日期 15:00
expectedBuyTime = 次日开盘
🔍 条件初筛
EnhancedStockScreener.screen()
解析条件表达式
支持 OR/AND 组合
拼接SQL
JOIN daily_quote + technical_indicator + stock_basic
WHERE 目标日期之前的数据
执行SQL
返回初筛股票列表
初筛结果
是否为空?
任务结束
无符合条件的股票
📊 获取全维度数据
StockDataService.batchGetStockData()
保存候选股票数据
data/stock_selection/{batchNo}/
🤖 请求AI分析
OpenClawGatewayService
场景类型?
generateRealtimeSelectionJson()
generateBacktestSelectionJson()
异步HTTP POST → OpenClaw Gateway
携带:result_dir, strategy_name, target_time
⏳ 等待AI返回结果
轮询结果文件
文件存在 + 大小稳定3次 + JSON合法
结果有效?
任务失败
📝 解析AI结果
StockSelectionPersistenceService
创建 SelectionBatch
screenStockCount / stockCount
遍历股票 → stock_pick 表
prediction / trade_plan / analysis_basis
buyTime / sellTime
发送通知
✅ 选股完成
三、回测流程
回测 = 遍历时间区间内每个交易日,对每个交易日执行一次完整的选股流程,最终汇总统计。
否
是
所有日期完成
循环
🚀 开始回测
输入:策略 + startDate + endDate
entryHour + entryMinute
创建 SelectionTask
taskType = BACKTEST
创建 BacktestProgress
跟踪进度
🗑️ 清除该策略旧回测数据
删除 stock_pick + selection_batch + backtest_result
📅 遍历 startDate → endDate
是交易日?
TradeCalendarService
跳过,下一个日期
Semaphore(2)
控制并发数
创建子任务
batchNo = BT_{yyyyMMdd}_{随机4位}
执行选股
executeRealtimeSelection()
selectionType = BACKTEST
🔍 复用完整选股8步流程
唯一区别:targetTime = 当日15:00
expectedBuyTime = 次日开盘
该日期完成
更新 BacktestProgress
等待所有异步任务完成
CompletableFuture.allOf().join()
📊 计算回测统计
BacktestResultService.calculateAndSaveResult()
查询所有 BACKTEST 类型 stock_pick
计算 winRate / avgChange / maxChange / minChange / totalReturn
写入 backtest_result 表
更新 BacktestProgress
status = COMPLETED
✅ 回测完成
回测并发模型
Semaphore(2) 限制
回测时间线
完成后
完成后
4月1日
4月2日
4月3日
4月4日
4月5日
4月6日
4月7日
Worker 1
Worker 2
等待队列
四、策略优化流程(核心闭环)
策略优化是一个迭代循环:回测 → 统计 → AI优化 → 验证 → 更新策略 → 再回测,直到胜率达标或达到最大迭代次数。
是 ✅
否 ❌
否
是
< 30
> 200
是
否
30 ~ 200 ✅
iteration >= maxIterations
🚀 开始策略优化
输入:策略 + targetWinRate=0.75
maxIterations=10 + 回测时间区间
Semaphore(2)
限制并发优化数
创建 OptimizationSession
跟踪迭代状态
iteration = 0
① 执行回测
triggerBacktest(strategy, startDate, endDate)
② 等待回测完成
每3秒轮询,最长7200秒
③ 统计回测结果
getStrategyBacktestViewResultInternal()
计算:winRate / avgChange / totalReturn
总选股数 / 各批次数据
④ 是否达标?
winRate >= targetWinRate
且 totalPicks >= 10
优化成功!退出循环
⑤ 保存回测数据到迭代目录
batches/*.json → AI精选数据+统计
screen_data/screen_overview.json → 初筛统计
overview.json → 汇总
conditions.json → 当前条件
parameters.json → 优化参数
⑥ 请求AI优化策略
OpenClawGatewayService.sendAsync()
构建优化Prompt
action: 优化策略
read_order: conditions → overview → screen_data → batches
⑦ 等待AI优化结果
watchForResultFileStable()
⑧ 结果校验
condition_expr 存在且长度 >= 10?
跳过本轮迭代
iteration++
⑨ 条件验证与修复
StrategyParseService.validateAndFixCondition()
实际执行条件初筛
enhancedStockScreener.screen()
初筛数量范围?
30 ~ 200 只
条件过严,拒绝
条件过宽,拒绝
修复尝试 < 3次?
发送修复请求给OpenClaw
buildFixPrompt()
保底保存
strategy.status = 3(草稿)
✅ 更新策略
strategy.condition_expr = 新条件
strategy.analysis_prompt = 新提示词
strategy.status = 1(启用)
iteration++
达到最大迭代次数
退出循环
🏁 优化完成
五、核心闭环:策略自我进化
这是整个系统最核心的设计------策略通过回测验证 + AI优化的闭环实现自我进化。
🔄 策略自我进化闭环
目标日期
= 历史日期
stock_pick
-
backtest_result
overview.json -
batches/*.json
新 condition_expr -
analysis_prompt
验证通过
胜率达标
📋 当前策略
condition_expr
- analysis_prompt
🔍 回测验证
遍历历史交易日
AI回到过去选股
📊 统计结果
winRate / avgChange
totalReturn
🤖 AI优化
读取回测数据
调整条件+提示词
✅ 验证更新
条件初筛30-200只
通过则更新策略
🎯 策略成熟
投入实盘
迭代效果示意
AI优化
AI优化
AI优化
迭代 10
winRate: 78% ✅
condition: 最终条件
迭代 7
winRate: 71%
condition: 优化条件v7
迭代 3
winRate: 58%
condition: 优化条件v3
迭代 1
winRate: 45%
condition: 基础条件
六、关键数据表关系
触发
产生
精选
统计
包含
包含
STRATEGY
bigint
id
PK
varchar
name
text
condition_expr
筛选条件表达式
text
analysis_prompt
AI分析提示词
int
status
0禁用 1启用 3草稿
SELECTION_TASK
bigint
id
PK
bigint
strategy_id
FK
varchar
task_type
REALTIME / BACKTEST / OPTIMIZATION
varchar
status
PENDING / RUNNING / COMPLETED / FAILED
date
target_date
目标日期
SELECTION_BATCH
bigint
id
PK
bigint
strategy_id
FK
bigint
task_id
FK
varchar
batch_no
批次号
varchar
selection_type
REALTIME / BACKTEST
int
screen_stock_count
初筛股票数
int
stock_count
AI精选股票数
json
screen_data_json
初筛参数JSON
date
target_date
目标日期
STOCK_PICK
bigint
id
PK
bigint
batch_id
FK
bigint
strategy_id
FK
varchar
stock_code
股票代码
varchar
stock_name
股票名称
varchar
prediction
AI预测
text
trade_plan
交易计划
text
analysis_basis
分析依据
decimal
buy_price
买入价
decimal
sell_price
卖出价
datetime
buy_time
买入时间
datetime
sell_time
卖出时间
decimal
change_percent
涨跌幅
tinyint
is_win
是否盈利
BACKTEST_RESULT
bigint
id
PK
bigint
strategy_id
FK
varchar
backtest_batch_no
回测批次号
decimal
win_rate
胜率
decimal
avg_change
平均涨幅
decimal
max_change
最大涨幅
decimal
min_change
最大跌幅
decimal
total_return
总收益率
int
total_picks
总选股数
int
win_count
盈利次数
int
loss_count
亏损次数
七、实盘 vs 回测 对比
| 维度 | 实盘选股 | 回测选股 |
|---|---|---|
| 目标日期 | 今天 | 历史任意交易日 |
| AI可见数据 | 截至当前的所有数据 | 截至目标日期的数据(零未来信息) |
| 选股链路 | 完整8步 | 完全相同的8步 |
| 并发控制 | 单次执行 | Semaphore(2),2个交易日并行 |
| 结果存储 | selection_batch + stock_pick | 同左,selection_type=BACKTEST |
| 统计计算 | 无 | 计算胜率/涨幅 → backtest_result |
| 核心价值 | 实时交易指导 | 验证策略历史表现 |
八、策略优化退出条件
是
否
是
否
是
否
每次迭代结束
winRate >= targetWinRate
且 totalPicks >= 10?
✅ 达标退出
策略成熟,投入实盘
iteration >= maxIterations?
⚠️ 最大迭代退出
策略未达标但已尽力
AI返回空响应
或回测超时?
❌ 异常退出
继续下一轮迭代