{"id":51611305,"url":"https://github.com/guoyaohua/limit-up-sniper","last_synced_at":"2026-07-12T08:02:16.469Z","repository":{"id":370942471,"uuid":"1207009448","full_name":"guoyaohua/limit-up-sniper","owner":"guoyaohua","description":"面向中国 A 股首板涨停研究的 Python 量化交易系统，支持实时 Tick、QMT/XTQuant、模拟或实盘执行、影子验证与盘后复盘。","archived":false,"fork":false,"pushed_at":"2026-07-12T06:11:49.000Z","size":764,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-12T06:12:41.433Z","etag":null,"topics":["a-share","algorithmic-trading","backtesting","china-stock-market","level2","paper-trading","python","qmt","quantitative-finance","quantitative-trading","stock-trading","xtquant"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/guoyaohua.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":"CITATION.cff","codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-10T13:33:08.000Z","updated_at":"2026-07-12T06:11:52.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/guoyaohua/limit-up-sniper","commit_stats":null,"previous_names":["guoyaohua/limit-up-sniper"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/guoyaohua/limit-up-sniper","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guoyaohua%2Flimit-up-sniper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guoyaohua%2Flimit-up-sniper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guoyaohua%2Flimit-up-sniper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guoyaohua%2Flimit-up-sniper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/guoyaohua","download_url":"https://codeload.github.com/guoyaohua/limit-up-sniper/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guoyaohua%2Flimit-up-sniper/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35385772,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-12T02:00:06.386Z","response_time":87,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["a-share","algorithmic-trading","backtesting","china-stock-market","level2","paper-trading","python","qmt","quantitative-finance","quantitative-trading","stock-trading","xtquant"],"created_at":"2026-07-12T08:02:12.644Z","updated_at":"2026-07-12T08:02:16.457Z","avatar_url":"https://github.com/guoyaohua.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/logo.svg\" width=\"128\" alt=\"Limit-Up Sniper logo\"\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eLimit-Up Sniper\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  A 股首板候选发现、实时决策、模拟/实盘执行与 Tick 回放研究系统\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/guoyaohua/limit-up-sniper/actions/workflows/secret-scan.yml\"\u003e\u003cimg src=\"https://github.com/guoyaohua/limit-up-sniper/actions/workflows/secret-scan.yml/badge.svg\" alt=\"CI\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.python.org/\"\u003e\u003cimg src=\"https://img.shields.io/badge/Python-3.10%2B-3776AB?logo=python\u0026amp;logoColor=white\" alt=\"Python 3.10+\"\u003e\u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/badge/platform-Windows-0078D4?logo=windows\u0026amp;logoColor=white\" alt=\"Windows\"\u003e\n  \u003ca href=\"LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/badge/license-MIT-green.svg\" alt=\"MIT License\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\nLimit-Up Sniper 的核心思路是：先从全市场筛出历史股性较好的首板候选，再用实时\n情绪、板块联动、资金流、换手率、量能和盘口做逐层确认，最后选择“排板”或\n“扫板”。LLM 只帮助盘前扩大候选发现，不直接决定买卖。\n\n默认运行模式是 `simulation`，使用真实 XTQuant 行情驱动持久化纸面账户，\n不会向 QMT 发送委托。只有显式运行实盘入口并输入 `yes` 后，主策略才可能发出\n真实委托。\n\n\u003e [!WARNING]\n\u003e 本项目是量化研究与工程框架，不是收益承诺或投资建议。现有迁移数据只有 12 个\n\u003e 交易日，且缺少完整买卖配对与连续净值，尚不能证明本轮升级提高了封板率或收益率。\n\n## 先看懂策略\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/strategy-flow.svg\" width=\"100%\" alt=\"首板策略从选股到验证的流程图\"\u003e\n\u003c/p\u003e\n\n### 1. 基础股票池：先排除不可做的股票\n\n启动后从沪深 A 股构建基础池，排除科创板、北交所、ST、停牌、上市不足 100 天\n和关键行情字段缺失的股票。随后使用最近日线继续过滤低流通市值、低价格、低成交额、\n涨停价仍在 60 日均线下方，以及昨日已经涨停的股票。昨日涨停只用于判断题材延续或\n退潮，不再混入“今日首板”候选。\n\n### 2. 涨停基因：历史上什么样的票更容易封住并给溢价\n\n系统对最近 250 个交易日计算五项正向因子，再将各因子转成横截面百分位：\n\n| 因子 | 权重 | 想回答的问题 |\n|---|---:|---|\n| 涨停次日收盘溢价超过 5% 的比例 | 25% | 封板后是否常有强溢价 |\n| 首板次日收盘红盘率 | 25% | 首板次日是否容易维持正收益 |\n| 首板封板率 | 25% | 触板后是否容易封住 |\n| 首板涨停/炸板后的次日开盘平均溢价 | 15% | 次日是否有可兑现空间 |\n| 近 250 日涨停次数 | 10% | 股性是否活跃 |\n\n还会排除首板封板率不高于 70%、近一年没有涨停、历史涨停后开盘和收盘平均\n溢价均低于 1% 的股票，最后按综合分降序保留最多 1000 只。所有“次日”统计只在\n结果已经可见后进入特征，避免把未来数据泄漏进当日选股。\n\n### 3. 盘前扩容：提高首板召回，但不放宽买入权限\n\n盘前模块合并 1 小时热股 100 只、24 小时热股 100 只、概念/行业热点各 50 个，\n以及涨停基因候选 500 只。Prompt 同时寻找延续主线、轮动支线和新发酵题材，最多\n输出 30 只候选：\n\n- `core`：置信度至少 0.78，并且有至少两类本地证据；\n- `watch`：证据较弱或只有单一来源，仅用于继续观察。\n\n模型输出会经过本地股票代码、板块映射和证据来源复核，不能凭空创造候选。模拟模式\n可以直接测量扩展候选；实盘主策略仍使用原核心池，扩展候选只进入独立影子通道。\n\n### 4. 盘中确认：以下硬条件必须同时通过\n\n| 过滤层 | 当前规则 | 不通过时 |\n|---|---|---|\n| 交易时点 | 14:50 后不再新买；首次触板达到或晚于 14:30 不买 | 跳过 |\n| 候选资格 | 必须属于当前通道的强势股票池 | 跳过 |\n| 市场情绪 | 评分低于 2.5 | 停止买入 |\n| 个股状态 | 已持仓、已有有效委托或进入黑名单 | 跳过 |\n| 换手率 | 低于 3% | 跳过 |\n| 换手率 | 15%–25% | 进入观察名单，仓位减半 |\n| 换手率 | 不低于 25% | 当日黑名单 |\n| 时段量比 | 按连续竞价已交易分钟归一化后低于 0.7 | 跳过 |\n| 板块效应 | 没有有效概念/行业联动，或数据超过 60 秒 | 跳过 |\n| 资金流 | 没有个股流入信号，或数据超过 180 秒 | 跳过 |\n| 集中度 | 任一概念已持有 2 只 | 跳过 |\n\n这里采用 fail-closed：关键实时数据缺失或过期时不买，而不是沿用旧信号。市场情绪\n由涨停数量、炸板率、昨日延续与表现、四大指数及指数分化综合成 1–10 分。\n\n### 5. 两种入场：排板与扫板\n\n| 入场方式 | 触发盘口 | 额外条件 |\n|---|---|---|\n| 排板 | 买一价等于涨停价，股票已经封板 | 封单金额达到情绪动态门槛；弱市要求更多板块与领涨共振；单股撤单次数不超过 25 |\n| 扫板 | 尚未封板，但卖一价已经等于涨停价 | 情绪至少 4 分；吃到涨停价所需可见卖盘资金不高于 300 万且较前一 Tick 缩小；价格不能转弱；板块与领涨数达标 |\n\n排板的基础封单门槛随情绪连续变化：\n\n| 情绪分 | 10 | 8 | 7 | 5.5 | 4 | 2.5 |\n|---:|---:|---:|---:|---:|---:|---:|\n| 封单门槛 | 2000 万 | 3000 万 | 5000 万 | 8000 万 | 1 亿 | 1.5 亿 |\n\n盘前 LLM 命中的优先板块最多把门槛降低 30%，但最低仍受 2000 万绝对门槛约束，\n并且不能绕过任何盘中硬过滤。\n\n### 6. 成交不是假设：排板必须真的穿过队列\n\n模拟、影子和事件回放不会把“发出排板委托”直接记成盈利成交。只有满足：\n\n$$\n\text{下单后新增累计成交手数} \\geq\n\text{下单时前方队列手数} + \text{本单手数}\n$$\n\n并且确认 Tick 仍处于封板状态，才确认整单成交。封单减少可能只是撤单，因此不算\n成交；开板、主动撤单或跨交易日会让原排队位置永久失效。这个模型有意偏保守。\n\n扫板和普通纸面成交使用下一笔该股票 Tick、可见五档盘口 VWAP、盘口参与率、\n滑点、佣金、最低佣金、印花税、过户费、100 股整手及 T+1 约束。\n\n### 7. 仓位、撤单与卖出\n\n- 单股基准金额为总资产的六分之一；近 20 日振幅相对 5% 目标越大，仓位越小，\n  调整倍数限制在 0.5–1.5；观察名单再乘 0.5。\n- 排板开板、封单低于 2000 万、封单骤降后低于情绪门槛、换手率达到 25%、\n  资金流消失或尾盘仍未成交时撤买单。\n- 实盘启动时先处理隔夜持仓；默认昨日涨停持仓按昨收上方 2% 限价挂卖，\n  非昨日涨停持仓若昨收跌破成本 5% 则盘前止损。\n- 盘中盈利达到 5% / 8% / 10% 时各减 25%；其余仓位使用以盘中最高价为锚的\n  10 档追踪止损。盈利越多，允许回撤从 5% 逐步收紧到 2.5%。\n- 14:50 后尝试按可用持仓和可见买盘深度卖出。A 股跌停或流动性不足时，\n  委托不保证成交。\n\n更细的判断顺序见[核心策略说明](docs/core-strategy.md)与[每日交易流程](docs/trading-flow.md)。\n\n## 一键部署与运行\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/run-modes.svg\" width=\"100%\" alt=\"部署、模拟、影子、实盘和回测运行模式图\"\u003e\n\u003c/p\u003e\n\n### 前置条件\n\n- Windows 10/11 与 PowerShell 5.1+；\n- Python 3.10 或更高版本；\n- 已安装并启动支持 XTQuant 的 QMT 客户端；\n- QMT 的 `userdata_mini` 路径和资金账号。即使只做实时模拟，也需要 QMT 行情连接。\n\nXTQuant 由 QMT 提供，不在 PyPI。启动器会尝试从常见 QMT 目录定位它；若未找到，\n请在 `.env` 中把 `XTQUANT_PYTHONPATH` 指向包含 `xtquant` 文件夹的\n`site-packages` 目录。\n\n### 第一次：双击部署\n\n克隆仓库后双击 `scripts\\deploy.cmd`，或在仓库根目录运行：\n\n```powershell\n.\\scripts\\deploy.cmd\n```\n\n它会创建 `.venv`、安装依赖，并在不存在时从 `.env.example` 生成 `.env`。然后只需\n编辑 `.env` 中与所选客户端对应的三项：\n\n```dotenv\nLIMIT_UP_CLIENT_NAME=GJ_SIM\nGJ_SIM_QMT_CLIENT_PATH=C:\\path\\to\\userdata_mini\nGJ_SIM_STOCK_ACCOUNT=your-account-id\n```\n\n如果使用实盘客户端，将 `LIMIT_UP_CLIENT_NAME` 改为 `CICC_LIVE`，并填写\n`CICC_QMT_CLIENT_PATH`、`CICC_STOCK_ACCOUNT`。`.env` 已被 Git 忽略，不要把真实\n账号、路径或密钥提交到仓库。\n\n### 每天：双击实时模拟\n\n推荐先连续运行至少 20 个交易日：\n\n```powershell\n.\\scripts\\run-simulation.cmd\n```\n\n这是安全默认入口。即使 `.env` 中误写了 `LIMIT_UP_EXECUTION_MODE=live`，该脚本也会\n强制覆盖为 `simulation`。它会复用实时行情与完整策略，但订单只进入\n`output/paper_trading/simulation.sqlite3`。首次运行或依赖变化时会自动部署。\n\n开启扩展候选影子通道：\n\n```powershell\n.\\scripts\\run-simulation.cmd -EnableShadow\n```\n\n刷新问财板块映射并运行：\n\n```powershell\n.\\scripts\\run-simulation.cmd -RefreshSector\n```\n\n只做环境、账号路径和 XTQuant 导入检查，不启动策略：\n\n```powershell\n.\\scripts\\run-simulation.cmd -PreflightOnly\n```\n\n### 实盘：使用独立入口\n\n确认模拟结果、成本假设和风控都符合预期后，才运行：\n\n```powershell\n.\\scripts\\run-live.cmd\n```\n\n脚本会显式设置 `live`，随后 `main.py` 还会要求输入小写 `yes`。在输入前请再次核对\nQMT 客户端、遮罩账号、策略版本和运行模式。开启影子对照可使用：\n\n```powershell\n.\\scripts\\run-live.cmd -EnableShadow\n```\n\n此时只有主策略发 QMT 委托；影子策略使用同一份实时 Tick 和独立纸面账户，不发实单。\n\n### PowerShell 完整入口\n\n需要组合参数时可直接调用：\n\n```powershell\n# 安装开发测试依赖\n.\\scripts\\setup.ps1 -Dev\n\n# 默认仍为 simulation\n.\\scripts\\run.ps1\n\n# 显式实盘 + 影子 + 刷新板块映射\n.\\scripts\\run.ps1 -Mode live -EnableShadow -RefreshSector\n```\n\n## Tick 保存、影子收益与回测\n\n### 保存每日完整 Tick\n\n在 QMT/XTQuant 服务在线时运行：\n\n```powershell\n.\\.venv\\Scripts\\python.exe scripts\\capture_ticks.py --verify\n```\n\n归档按交易日写入 `output/tick_archive/YYYYMMDD/`，保留五档盘口、事件时间、接收时间、\n回调批次和股票代码，并用 manifest 与 SHA-256 校验。空归档、队列丢包、后台写盘错误、\n记录数或顺序异常都会 fail closed，不能静默进入严谨回测。\n\n### 回放真实主策略或影子决策\n\n```powershell\n.\\.venv\\Scripts\\python.exe scripts\\run_backtest.py `\n  --ticks output/tick_archive/20260710 `\n  --events output/trade_logs/20260710/events.jsonl `\n  --event-source primary `\n  --event-buy-target-value 100000 `\n  --output output/backtests/primary-20260710.json\n```\n\n将 `--event-source` 改为 `shadow` 可评估影子信号。旧事件若没有 `signal_source` 会默认\n拒绝；只有明确接受来源歧义时才加入 `--accept-legacy-unlabelled-events`。\n\n回测会输出扣费收益、最大回撤、胜率、Profit Factor、净值曲线、收盘封板率、\n排板未成交与队列失效等指标。默认下一笔同股 Tick 才允许成交，避免同 Tick 前视。\n也可以使用自定义策略插件；接口与全部参数见[Tick 回测与影子交易](docs/backtesting.md)。\n\n## 三种模式的边界\n\n| 模式 | 行情 | 策略/账户 | 会发真实委托吗 |\n|---|---|---|---|\n| 实时模拟 | 实时 XTQuant | 主策略 + 持久化纸面账户 | 否 |\n| 实盘 + 可选影子 | 实时 XTQuant | 主策略发 QMT；影子状态与纸面账户独立 | 仅主策略 |\n| 离线 Tick 回测 | 已校验归档 | 回放实例 + 内存纸面账户 | 否 |\n\n事件回放验证的是“当时已记录的决策在统一撮合口径下会怎样成交”，还不是把整套实时\n策略放到历史 Tick 上重新决策。后者仍需把代码中的系统时钟统一改成事件时钟。\n\n## 输出在哪里\n\n| 路径 | 内容 |\n|---|---|\n| `output/涨停基因/` | 每日全量涨停基因指标 |\n| `output/强势股票/` | 过滤与排序后的 Top 1000 候选 |\n| `output/涨停列表/` | 当日涨停、首板与炸板记录 |\n| `output/trade_logs/` | 带 `primary` / `shadow` 来源的结构化策略事件 |\n| `output/paper_trading/` | `simulation.sqlite3` 与 `shadow.sqlite3` 账本、成交和净值 |\n| `output/tick_archive/` | 分段 gzip Tick、manifest 与摘要 |\n| `output/backtests/` | 回测 JSON 结果 |\n| `logs/` | 分级运行日志 |\n\n## 如何判断升级真的有效\n\n不要只看“后来涨停了多少只”。至少连续采集 20 个交易日，并让核心池 A 组与\n扩展影子池 B 组使用相同 Tick、参数、成本和撮合规则。验证窗口开始后冻结参数，至少比较：\n\n- 可成交信号数、未成交率、排板队列失效与撤单比例；\n- 收盘封板率及 Wilson 95% 区间、次日开盘/收盘收益；\n- 扣费净收益、胜率及区间、盈亏比、Profit Factor；\n- 最大回撤、最大单笔亏损和板块集中度；\n- 提高费用/滑点、降低盘口参与率后的敏感性。\n\n扩展池只有在扣费收益和封板质量不退化、风险不越界、改善不集中于单只股票或单一\n市场阶段时，才适合考虑小规模晋级。完整口径见\n[策略升级与验证计划](docs/strategy-upgrade-2026-07-12.md)。\n\n## 项目结构\n\n```text\nlimit-up-sniper/\n├── main.py                 # 交易日主入口与进程编排\n├── config.py               # 模式、账户和策略参数\n├── analysis/               # 盘前 LLM 发现、盘后复盘\n├── core/                   # 股票池、涨停基因、买卖/撤单、追踪止损\n├── engine/                 # Tick 状态机、实盘/模拟执行、回测与事件回放\n├── data/                   # 共享数据、序列化、Tick 归档\n├── monitor/                # 市场情绪、板块联动与监控报表\n├── scraper/                # 东方财富、同花顺数据采集\n├── level2/                 # Level2 研究组件\n├── prompts/                # 盘前首板发现 Prompt\n├── scripts/                # 一键部署/运行、Tick 采集、回测工具\n├── test/                   # 离线回归测试\n└── docs/                   # 详细设计、配置和研究口径\n```\n\n## 文档导航\n\n| 文档 | 适合什么时候看 |\n|---|---|\n| [文档索引](docs/index.md) | 不确定从哪里开始 |\n| [系统架构](docs/architecture.md) | 理解进程、模块与数据流 |\n| [每日交易流程](docs/trading-flow.md) | 按时间理解一天如何运行 |\n| [核心策略](docs/core-strategy.md) | 查看买入、撤单、卖出细节 |\n| [配置手册](docs/configuration.md) | 修改模式、账户、仓位和阈值 |\n| [执行引擎](docs/engine.md) | 理解 Tick 状态机与委托执行 |\n| [Tick 回测与影子交易](docs/backtesting.md) | 保存行情、模拟收益、事件回放 |\n| [策略升级与验证计划](docs/strategy-upgrade-2026-07-12.md) | 查看已修复问题与 A/B 验收边界 |\n\n## 测试与安全检查\n\n不安装 QMT/XTQuant 也可运行默认离线回归测试：\n\n```powershell\npython -m pip install -r requirements-dev.txt\npython -m pytest -q\npython scripts\\scan_secrets.py\n```\n\n需要 QMT、网络、浏览器、凭据或本地行情文件的集成脚本不在默认 pytest 集合中。\nGitHub Actions 会在干净的 Python 3.11 Windows 环境运行离线测试，并单独用 gitleaks\n扫描可达 Git 历史。\n\n## 风险与许可\n\n自动化交易可能在很短时间内产生显著亏损，涨停排队、行情延迟、跌停流动性和实盘\n滑点都无法被历史回测完全复现。请从实时模拟开始，核对每一笔决策、排队证据、成交、\n费用和净值，再决定是否承担实盘风险。\n\n参与贡献前请阅读 [CONTRIBUTING.md](CONTRIBUTING.md)。安全问题请按\n[SECURITY.md](SECURITY.md) 私下报告。项目采用 [MIT License](LICENSE)。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fguoyaohua%2Flimit-up-sniper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fguoyaohua%2Flimit-up-sniper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fguoyaohua%2Flimit-up-sniper/lists"}