基于"二次突破"量化策略的A股选股系统,自动扫描全市场,识别涨停起爆→缩量整理→二次突破的买入信号,并跟踪止损。
- 技术栈: Python/FastAPI + React/Vite + ECharts + Tushare / iFinD
起爆日 → 缩量整理 → 二次突破买入 → SMA5止损
| 阶段 |
条件 |
| 起爆 |
当日涨幅 ≥ 9.5%,成交量 ≥ 20日均量 × 2.0 |
| 整理 |
3~15日内股价不破支撑位,成交量缩至起爆日 × 0.5 以下 |
| 买入 |
收盘价站上突破位且放量确认 |
| 止损 |
收盘价跌破 SMA5 |
| 参数 |
默认值 |
含义 |
| 涨幅阈值 |
9.5% |
起爆日最低涨幅 |
| 量比阈值 |
2.0 |
起爆日量比倍数 |
| 缩量比 |
0.5 |
整理期量能上限(相对起爆日) |
| 量均线窗口 |
20 |
计算均量的回溯天数 |
| 整理最少天数 |
3 |
整理期最短 |
| 整理最多天数 |
15 |
整理期最长 |
- 一键扫描全部A股(过滤ST/退市/北交所/科创板)
- SSE 实时进度推送
- 结果按买入日排序,支持列排序
- 前端面板调节6个策略参数
- 参数自动保存到浏览器 localStorage
- 扫描和个股信号均使用当前参数
- 红涨绿跌K线 + MA5/MA20均线
- 起爆点/买入点标注
- 突破位/支撑位虚线
- 整理区间阴影
- 成交量柱状图
- 拖拽缩放 + 滑块
- 每日指定时间自动运行全市场扫描
- 前端可开关、调整时间
- 自动扫描结果覆盖上次数据
- 从扫描结果添加股票到监控列表
- 刷新数据自动检测止损信号变化
- 新触发止损时浏览器推送通知
- 扫描完成后自动刷新监控数据
- 勾选多只股票,点击"对比"
- 多个K线图并排展示
- 紧凑模式适配小图
- 点击"开始扫描"启动全市场扫描
- 进度条实时显示扫描进度
- 展开"策略参数"调节策略阈值
- 展开"定时扫描"设置自动扫描时间
- 结果表格:点击行进入K线详情,点"监控"加入监控列表,勾选后点"对比"进入多股对比
- 展示所有监控中的股票
- 点击"刷新数据"更新最新价和止损状态
- 新触发止损时弹出浏览器通知
- 点"移除"退出监控
- 信号卡片展示关键数据(起爆日/买入价/浮盈等)
- K线图展示完整走势和策略标注
- 点击"← 返回列表"回到首页
- 多个K线图并排展示
- 每个图独立支持缩放
- 紧凑布局适配2~6只股票
| 方法 |
路径 |
说明 |
| GET |
/api/scan/results |
获取扫描结果 |
| POST |
/api/scan/start |
启动扫描(body: {strategy: {...}, days: 120, delay: 0.3}) |
| GET |
/api/scan/status |
SSE 扫描进度流 |
| GET |
/api/scan/state |
当前扫描状态 |
| GET |
/api/scan/params |
当前策略参数 |
| 方法 |
路径 |
说明 |
| GET |
/api/scan/schedule |
获取定时配置 |
| PUT |
/api/scan/schedule |
更新定时配置(body: {enabled, hour, minute}) |
| 方法 |
路径 |
说明 |
| GET |
/api/stock/{code}/history?days=120 |
K线数据 |
| GET |
/api/stock/{code}/signals?days=120&rise_threshold=9.5 |
信号数据(可传策略参数) |
| GET |
/api/stock/search?q=平安 |
搜索股票 |
| 方法 |
路径 |
说明 |
| GET |
/api/watchlist |
监控列表 |
| POST |
/api/watchlist |
添加监控(body: {code, name, entry_price, entry_date}) |
| DELETE |
/api/watchlist/{code} |
移除监控 |
| POST |
/api/watchlist/refresh |
刷新数据,返回新触发止损 |
| GET |
/api/watchlist/alerts |
已触发止损列表 |
| 变量 |
说明 |
示例 |
TUSHARE_TOKEN |
Tushare API Token |
你的token |
IFIND_ACCESS_TOKEN |
iFinD 同花顺数据接口 Token |
你的token |
DATA_SOURCE |
数据源选择 (tushare / ifind) |
tushare |
| 变量 |
说明 |
默认值 |
SCHEDULE_ENABLED |
定时扫描开关 |
false |
SCHEDULE_HOUR |
扫描时间-时 |
15 |
SCHEDULE_MINUTE |
扫描时间-分 |
30 |
PORT |
服务端口 |
8000 |
# 后端
cd a_stock_screener
pip install -r requirements.txt
python -m uvicorn server.app:app --port 8000
# 前端
cd web && npm install && npm run dev
# 访问 http://localhost:5173
cd a_stock_screener
cd web && npm install && npm run build && cd ..
python start.py
# 访问 http://localhost:8000
docker build -t a-stock-screener .
docker run -d -p 8000:8000 \
-e TUSHARE_TOKEN=你的token \
a-stock-screener
- GitHub 创建仓库,推送代码
- Railway → New Project → Deploy from GitHub repo
- Settings → Generate Domain 生成公网地址
- Variables 添加
TUSHARE_TOKEN
- 重新部署生效
a_stock_screener/
├── server/ # FastAPI 后端
│ ├── app.py # 应用入口 + SPA静态服务
│ ├── scan_runner.py # 扫描引擎(线程+SSE广播)
│ ├── scheduler.py # APScheduler 定时任务
│ ├── watchlist.py # 监控列表管理
│ ├── models.py # Pydantic 数据模型
│ └── api/
│ ├── scan.py # 扫描相关API
│ ├── stock.py # 个股API
│ ├── schedule.py # 定时扫描API
│ └── watchlist.py # 监控API
├── strategy.py # 二次突破策略逻辑
├── data_fetcher.py # 数据获取门面(Tushare / iFinD)
├── tushare_backend.py # Tushare 数据后端
├── ifind_backend.py # iFinD 数据后端
├── ifind_client.py # iFinD HTTP 客户端
├── start.py # 单服务启动入口
├── Dockerfile # Docker 构建
├── railway.toml # Railway 配置
├── requirements.txt # Python 依赖
└── web/ # React 前端
├── src/
│ ├── App.jsx
│ ├── api/client.js
│ ├── components/
│ │ ├── Dashboard.jsx
│ │ ├── ScanControls.jsx
│ │ ├── DataSourceSelector.jsx
│ │ ├── ScanScopeSelector.jsx
│ │ ├── StrategyParams.jsx
│ │ ├── ScheduleSettings.jsx
│ │ ├── ResultsTable.jsx
│ │ ├── StockDetail.jsx
│ │ ├── KlineChart.jsx
│ │ ├── SignalCard.jsx
│ │ ├── SearchInput.jsx
│ │ ├── Watchlist.jsx
│ │ ├── CompareView.jsx
│ │ └── Layout.jsx
│ ├── styles.css
│ └── main.jsx
├── vite.config.js
└── package.json
- 数据时效: 扫描结果是快照,非实时行情。定时扫描可保证每日收盘后数据更新
- Tushare 限流: 全市场扫描约5000+只股票,每只间隔0.3秒,全程约25分钟
- 浏览器通知: 首次使用监控功能需授权浏览器通知权限
- 代理冲突: 本地开发时,如使用Clash等代理,需确保localhost不走代理
- 免责声明: 本系统仅供学习研究,不构成投资建议。股市有风险,投资需谨慎