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返回空响应
或回测超时?

❌ 异常退出

继续下一轮迭代

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐