--- name: stock-picks description: "每日复盘后的股票推荐(多维度选股)— 综合 A股每日复盘(市场方向/板块/资金/新闻情绪)+ 个股深度分析(9层),用多维度筛选条件(L2微观结构为主/模型融合分/仓位信号/板块强度/新闻情绪)从全市场挑出未来几天大概率走强的股票,支持跨多日聚合(--window),输出候选榜 + 综合复盘 + Top 个股深度分析,落盘 PDF 到股票报告目录。用户说「选股」「推荐股票」「每日推荐」「明日看好」「选股推荐」「复盘后选股」时使用:跑复盘取数 → pick_candidates 多维打分 → Top N 深分 → 综合报告 → PDF。触发词:选股、股票推荐、每日推荐、明日看好、推荐股票、今日选股" --- > ⚙️ 本技能遵循公共运行环境契约(最高优先级,先于本文其余内容执行): > 详见 [_shared/env-contract.md](../_shared/env-contract.md),执行前先读它。 # stock-picks — 每日复盘后的股票推荐(多维度选股) 把「每日复盘」(市场广度)和「个股深度分析」(个股深度)两张皮缝起来:先用复盘产物定市场环境(该不该进场、主线在哪、资金方向),再用多维度筛选条件从全市场挑候选,对 Top N 做 9 层深分,最后输出**一份报告**:综合复盘 + 候选榜 + Top 个股深分。报告 Markdown + PDF,落盘前端「股票报告」页可见目录,聊天回复速览。 **定位**:`[[daily-review]]` 是广度(今天市场发生了什么),`[[stock-market-analysis]]` 是深度(某只股票值不值得看),本 skill 是**两者合一的推荐**——先选再深挖,产出可执行的候选池,不是复盘报告。 ## ⚠️ 铁律(先读,最高优先级) | 陷阱 | 正确口径 | |---|---| | **推荐不是承诺** | 所有候选是「多维信号合成的相对强势」,不是「明天必涨」。报告必须带风险声明 + 数据滞后声明 | | **ST 股默认排除** | ST/*ST/退 有 5% 涨跌幅限制 + 退市风险,`pick_candidates.py` 默认排除(`--keep-st` 才保留) | | **信号日取最近「全量」推理日** | 默认 = distinct symbol ≥ 1000 的那天(`engine_signal_scores`),避免最近只推理了几十只的残日;`--date` 可显式指定 | | **分数单位** | fusion_score 是模型预测分(非涨跌幅);position_score 0~1 是半凯利仓位;pct_industry 是行业截面百分位 | | **L2 是 T+5/T+10 信号** | VPIN 族正 IC(高分偏多)、vol_persistence 等负 IC(高分偏空)——看状态分位,别当单日信号 | | **趋势不纳入** | 模型分数趋势维度按需求移除——打分只用 L2/融合/仓位/板块/新闻,不参与排名 | | **L2 主导** | L2 权重(40%) > 融合分(30%):L2 是 T+5/T+10 信号,先看订单簿微结构,再看模型预测 | ## 执行流程(固定 6 步) ### 第 1 步:跑每日复盘取数(复用 [[daily-review]]) ```bash # ① 宿主机:daily_review.py 出 指数/广度/板块/资金/L1/L2 + 模型推理信号 + 次日方向 cd /skills/daily-review/scripts python3 daily_review.py --date 20260821 # 不带 --date 取最新交易日 # ② 容器内:news_review.py 聚合当日新闻情绪(先跑这个,新闻维度才能加权) docker cp /skills/daily-review/scripts/news_review.py quantmind:/tmp/ docker exec quantmind python3 /tmp/news_review.py --date 20260821 ``` 产出:`data/reports/daily_review/{YYYY-MM-DD}_stats.json` + `{YYYY-MM-DD}_facts.md` + `{YYYY-MM-DD}_news.json`。 这一步给推荐提供:市场方向(六维)、主线板块、资金流向、新闻聚焦板块、L2 微观结构状态——**推荐必须和市场环境自洽**(大盘空仓日不该推满仓,杀跌板块的个股即使分数高也要警惕)。 ### 第 2 步:多维度选股(本 skill 脚本) ```bash python3 /skills/stock-picks/scripts/pick_candidates.py --data-date 20260821 --window 3 --top 30 --json # 跨3日聚合 python3 /skills/stock-picks/scripts/pick_candidates.py --data-date 20260821 --window 1 --top 30 --json # 严格单日(无未来视觉) python3 /skills/stock-picks/scripts/pick_candidates.py --top 30 --json # 默认最近全量推理日 python3 /skills/stock-picks/scripts/pick_candidates.py --top 30 --json --no-l2 # 跳过 L2(更快) ``` 产出:`data/reports/stock_picks/{YYYYMMDD}_picks.json`(全量候选 + 每维分解)+ `{YYYYMMDD}_picks.md`(排名表骨架)。 **多维度打分 = 六维加权**(满分 1.0,L2 主导):L2 40% / 融合 25% / L1动量 15% / 仓位 10% / 板块 5% / 新闻 5%。趋势不纳入。**单模型铁律**:只用默认日推模型(5eea5418)的单一 run 分数,杜绝多模型融合。**默认精选 5 只**。 **跨日聚合**:`--window N` 从数据日起往前 N 个推理日,每股取跨日复合分均值后排名(`--window 1` = 严格单日无未来视觉)。 **硬过滤**:① 无融合分数剔除;② 仓位门 `position_score>0 或 行业百分位≥80%`(避免大盘空仓日推满仓);③ 默认排除 ST。 未含维度(如当日无 news.json、L2 分区缺失)时该维中性 0.5,`picks.md` 头部会标注「未含:L2, 新闻」——报告里要声明,不能假装都有。 ### 第 3 步:Top N 深分(复用 [[stock-market-analysis]]) 对候选榜前 5~10 只跑 9 层深分,取 `--json` 输出供报告引用: ```bash python3 /scripts/stock_9layer_fetch.py 001237.SZ --json # 宿主机 # 输出 /tmp/001237_9layer.json(23 因子 vs 全市场截面分位 + IC 方向) ``` 深分重点核对(和候选维度互相印证,**发现矛盾要写进报告**): - **L3 技术位**:候选时点 vs MA20/前高——分数高但跌破 MA20 的是矛盾项 - **L4b 微观结构**:正 IC 因子(VPIN 族)是否处于健康分位 - **L6 模型**:该股历史推理信号 vs 当日融合分,是否一致 - **L7 新闻**:有没有个股直接消息/相关行业消息,和三步纵深结论 ### 第 4 步:综合报告写作(Markdown,模板见下) **报告 = facts.md 的事实 + picks 骨架的数字 + 深分的数值 + 你的解读。facts/picks/深分没有的数字禁止出现。** 推荐榜数字必须照抄 `picks.json`,深分数字必须照抄 `/tmp/{code}_9layer.json`,禁止臆造。 ### 第 5 步:Markdown → PDF + 落盘(必做,只发 /tmp = 未交付) ```bash # Markdown → PDF(研报风,复用 md_to_pdf_report.py) docker cp 选股推荐.md quantmind:/tmp/picks.md docker exec quantmind bash -lc "cd /app && python3 backend/scripts/md_to_pdf_report.py /tmp/picks.md /tmp/picks.pdf" docker cp quantmind:/tmp/picks.pdf 选股推荐.pdf # 落盘股票报告目录(宿主机必须 docker cp,目录 owner 是容器 root) docker cp 选股推荐.md quantmind:/data/reports/stock_reports/每日选股/每日选股推荐_2026-08-21.md docker cp 选股推荐.pdf quantmind:/data/reports/stock_reports/每日选股/每日选股推荐_2026-08-21.pdf ``` 落盘后 `ls` 确认 md + pdf 都在(前端「股票报告」页 → 每日选股 文件夹)。 ### 第 6 步:聊天回复速览 ```markdown **每日选股推荐 2026-08-21(周五)** 一句话:…(市场环境 → 推荐逻辑 → 候选池特征) 市场:上证 +0.01% / 深成 +0.45%;涨停 64 / 跌停 14;主线 …;资金 …;次日方向 看多/看空(xx/11,★★★) Top5 候选(五维综合,L2 主导): 1. 惠康科技 001237 — L2 0.80 / 融合 0.0365 / 仓位 84% / 行业分位 100% 2. 今天国际 300532 — …(每只 1 行,标注最强维度 + 该股风险点) 3. … 深分亮点:Top3 中 X 只技术位健康、L2 VPIN 分位 >70%……(哪些候选通过了深分、哪些有矛盾) ⚠️ 以上为模型信号合成的相对强势候选,非投资建议;数据截至 2026-08-21(两融/北向滞后见数据说明) → 完整报告已落盘「股票报告 → 每日选股」目录 ``` ## 多维度筛选条件详解(写报告时逐维引用) | 维度 | 权重 | 数据源 | 怎么判读 | |---|---|---|---| | L2 微观结构 | **40%** | `l2_factors` 正 IC 因子 + 负 IC 因子(负 IC 反转) | 正 IC 高=知情资金活跃;负 IC 低=毒性/波动小;健康分 = 0.5×正IC分位 + 0.5×(1−负IC分位) | | 模型融合分数 | 30% | `engine_signal_scores.fusion_score` 幅度归一 | 融合分越高=模型预测收益越强;用默认单模型(日推模型) | | 仓位信号 | 15% | `quality.position.position_score` | 0.8+ = 强行业地位 + 半凯利高仓位;<0.3 弱;数据缺失不拦 | | 板块强度 | 10% | `industry_top10_avg` 截面分位 + 板块超级大单净额 | 行业头部强度 + 当日板块大单净流入(跌市抄底方向反推) | | 新闻情绪 | 5% | `news_review.py` 产物 `news.json` | net_ratio>0 偏多;有直接个股新闻的优先 | **报告里每只候选必须能说清「它强在哪几个维度」+「弱在哪」**,禁止只贴数字不解读。候选若和市场主线、次日方向冲突,必须明说。 ## 报告模板 ```markdown # 每日选股推荐 2026-08-21(周五) > **报告日期**:2026-08-21 > **数据截至**:2026-08-21(信号日) > **口径**:候选来自最近全量推理日 engine_signal_scores + l2_factors + 当日新闻情绪;五维加权(L2 40/融合 30/仓位 15/板块 10/新闻 5,趋势不纳入) ## 一、市场环境(综合复盘,从 facts.md 提炼) 指数/广度/量能/主线/资金 2-4 句 + 次日方向(六维合成)+ 一句话「该不该进场/什么风格占优」。 **这里定推荐基调**:市场偏强推进攻型,震荡降仓位,弱势只列观察不推荐。 ## 二、候选榜(Top10,照抄 picks.md) 表格:# / 代码 / 名称 / 综合分 / L2 / 融合 / 仓位 / 行业分位 / 覆盖日 / 行业 / 板块大单 每只标注最强维度 + 一句话依据。 ## 三、Top 个股深度分析(前 3-5 只,用 stock_9layer_fetch --json 结果) 每只分节: ### {名称}({代码}) - **候选维度**:最强维度 + 分数 - **9层核对**:L3 技术位(vs MA20)、L4b 微观结构(VPIN 分位)、L6 模型一致性、L7 新闻(三步纵深结论) - **风险点**:弱维度 / 技术矛盾 / 板块杀跌风险 - **综合判断**:推荐 / 观察 / 剔除(剔除要写原因) ## 四、推荐逻辑与风险声明 - 候选池与市场主线一致性:命中/偏离 - 数据滞后声明(从 facts.md 复制) - ⚠️ 本报告为模型信号合成的相对强势候选,非投资建议。股市有风险,投资需谨慎。 ## 五、明日验证清单 2-4 条可验证预期(明天能判断对错的):如「Top5 平均跑赢全市场」「候选集中板块继续走强」等 ``` ## 维护 - 核心脚本:`scripts/pick_candidates.py`(宿主机跑;PG `engine_signal_scores` + `stock_aliases`,QuantDB `l2_factors`,`news_review.py` 产物) - 依赖技能:`[[daily-review]]`(复盘取数)、`[[stock-market-analysis]]`(深分)、`[[quantdb-fields]]`(单位口径) - 权重/阈值改 `pick_candidates.py` 顶部常量(`W_*`、`_POSITION_GATE`、`_MIN_SIGNAL_COVERAGE`) - 单测:`cd scripts && python3 -m pytest tests/ -q`(覆盖打分/过滤/趋势/单位)