一阳穿三线 · 信号引擎
A股「一阳穿三线」信号引擎。不设虚拟资金、不做模拟持仓与模拟成交、不做仓位管理,只输出信号与报告。
适用场景
用户给出一条「一阳穿三线选股 + 每交易日扫描 + 报告 + 跟踪池卖出」的规格,要求部署成能自动跑的系统。
典型:开盘价 < MA5/MA13/MA21 且 收盘价 > MA5/MA13/MA21 且 成交量 > MA15量×2 → 每交易日 14:30 / 15:05 各跑一次
→ 每日一份纯文本报告 + 一份白底 HTML 看板 + 一张 PNG 图 + 一份 JSON 明细。
卖出信号走跟踪池而不是模拟持仓:跟踪池 = 近 20 个交易日内出现过买入信号的股票,只用来确定「哪些票要复核卖出条件」,只记录代码、名称、买入日、买入价,不含股数、成本、资金、仓位,且不单独输出清单。
SkillHub 安装
将下面这句话发送给另一台电脑上的 WorkBuddy:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_dd0fc5e5/yycsx-signal-engine
安装完成并重新加载技能后,按下方流程运行。不要复制发布者电脑上的用户目录或 Python 路径。
快速部署(照做)
- 从当前已加载技能的 base directory 取得
SKILL绝对路径。 - 选择本机可用的 Python 3 绝对路径作为
PY:优先使用 WorkBuddy 托管运行时,其次使用当前sys.executable,最后才使用 PATH 中的python3/python。 - 以下命令中的
<技能实际安装目录>与<Python 3绝对路径>必须替换为本机实际值。
SKILL="<技能实际安装目录>"
PY="<Python 3绝对路径>"
# 1) 单只/小样本冒烟测试(必做,验证网络与依赖;输出落到 _测试 文件,不覆盖正式报告)
"$PY" "$SKILL/scripts/strategy_scanner.py" --limit 60 --workers 6 --interval 0.08
# 2) 正式全量扫描(沪深全A约 5000 只,14 并发约 9 分钟)
"$PY" "$SKILL/scripts/strategy_scanner.py" --workers 14 --interval 0.03
# 3) 同上,并额外把看板渲染成 PNG(需本机 Chrome 或 Edge)
"$PY" "$SKILL/scripts/strategy_scanner.py" --workers 14 --interval 0.03 --png
# 4) 用当日明细 JSON 重新渲染报告/看板/PNG(不重新扫描,秒级)
"$PY" "$SKILL/scripts/render_only.py"
# 5) 历史回测(默认 2025-01-01 ~ 2026-06-30,可通过 --start/--end 改)
"$PY" "$SKILL/scripts/backtest_yycsx.py" --workers 12 --interval 0.02
# 6) 单独把任意 HTML 渲染成 PNG
"$PY" "$SKILL/scripts/shot_report.py" <html路径> <png路径>
参数说明:
| 参数 | 默认 | 说明 |
|---|---|---|
--workers |
6 | 并发度。全量建议 14 |
--interval |
0.12 | 单请求间隔秒。全量建议 0.03 |
--bars |
90 | 回溯K线根数,最少 65 |
--limit |
0 | 只扫前 N 只(测试用)。限定扫描时报告写入 _测试 文件,绝不覆盖当日正式报告 |
--force |
关 | 跳过交易日校验(非交易日也能跑,仅供调试) |
--refresh-pool |
关 | 忽略本地候选池快照,强制重取 |
--png |
关 | 生成看板后追加渲染 PNG |
--capital / --max-hold |
100万 / 5 | 仅回测脚本:初始资金与最大同时持仓数 |
全部数据来自公开接口,无需任何 API Key:候选池来自东方财富全A股列表(失败降级新浪),日K线来自腾讯自选股前复权接口。
首次运行耗时说明:第一次运行需要抓取全A候选池(约 5200 只),耗时约 1 分钟;抓完会写入
outputs/cache/pool_snapshot.json,当日后续运行直接命中快照,仅需数秒。
若东方财富接口不可用(返回连接被关闭 / 限流),脚本会在连续 6 页失败后自动熔断并切换到新浪行情中心取全A名单,
不会长时间卡住;日志会打印 [WARN] 东财池连续 N 页失败,熔断并转备用源。当天结束前不会重试东财池(用快照),
次日自动重新抓取。如需立即重抓,加 --refresh-pool。
完整策略规格(八节,全部保留)
一、候选池
标的范围:沪深全A。
剔除规则:
- ST、*ST、退市、PT 等风险警示股,一律剔除。
- 停牌股剔除:当日K线缺失,或最后一根K线的日期不等于当日,视为停牌或已退市,不产生任何信号。
- 上市不足 65 个交易日的次新股剔除:历史数据不足以计算均线。
- 单日涨跌幅超出板块涨跌停限制(超过 ±21.5%)的,视为复权或数据异常,剔除。
二、技术指标
价格均线:MA5、MA13、MA21(基于收盘价计算)。
成交量均线:MA15(基于日成交量计算)。
数据源:腾讯自选股前复权日线,回溯 90 个交易日,最少 65 个交易日。
均线口径(关键):
- 条件1、条件2 与穿透幅度所用的均线,一律取「截至前一交易日收盘」的值,不含当日收盘价。
理由:开盘价在 9:25 就已确定,若均线含当日收盘价,一根大阳线会把均线自身抬高
(当日收盘 - 前第 n 日收盘)÷ n,使「开盘价低于均线」近乎白送成立,等于用收盘结果反推开盘位置。
实测:改为前一交易日口径后,买入信号由 14 只降到 9 只,被剔除的 5 只全部是靠口径成立的假信号。 - 死叉判定所用的 MA5、MA13 含当日收盘价,因为交叉是当日发生的均线事件。
- 量比分母为前 15 个交易日均量,不含当日成交量(否则名义 2 倍、实际门槛约 2.15 倍)。
三、买入信号(三个条件必须同时满足)
条件1 — 低开:当日开盘价 < MA5 且 开盘价 < MA13 且 开盘价 < MA21。
条件2 — 一阳穿三线:当日收盘价 > MA5 且 收盘价 > MA13 且 收盘价 > MA21。
条件3 — 放量:当日成交量 > MA15成交量 × 2(即量比大于 2 倍)。
以上三条中的均线,均按「二、技术指标」的均线口径取前一交易日数值。
只有以上三个条件全部满足,才产生买入信号。
排序规则:所有买入信号按「穿透幅度」从大到小排序。
穿透幅度 =(收盘价 - max(MA5, MA13, MA21))÷ max(MA5, MA13, MA21) × 100%。
状态标注:
- 当日涨停封板的,标注「涨停·难成交」,实战中无法按信号价成交,列出仅作形态记录。
- 按穿透幅度排名前 5 的,标注「★优先」,仅表示信号强度靠前,不代表买入数量。
四、卖出信号
触发条件:MA5 下穿 MA13(死叉),即:
前一日 MA5 ≥ 前一日 MA13,且当日 MA5 < 当日 MA13。
卖出信号只对跟踪池内的股票生效:近 20 个交易日内曾出现过买入信号的股票,
今日若触发死叉,逐只列出,并附买入日、买入价、现价、浮盈比例、当日涨跌幅。
不在跟踪池内的股票,即便触发死叉也不列入卖出清单,不做全市场死叉统计。
排序规则:按当日涨跌幅从小到大排序。
五、信号输出
一份报告只输出两部分:买入信号清单、卖出信号清单(均以表格形式逐行展示)。
- 同一只股票当日若同时满足买入和卖出条件,只列入买入清单,不重复计入卖出清单。
- 跟踪池只在内部维护,不单独输出清单:它只记录信号本身(代码、名称、买入日、买入价),
不记录持仓、资金、成交、仓位;有效窗口为最近 20 个交易日内出现过买入信号。 - 跟踪池内的股票触发死叉后,下一交易日从跟踪池移出。
- 报告底部以一行文字提示当前跟踪池只数,不逐只罗列。
六、自动化运行
运行频率:每个交易日(周一至周五)运行两次。
- 14:30 盘中预警:收盘价与成交量为盘中值,用于提前获知信号。
- 15:05 收盘定稿:全天数据完整,作为最终结论。
两次运行写入同一份报告,当日以收盘定稿为准。
运行逻辑:
- 校验当日是否为交易日(以上证指数日线最后一根K线日期为准),非交易日直接停止。
- 获取候选池名单(优先使用当日快照,缺失或残缺时重新获取)。
- 读取跟踪池(近 20 个交易日内的买入信号),在扫描时对池内股票额外采集当前状态。
- 逐只拉取前复权日线,按剔除规则过滤。
- 计算 MA5、MA13、MA21、MA15 成交量,按均线口径判定买入与卖出信号。
- 买入信号按穿透幅度降序输出,卖出信号按跌幅升序输出,生成当日纯文本信号报告。
七、输出要求
- 一个 Python 核心扫描脚本(
strategy_scanner.py),可独立运行。 - 每次运行生成一份纯文本信号报告,只包含两节(不含规则摘要、不含数据与免责、不含跟踪池清单):
- 第一节 买入信号清单(代码、名称、现价、穿透幅度、量比、涨跌幅、状态)
- 第二节 卖出信号清单(代码、名称、买入日、买入价、现价、浮盈、涨跌幅) - 报告头部只给一行:交易日与数据时点、有效扫描数、剔除数;盘中运行加一行盘中提示。
- 同时生成一份可视化看板(自包含 HTML,白色底色,表格形式逐行展示信号,含 KPI 数字卡、
穿透/量比迷你条形图、状态标签),并渲染成一张 PNG 图片;
HTML 与 PNG 均自包含、无外部依赖,可直接浏览器打开或截图分享。 - 同时输出一份同结构的 JSON 明细文件,供后续核对与二次加工。
八、注意事项
- 均线计算需要从最早到最新排列K线数据。
- 数据可能因交易日不连续而不足,需跳过数据不足的股票。
- 所有运算使用前复权价格。
- 报告中穿透幅度的计算公式:(收盘价 - max(MA5, MA13, MA21))÷ max(MA5, MA13, MA21) × 100%。
- 退市或长期停牌股票的K线会停留在多年前的日期,必须用「最后一根K线日期必须等于交易日」来拦截。
- 候选池分页获取可能中断,必须对失败页做重试与补齐,缺口过大时用备用源并集补齐;
残缺名单不得覆盖已有的完整快照。 - 买入与卖出在同一只股票上可能同时成立(MA5 略低于 MA13,但价格已跳上三条均线),
报告层须做互斥处理,买入优先。 - 涨停封板的股票在报告中不做剔除,标注「涨停·难成交」并统计数量。
- 14:30 运行时收盘价与成交量均为盘中值,尾盘跳水会让买入信号失效,成交量也只累积约八成;
当日 15:05 的收盘定稿运行结果会覆盖盘中预警,报告按交易日命名,取最新一次结果。 - 测试运行(限定扫描只数时)必须写入独立文件,不得覆盖当日正式报告。
历史回测器
scripts/backtest_yycsx.py 与信号脚本共用完全相同的策略口径,可直接回测任意区间。
"$PY" "$SKILL/scripts/backtest_yycsx.py" --start 2025-01-01 --end 2026-06-30 --workers 12 --interval 0.02
回测假设(可在命令行调整):
| 项 | 值 |
|---|---|
| 成交时点 | 信号 T 日收盘确认,T+1 开盘成交(不使用未来价格) |
| 持仓上限 | 最多 5 只,等权分配 |
| 无法买入 | T+1 开盘涨停(主板 10% / 双创 20%)自动跳过 |
| 交易成本 | 买入 0.03%,卖出 0.03% + 印花税 0.05% |
| 卖出条件 | MA5 死叉 MA13(与信号脚本一致) |
| 区间末 | 未平仓的按最后一日收盘价强平 |
| 基准 | 沪深300(sh000300) |
输出 outputs/backtest/ 下的回测报告 .txt、白底看板 .html(净值曲线 vs 沪深300 + 月度柱 + 交易明细)、数据 .json。
已知局限(必须告知使用者):候选池用的是当前沪深全A名单,区间内已退市的股票不在池中,存在幸存者偏差,实际收益可能略低于回测值。
引擎落点(规格 → 实现对照)
| 规格 | 实现 |
|---|---|
| 一.1 ST/退市/PT 剔除 | is_st():全角归一化后判断,含 ST/退/PT |
| 一.2 停牌与退市拦截 | 扫描时校验 bars[-1]["date"] == 交易日,不等则跳过并计 stale |
| 一.3 次新股 | len(bars) >= MIN_BARS(65) 才参与 |
| 一.4 异常涨跌 | 单日涨跌幅绝对值 > 21.5% 剔除,计 anomaly |
| 二.1 穿线均线口径 | evaluate() 用 ma(closes, n, i-1),即截至前一交易日收盘 |
| 二.2 死叉口径 | 用含当日收盘的 ma5/ma13,与前一日 pma5 >= pma13 比较 |
| 二.3 量比口径 | 分母 ma(vols, 15, i-1),不含当日成交量 |
| 三 买入三条件 | c1 and c2 and c3,穿透幅度按前一交易日三线最高值算 |
| 三 状态标注 | is_limit_up() 按板块判定(主板 10% / 双创 20%),前 5 名标 ★优先 |
| 四 跟踪池 | load_track_pool(trade_date, TRACK_DAYS=20) 从历史明细 JSON 收集买入信号 |
| 五 互斥 | 当日买入的票不进卖出清单(买入优先) |
| 五 池内采集 | scan(track_codes=...):池内股票无论有无信号都采集当前状态,用于算浮盈 |
| 六 交易日校验 | 上证指数 sh000001 日线最后一根日期 == 今天,否则退出(除非 --force) |
| 七 报告 | build_report() 两节纯文本 + build_html_report() 白底看板 + JSON 明细 |
| 七 PNG | shot_report.py 用 headless Chrome/Edge 自适应高度截图 |
| 八.10 测试隔离 | --limit 时报告文件名加 _测试 后缀 |
目录结构
<技能安装目录>/
├── SKILL.md
├── references/
│ ├── strategy_spec.txt # 纯文字版策略指令(可直接复制粘贴到对话框)
│ └── pitfalls.md # 踩坑清单
├── scripts/
│ ├── strategy_scanner.py # 核心信号扫描
│ ├── backtest_yycsx.py # 历史回测
│ ├── render_only.py # 用当日 JSON 重渲染报告/看板
│ └── shot_report.py # HTML → PNG
└── outputs/ # 运行时自动生成
├── reports/
│ ├── 一阳穿三线信号报告_YYYYMMDD.txt
│ ├── 一阳穿三线信号看板_YYYYMMDD.html
│ ├── 一阳穿三线信号看板_YYYYMMDD.png
│ ├── 一阳穿三线信号数据_YYYYMMDD.json
├── cache/
│ ├── pool_snapshot.json # 候选池当日快照
│ └── bars_*.pkl # 回测K线缓存
└── backtest/ # 回测报告与看板
自动化部署(两条)
| 时点 | 作用 | rrule |
|---|---|---|
| 14:30 | 盘中预警 | FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR;BYHOUR=14;BYMINUTE=30 |
| 15:05 | 收盘定稿 | FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR;BYHOUR=15;BYMINUTE=5 |
> ⚠️ 定时任务不能随技能包分发。 它绑定使用者本机的 Python 绝对路径与工作目录,
> 只能在各自账号里建一次。
给智能体的指令
部署完成后,实际建出这两条定时任务,不要只把 rrule 打印给用户看。
对每条调用平台自动化工具,字段对应:
| 值 | 落到自动化工具的参数 |
|---|---|
| 「一阳穿三线·A股信号扫描(交易日 14:30 盘中预警)」 | 任务名称 |
recurring |
调度类型 |
| 上表对应 rrule | 重复规则 |
ACTIVE |
状态 |
| 使用者本机工作目录 | cwds |
| 下方 prompt 模板 | prompt(整段原样使用,路径替换为本机实际值) |
prompt 模板(把 <技能实际安装目录> 与 <Python 3绝对路径> 替换为本机实际值):
运行一阳穿三线量化信号扫描,输出信号报告与可视化看板。
执行命令(Windows 用 bash,macOS/Linux 用对应 shell):
cd "<工作目录>" && "<Python 3绝对路径>" "<技能实际安装目录>/scripts/strategy_scanner.py" --workers 14 --interval 0.03 --png
脚本为纯信号扫描器,无模拟持仓、无仓位管理、无成交撮合。候选池沪深全A,
数据取腾讯自选股前复权日线,无需 API Key。
输出文件(<技能实际安装目录>/outputs/reports/):
- 一阳穿三线信号报告_YYYYMMDD.txt(纯文本,两节:买入信号 / 卖出信号)
- 一阳穿三线信号看板_YYYYMMDD.html(白底表格看板)
- 一阳穿三线信号看板_YYYYMMDD.png(看板图片)
- 一阳穿三线信号数据_YYYYMMDD.json(明细)
执行后请:
1. 用 present_files 打开当日看板 PNG,再用中文纯文本汇报:交易日与数据时点、有效扫描只数、
买入信号清单(代码/名称/现价/穿透幅度/量比/涨跌幅/是否涨停)、卖出信号清单、跟踪池只数。
2. 若当日无买入信号,明确写「今日无股票同时满足三个买入条件」,不要编造标的。
3. 若脚本报「非交易日或行情未更新」,直接说明当日休市,不做任何补数或模拟。
4. 14:30 那次结尾提醒:这是盘中数据,以 15:05 收盘定稿为准。
5. 结尾附一句风险提示:技术形态存在失败概率,信号仅供研究参考,不构成投资建议。
不要新增持仓/仓位/模拟交易逻辑;不要修改脚本中的策略参数(MA5/13/21、MA15、量比2倍、跟踪池20个交易日)。
第 3 步:验收
"$PY" "$SKILL/scripts/strategy_scanner.py" --limit 60 --workers 6 --interval 0.08
能出报告即部署成功。全量正式扫描耗时约 9 分钟,属正常。
此设计的边界(诚实告知使用者)
- PNG 渲染依赖本机 Chrome 或 Edge;找不到时脚本会跳过 PNG 并给出提示,不影响文本报告与 HTML 看板。
- 全量扫描约 5000 只 × 1 次请求,14 并发 + 0.03s 间隔是实测稳定档;再激进会被行情源限流。
- 换机器后必须重新建自动化任务(解释器与技能绝对路径因机器而异)。
输出约定
[POOL]候选池来源与只数[TRACK]跟踪池只数[SCAN]扫描进度与耗时[OUT]报告 / 看板 / 明细的输出路径[STOP]非交易日直接结束[WARN]数据源降级等提示
踩坑清单
见 references/pitfalls.md(均线口径自我实现、量比分母、退市股K线停留、东财分页中断、涨停标记、截图路径等)。