소스 정보
- 저장소
- Veblin/invest-skills
- 최근 소스 활동
- 2026년 8월 23일 03:03
- 감지된 SKILL.md 언어
- 중국어
- 스타
- 3
- 포크
- 1
설치 방법
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
소스 파일 검토
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
메뉴
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/Veblin/invest-skills --skill invest-a-gap-scan명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
A股 ETF 结构化研究 — 指数估值/折溢价/AUM/跟踪质量/对冲覆盖,产出带来源追溯的研究备忘录。研究工具,非决策工具。共用数据层供 invest-a-journal ETF 路径调用。触发词:ETF/指数基金
底部形态扫描 — LMW 双底/三角形底全市场检出 + 数据窥探防护(RC p)。研究信号,非决策。触发词:双底/形态扫描/三角形底/底部形态
A股多因子交叉验证的结构化投研助手 — 数据采集 + 学术级引用,产出带来源追溯的 Markdown 研究备忘录。研究工具,非决策工具。触发词:个股投研/估值/财报
SKILL.md 표시 중
| name | invest-a-gap-scan |
| version | 0.2.7 |
| description | 跳空缺口扫描 — 向上缺口 + MA60 上方 + 未回补,指数成分股池(沪深300+中证A500+科创50)触发词:缺口/跳空扫描 |
| whenToUse | 缺口/跳空扫描:向上跳空缺口 + MA60 上方 + 未回补的成分股筛选 |
| argument-hint | /invest-a-gap-scan [--gap-min-pct 1.5] [--gap-min-vol-ratio 1.5] |
| allowed-tools | Bash, Read, Write, WebSearch, WebFetch |
| user-invocable | true |
| metadata | {"requires":{"bins":["uv","python3"]},"optionalEnv":["TUSHARE_TOKEN"]} |
工具约束说明:frontmatter 的
allowed-tools是 Claude Code 约定;在 DSH 等不读取该字段的 harness 下不生效,实际可用工具由平台自身沙箱控制。本技能主体操作为本地数据采集与计算(Bash/Python 引擎);部分维度经 WebSearch/WebFetch 补充检索
扫描沪深300 + 中证A500 + 科创50 成分股并集(去重后约 450~500 只),找出同时满足:
low[i] > high[i-1],幅度 >= 1%)close[t] >= MA60[t] for all t >= gap_idx)min(low[gap_idx+1:]) > gap_high) gap_high ─────── low[i] (缺口上沿 = 跳空日最低价)
|
gap_pct = low[i] / high[i-1] - 1
|
gap_low ─────── high[i-1] (缺口下沿 = 前日最高价)
478 只成分股经过多层筛选的典型分布:
478 只成分股
|-- ~200 (43%) 无缺口 -- 60 日内无 low[i] > high[i-1]
|-- ~110 (23%) 低于阈值 -- 有缺口但幅度 <1%
|-- ~130 (27%) MA60 破 -- 缺口后收盘跌破 MA60 (最大淘汰项)
|-- ~17 (4%) 缺口回补 -- 最低价回补至上沿
|-- ~6 (1%) 低流动性 -- 20 日均额 <1 亿
|-- ~1 获取失败
-------------------------------------
~5 (1%) 命中
cd "${INVEST_SKILLS_ROOT:-.}" && uv run python skills/invest-a-gap-scan/scripts/scan.py
| 参数 | 默认 | 说明 |
|---|---|---|
--universe | csi300,a500,star50 | 指数池,逗号分隔,支持空格 |
--gap-min-pct | 1.0 | 缺口幅度阈值 %。low[i]/high[i-1]-1,<1% 归为"低于阈值"淘汰 |
--gap-lookback | 60 | 缺口回溯交易日数。只搜索最近 N 根 K 线中的缺口 |
--gap-min-vol-ratio | 1.0 | 缺口日成交额 / 20 日均额下限。1.0=不过滤,>1.0=要求放量 |
--min-avg-amount | 100000000 | 20 日均额门槛(元)。<1 亿归为"低流动性"排除 |
--min-list-days | 60 | 最少 K 线根数。不足的标的归为"上市不足"排除 |
--top | 30 | stdout 命中表格行数(md 报告始终全量) |
--source | auto | 数据源:auto(优先 Tushare)/tushare/baostock |
--no-cache | off | 强制刷新 K 线缓存 + 成分股缓存 |
--universe-limit N | 无 | 只扫前 N 只(开发调试用) |
--no-save-report | off | 不写入 reports/gap-scan/ 目录 |
--json | off | stdout 输出 JSON 格式 |
# 提高缺口阈值
cd "${INVEST_SKILLS_ROOT:-.}" && uv run python skills/invest-a-gap-scan/scripts/scan.py --gap-min-pct 2.0
# 要求放量缺口
cd "${INVEST_SKILLS_ROOT:-.}" && uv run python skills/invest-a-gap-scan/scripts/scan.py --gap-min-vol-ratio 1.5
# 强制 baostock (无 Tushare token)
cd "${INVEST_SKILLS_ROOT:-.}" && uv run python skills/invest-a-gap-scan/scripts/scan.py --source baostock
# 调试: 只扫前 30 只
cd "${INVEST_SKILLS_ROOT:-.}" && uv run python skills/invest-a-gap-scan/scripts/scan.py --universe-limit 30
# JSON 输出 (供脚本消费)
cd "${INVEST_SKILLS_ROOT:-.}" && uv run python skills/invest-a-gap-scan/scripts/scan.py --json
# 全量刷新
cd "${INVEST_SKILLS_ROOT:-.}" && uv run python skills/invest-a-gap-scan/scripts/scan.py --no-cache
缺口按从新到旧排序,遇到第一个满足全部条件的即命中:
for gap in qualified_gaps (newest first):
if MA60 从未跌破 since gap_day:
if gap 从未回补:
if 量比 >= gap_min_vol_ratio (如启用):
-> 命中
else:
-> 继续检查更老的缺口 (量比不够)
else:
-> 继续检查更老的缺口 (已回补)
else:
-> 继续检查更老的缺口 (MA60 已破)
不回退到已回补的缺口。这意味着:如果最新缺口已回补但更老的缺口未回补且 MA60 完好,会命中老缺口。
停牌检测基于交易日历 + 日线数据对比:某个交易日在 trade_cal 中存在但该标的不在 daily_by_date 中 -> 标记为停牌。缺口前一交易日为停牌日 -> 归入 across_suspension_hits,不参与常规排序。
注意: 无 Tushare token 时使用自然日估算交易日历(Mon-Fri),此时跳过停牌检测以避免假期误判。
使用 invest-a-stock 的 lib.technical.sma(60 日简单移动平均)。前 59 个位置 MA60 为 None,_check_ma60_streak 跳过 None 值。NaN close 触发 MA60 失败(利用 not (NaN >= MA60) 恒为 True 的特性)。
adj_factor / latest_adj_factor -> 以最新日为基准的前复权价格adjustflag="2" 直接返回前复权价格,无需额外计算两种路径的 QFQ 算法存在细微差异,因此缓存按数据源隔离 ({kline}/{source}/{ts_code}.pkl)。
1. build_universe() 指数成分股并集 -> 去重 + ST/退市过滤 -> ~478 只
|
2. create_source("auto") 有 Token -> TushareBulkSource (按日批量)
无 Token -> BaostockSource (逐股查询)
|
3. _fetch_trade_cal() Tushare trade_cal API -> 真实交易日历
失败 -> 自然日估算 (Mon-Fri, 跳过停牌检测)
|
4. kline_cache.load() 命中 -> 跳过拉取
未命中 -> fetch_daily_batch + build_stock_kline + cache.save
|
5. detect_suspensions() 对比 trade_cal vs daily_by_date -> 停牌日期列表
|
6. scan_all() 逐股: 流动性排除 -> 找缺口 -> 容忍规则 -> 命中/排除/未命中
|
7. format_brief() 命中表 (缺口幅度降序) + 排除/未命中统计
format_markdown_report() 详文档 -> reports/gap-scan/{yyyymmdd}.md
| 项目 | 数量 |
|---|---|
| 交易日范围 | ~180 自然日 (~120 交易日,gap_lookback + 59 bar 确保 MA60 全覆盖) |
| 成分股 | ~478 只 (去重后) |
| K 线行数 | ~57,000 行 |
| 缓存磁盘 | ~25 MB (477 个 pickle 文件) |
| 场景 | 耗时 | 说明 |
|---|---|---|
| 首次扫描 (Tushare) | ~4 min | 按日批量 API(~120 日),受限于 Tushare 限速 |
| 首次扫描 (Baostock) | ~5 min | 逐股查询,每只 ~0.6s,~120 日数据 |
| 同日二次扫描 | ~7s | 全部缓存命中,仅做缺口算法 |
| 部分缓存命中 | ~7s + 缺失部分拉取 | 只拉取未命中标的 |
========================================================================
invest-a-gap-scan v0.2.7 -- 跳空缺口扫描
========================================================================
池构成: 沪深300(300) + 中证A500(500) + 科创50(50) -> 去重 478 只
数据源: baostock (前复权 adjustflag=2) (前复权)
覆盖率: 99.8% (477/478 有K线) | 命中: 5 只 | 跨停牌: 0 只
参数: 缺口>=1.0% | 回溯60日 | MA60 | 日均额>=1.00亿
排除: 获取失败 1 | 低流动性 6
未命中: 无缺口 207 | 低于阈值 111 | MA60破 131 | 缺口回补 17
| 代码 | 名称 | 指数 | 板块 | 缺口日 | 缺口% | 缺口区间 | 现价 | MA60 | MA60% | 距上沿% | 量比 | 20日均额 |
|-----|------|-----|-----|--------|------|---------|-----|------|------|--------|-----|---------|
| 300628.SZ | 亿联网络 | 300 | 创业板 | 20260715 | +4.62% | 33.96~35.53 | 36.71 | 35.64 | +3.00% | +3.32% | 2.15 | 4.40亿 |
| 列 | 含义 |
|---|---|
| 代码/名称 | 标的 |
| 指数 | 所属指数 (300=沪深300, 500=A500, 50=科创50) |
| 缺口日 | 缺口形成日期 |
| 缺口% | 跳空幅度 |
| 缺口区间 | 缺口下沿~上沿 (即回补位参考区间) |
| MA60% | (现价 - MA60) / MA60,正值=MA60 上方 |
| 距上沿% | (现价 - 缺口上沿) / 缺口上沿,正值=远离缺口,负值=已回补 |
| 量比 | 缺口日成交额 / 20 日均额,>1=放量 |
| 20日均额 | 近 20 日平均日成交额 |
reports/gap-scan/{yyyymmdd}.md: 全量命中表 + 逐股简析(含催化待查提示)+ 排除/未命中统计 + 运行参数。
~/.local/share/investment/gap_scan_cache/
|-- universe_20260719.pkl (成分股列表, 28 KB)
|-- kline/ (固定段键目录, v0.2.5)
| |-- tushare/ (按数据源隔离)
| | |-- 000001.SZ.pkl
| | `-- ...
| `-- baostock/
| |-- 000001.SZ.pkl
| `-- ...
{YYYYMMDD} 日期目录随 v0.2.5 一次性清理)--no-cache 跳过加载,重新拉取并覆盖| 来源 | 需要 | 用途 |
|---|---|---|
| Tushare Pro | TUSHARE_TOKEN (>=120 积分) | K 线 (批量按日) + 复权因子 + 交易日历 |
| baostock | 无 (默认兜底) | K 线 (逐股, 前复权 adjustflag=2) |
| akshare | 无 | 指数成分股 (index_stock_cons) |
auto:
1. 检查 TUSHARE_TOKEN -> 有 -> TushareBulkSource (快速批量)
2. 无 -> BaostockSource (逐股兜底)
交易日历:
1. Tushare trade_cal API -> 真实日历 + 停牌检测
2. 失败 -> 自然日估算 (Mon-Fri) + 跳过停牌检测
| 原因 | 含义 |
|---|---|
| 获取失败 | API 拉取失败或网络错误 |
| 低流动性 | 20 日均额 < --min-avg-amount |
| 上市不足 | K 线根数 < --min-list-days |
| 数据缺失 | 缺少复权因子 (仅 Tushare 路径) |
| ST | ST 标的 (名称含 "ST") |
| 退市 | 退市标的 (名称含 "退") |
| 原因 | 含义 |
|---|---|
| 无缺口 | 回溯窗口内无 low[i] > high[i-1] |
| 低于阈值 | 有缺口但幅度 < --gap-min-pct |
| MA60破 | 缺口后某日收盘 < MA60 |
| 缺口回补 | 缺口后最低价触及或跌破缺口上沿 |
| 量比低 | 缺口日量比 < --gap-min-vol-ratio (仅 >1.0 时生效) |
对命中的标的,接 /invest-a-stock {symbol} 做深度基本面研究。