Imported from starriv/worth-buy-stocks (
SKILL.md). Install upstream withnpx skills add starriv/worth-buy-stocks. Copyright stays with the author.
值得买 - 股票与期权卖方
硬性纪律
全文唯一权威约束,任何步骤、任何 agent 不得违反:
- 只分析不交易:不创建/修改/取消订单;账户与持仓只读;不使用其他券商连接器。
- 脚本是唯一评分来源:指标、评分、结论、计划价一律以脚本输出为准。不手算 MACD/RSI/KDJ/均线/评分,也不让 sub-agent 手算或多 agent 竞争评分再投票。
- 新闻面只降级不加分:利好新闻、催化剂、分析师目标价、估值叙事不改评分,不能把
观察/否升级为是;无来源、过期或不可验证的信息不得触发降级。 - 数据诚实:核心价量缺失输出
无法评分,其余缺失写无法确认;不编造结论或持仓。 - 不泄露凭证:不打印、保存或输出 Alpaca/Finnhub/Telegram 密钥。
- feed 固定
iex:只有用户明确说明有 SIP 权限并要求使用sip时才切换。 - 最终回复是书面交易决策:默认只输出结论,不输出思考过程、工具计划或逐步计算;不展示源码、命令参数、JSON 路径、字段名、布尔值、空数组、
null或内部状态,全部翻译成自然语言。每一项都写成正式决策或事实陈述("通过""维持观察""按 X 价分批"),两类句式禁止出现:(a) 机制性否定——描述评分内部"没发生什么"的句子,如"未影响评分""评分未被新闻压低""不构成临近财报降级""未用于降级/升级/调整建议";(b) 免责声明与限定语,如"仅为分析参考""仅作重评参照""不构成下单指令"。未触发的环节直接给结论状态("通过"),不解释机制;触发了的只写事实原因与决策结果。用户明确要求原始 JSON 或调试信息时例外。 - 仅支持美股(Alpaca 覆盖标的);非美股 ticker 直接说明不支持,不要强行评分。
- 期权只做定义风险筛选:支持同到期 Bull Put / Bear Call 垂直信用价差、对称翼宽 Iron Condor、ATM 同体价对称翼 Iron Butterfly,以及同行权价、同类型、卖近月买远月的净借记长日历价差;不分析裸卖、Diagonal、broken-wing、0DTE,不提交订单。期权评分只能来自
options_seller.py,不得用股票score代替。
数据角色:Alpaca 价量是主证据;新闻/公告默认作为事件风险 overlay;Alpaca 持仓默认作为只读敞口 overlay;Finnhub 是可选补充(quote 交叉校验、公司新闻、财报日历、元数据),不得替代 Alpaca 主链路。AI 意见(脚本内置调用 Claude API 生成)默认作为对照展示 overlay:只用于让用户对比"量价纪律结论 vs AI 判断",不参与评分、不触发降级、不可用于升级或改写结论;不可用时如实写"无法确认",不得编造或自行补写 AI 意见。
框架取向:主路径参与趋势延续、相对强度领先和强趋势内的回调拐点;独立恢复路径只处理深度回撤后的高置信放量强反转,保持排名分原值并将试仓封顶 15%。普通弱势修复、过热追高末端和估值叙事继续回避。持仓保护在达到 1R 后转保本与移动止损,高位反转或有效趋势破位按下一开盘退出。
环境检查
若 alpaca、Python 或 Alpaca 凭证未配置,不要继续评分,把 references/setup.md 的清单给用户在本机执行。降级规则:
- 账户/持仓读取失败:敞口 overlay 记为不可用,价量评分照常执行。
- 新闻检索能力不可用:新闻面写"无法确认",价量评分照常执行。
- Finnhub 无 key 或限流:自动跳过,不影响评分。
- AI 意见无
ANTHROPIC_API_KEY、未装anthropicSDK 或调用失败:自动跳过,结论段写"AI 意见: 无法确认"。 - SQLite 缓存异常:先运行
python3 "$SKILL_DIR/scripts/cache_admin.py" integrity-check;在线评分可用--cache off建立无缓存对照。
期权卖方筛选
用户问期权卖方、卖权利金、BOLL/信用价差、Iron Condor、Iron Butterfly、日历价差或 Delta 中性 IV 策略时,读取 references/options-seller.md 并走独立入口;不要套用股票版 7 段评分,也不要先要求股票结论必须为“是”。策略层按 vertical_credit、calendar_iv、iron_condor 与 iron_butterfly 独立完成标的初筛、链窗口、结构构造和评分;all 只合并候选,不混用各模块硬闸门。
单标的分析:
python3 "$SKILL_DIR/scripts/options_seller.py" analyze \
--symbol {TICKER} --strategy vertical_credit \
--feed iex --option-feed auto \
--cache-db "$SKILL_DIR/data/market-data.sqlite3" > options-result.json
全市场两阶段扫描:
python3 "$SKILL_DIR/scripts/options_seller.py" scan \
--strategy vertical_credit --feed iex --option-feed auto \
--chain-top 25 --top 20 \
--cache-db "$SKILL_DIR/data/market-data.sqlite3" > options-scan.json
Delta 近零长日历价差:
python3 "$SKILL_DIR/scripts/options_seller.py" analyze \
--symbol {TICKER} --strategy calendar_iv \
--feed iex --option-feed auto \
--cache-db "$SKILL_DIR/data/market-data.sqlite3" > calendar-result.json
区间震荡 Iron Condor:
python3 "$SKILL_DIR/scripts/options_seller.py" analyze \
--symbol {TICKER} --strategy iron_condor \
--feed iex --option-feed auto \
--cache-db "$SKILL_DIR/data/market-data.sqlite3" > iron-condor-result.json
窄区间 Iron Butterfly:
python3 "$SKILL_DIR/scripts/options_seller.py" analyze \
--symbol {TICKER} --strategy iron_butterfly \
--feed iex --option-feed auto \
--cache-db "$SKILL_DIR/data/market-data.sqlite3" > iron-butterfly-result.json
已有定义风险价差台账与只读生命周期检查:
python3 "$SKILL_DIR/scripts/options_position_manager.py" add --input confirmed-fill.json
python3 "$SKILL_DIR/scripts/options_position_manager.py" review --live
python3 "$SKILL_DIR/scripts/options_position_manager.py" review --live \
--report-dir "$SKILL_DIR/artifacts/options" --report-format both --include-performance
python3 "$SKILL_DIR/scripts/options_position_manager.py" performance
第一阶段只用标的已完成日线、BOLL 状态和流动性缩小股池:垂直信用价差要求触轨收回/回落;日历 IV、Iron Condor 与 Iron Butterfly 要求价格接近 BOLL 中部且中轨斜率受控,不要求方向性触轨,其中 Butterfly 的中心与斜率门槛最严格。第二阶段才为靠前标的按所选策略的期限与行权价窗口拉期权链。期权股池默认覆盖 AMEX、ARCA、BATS、NASDAQ、NYSE、NYSEARCA,包含 SPY 等 ARCA ETF。保持 --option-feed auto:有 OPRA 权限时用 OPRA,只有明确的订阅限制才回退 indicative;indicative 候选最多为“观察等待”。实时模式不得把历史 --end 与当前链混用;历史复盘统一使用同一 as_of 的 --input。--input 是硬离线边界,输入契约必须含 bars、option_chains 和 events。
只采用脚本的 strategy_score/兼容字段 seller_score、verdict、保守自然价、组合净 Greeks、风险预算组数和风险原因。垂直信用价差报告权利金、最大收益/亏损与盈亏平衡;Iron Condor 报告四腿自然净权利金、上下侧最大亏损、双盈亏平衡与净 Delta/Theta/Vega;Iron Butterfly 还必须报告 ATM 体价、窄盈利区、盈亏平衡相对预期波动覆盖和高 Gamma/pin risk;长日历报告远月 Ask − 近月 Bid 的自然借记、借记风险、前后期限 IV 差和初始净 Delta,最大收益保持不可预先确定。只组合 underlying/root/style/乘数一致的标准美式合约,调整合约直接排除。事件日历不可用、报价/Greeks/持仓量或自然价方向 size 缺失时原样写“数据不足”。不得把初始 Delta 近零写成持续 Delta 中性或精确胜率,不得用 Mid 冒充可成交价格。
实时期权筛选默认把固定 30D ATM IV 的 point-in-time 日快照写入独立 options history 数据库;历史 Rank/Percentile 只使用当前纽约交易日之前且至少达到 60 个观测。垂直信用价差默认 30–45 DTE、短腿绝对 Delta 0.15–0.25、费用后单笔风险 0.5%;宏观日历覆盖 CPI/PCE/就业/FOMC/GDP,发布当日及前一交易日冻结新仓。账户 overlay 只读:现阶段只把可配对的标准定义风险垂直价差计入已确认敞口,无法配对的期权腿或缺失相关性数据必须标为数据不足;账户上下文未确认不得给出“适合构建”。现有生命周期台账也只支持垂直信用价差;日历价差、Iron Condor 与 Iron Butterfly 筛选不得冒用这套退出规则或写入该台账。生命周期台账只记录用户确认的实际开平仓事实;实时检查逐腿核对 Alpaca 持仓并自动补期权链、IEX 现价和事件,输出继续持有、止盈退出、计划退出、立即退出评估或数据不足。DTE 和事件窗口统一使用纽约市场日期;14 DTE 开始计划退出,7 DTE 进入立即退出评估。盘中平仓报价默认不得超过 15 分钟,并要求短腿 Ask、长腿 Bid 对应 size 可执行。已确定的短腿穿越、Delta/亏损倍数、DTE 或止盈动作优先于可选数据缺口,缺口作为并列数据警告。账户差异不得自动关闭台账,所有平仓记录必须使用用户确认的实际成交净支出、数量和时间;部分平仓保留原开仓数量并以剩余组数继续核对。日报与 Telegram 都必须显式开启;Telegram 默认关闭且失败不得遮蔽检查结果。严格离线 review 禁止绩效台账和通知参数。绩效只使用实际平仓成交分录,排除剩余未平仓估值;检查动作与随后平仓的关联只作描述性证据,不写成因果验证或回测结论。
期权账户边界按运行模式固定:scan 是账户中立的策略发现流程,不读取账户、不把持仓标的加入行情请求,账户权益、购买力、交易限制和现有敞口均不得影响扫描候选、策略分、结论或排序;analyze 才可读取账户并报告风险预算和组合适配。上文“账户上下文未确认不得给出适合构建”只约束账户适配结论,不限制账户中立扫描给出策略结构结论。
数据流程(单股评分)
# SKILL_DIR = 本 skill 根目录(即本 SKILL.md 所在目录);下面是默认安装路径,若装在别处按实际路径设置
SKILL_DIR="$HOME/.codex/skills/worth-buy-stocks"
FEED="iex"
首次运行先确认 Python 3.10+ 并安装强制依赖:python3 -m pip install -r "$SKILL_DIR/requirements.txt"。所有脚本保持 stdout 为结果/图表通道,运行日志只写 stderr;stderr 被捕获或重定向时默认是 JSONL,可用 --log-format console|json 和 --log-level DEBUG|INFO|WARNING|ERROR 覆盖。
从 skill 根目录进行人工运维时,先用 make help 查看统一入口;常用 target 包括 analyze、scan、status、sync-assets、warm-market-plan、reconcile-plan、回测研究与 check。全部回测 Python 命令统一走 scripts/backtest.py(factor-ic、score、robustness、single、render、lifecycle-validate、index-lifecycle-validate);Makefile 只做薄转发,保持 stdout、限速和退出码契约。高级子命令参数通过 ARGS 传入,全局日志参数通过 GLOBAL_ARGS 传入。完整预热和 reconcile target 不得由默认目标或收尾流程自动调用。
-
默认检索最近 30 天新闻/公告/监管披露:只取公司 IR、SEC、交易所公告和主流财经媒体中能影响交易纪律的 3-5 条(保留标题、日期、链接),不做新闻综述。社交媒体、无来源传闻、模型记忆、分析师目标价不能作为降级依据。整理成
news_context.json(形状见references/agent-contracts.md)。 -
一条命令完成价量指标 + 评分 + 账户 overlay + Finnhub 补充 + 当日 snapshot + AI 意见:
python3 "$SKILL_DIR/scripts/indicators.py" \
--symbols {TICKER},SPY,QQQ \
--feed "$FEED" \
--adjustment split \
--llm-context-file news_context.json > result.json
--start/--end 默认省略,脚本取约两年已完成日线并计算所有指标、相对强度、市场 regime 和 score。多标的一次命令带全部 ticker(外加 SPY,QQQ),逐只输出结论。结果落盘为 result.json,供读取评分和下一步画图共用。
脚本内部并行取得 bars、account/positions、finnhub 和 snapshot(Finnhub 内部再按 symbol 并行),各段独立失败降级、不阻断核心评分。bars/snapshot 默认先经过 skill 根目录 data/market-data.sqlite3:完整 warm 覆盖不联网,冷启动、缺口、盘中 snapshot 或显式 refresh 才调用 Alpaca。不要直接查询 SQLite、在脚本外重复拉 snapshot,或为提速手动并行;统一使用脚本门面,避免 live/final 混用。
缓存规则是低自由度约束:保持 --cache auto 默认;仅在用户要求刷新、复权数据疑似修订时使用 refresh,仅在故障对照时使用 off。设置 WORTH_BUY_STOCKS_DB 或 --cache-db 可覆盖数据库路径。--input 是硬离线边界:只允许读取 bars 和显式 context 文件,on 类在线开关也不得触网或读写 DB。
全市场历史预热
用户要求预热/加速全市场历史分析时,先运行 dry-run,确认本次 scanner universe、三年 coverage 与 batch 数;不要自动启动完整长任务:
python3 "$SKILL_DIR/scripts/cache_admin.py" warm-market --dry-run
用户明确要求执行后,再在空闲维护窗口运行;默认写入 skill 根目录 data/market-data.sqlite3,可中断并依靠 sync_ranges 直接复跑:
python3 "$SKILL_DIR/scripts/cache_admin.py" warm-market \
--years 3 --workers 4 --batch-size 50 \
--max-rpm 120 --max-runtime 3600 \
--feed iex --adjustment split
保持以下边界:预热只拉 final 日线,不拉 snapshot、账户、新闻或 AI;所有 bars pages 共享本进程 120 RPM 均匀预算,Alpaca Basic 200 RPM 的剩余空间留给其他用途,但无法控制同账号的外部客户端;同一 DB 只运行一个实例。小规模验证使用 --symbols-file 和不高于 30 RPM,并将 scope_limited=true 解释为 canary,不得报告成全市场完成。用 cache_admin.py status 查看已跟踪 symbols 的三年覆盖,用 integrity-check 验证数据库。
需要以 Alpaca 当前全部可交易资产为基准查漏补缺时,先每日同步一次资产目录,再规划或执行对账:
python3 "$SKILL_DIR/scripts/cache_admin.py" sync-assets
python3 "$SKILL_DIR/scripts/cache_admin.py" reconcile-market --dry-run
python3 "$SKILL_DIR/scripts/cache_admin.py" reconcile-market \
--years 3 --workers 4 --batch-size 50 \
--max-rpm 120 --max-runtime 3600
资产目录按 UTC 日期缓存,完整保留 Alpaca 当前 active US equity 及历史消失记录;行情对账只处理 tradable 且可由 Basic IEX 支持的主流交易所标的。非交易资产和 OTC 仍写入目录并标明排除原因,不伪装成行情完整。reconcile-market 复用相同 coverage、限速、恢复和同库单实例机制;完整长任务仍需用户明确启动。低速验证可追加 --symbols-file,其结果只代表 canary 范围。
单标的历史回测
用户要求验证评分、回测某只股票或查看历史信号时,使用独立 backtest.py single,不要用当前评分的 K 线图冒充历史回测,也不要复制评分公式:
python3 "$SKILL_DIR/scripts/backtest.py" single \
--symbol {TICKER} \
--start 2021-07-01 --end 2026-07-09 \
--data-source cache-only \
--feed iex --adjustment split
默认 cache-only 是严格只读边界,只消费 SQLite 中 TICKER/SPY/QQQ 的 final 日线;coverage 或 260-session 预热不足时原样报告错误,不自动切换 auto。只有用户明确同意补数据时,才先用 cache_admin.py warm 对这三个 symbol 和明确日期范围预热,然后重新运行 cache-only。离线复现可显式用 --data-source input --input bars.json;只有用户明确要求 read-through 时才选择 auto。
成功运行会在 artifacts/backtests/ 生成 canonical JSON 和自包含 HTML。以 JSON 的 validation status、样本量、置信区间和 warning 为准;HTML 只负责展示。解读时同时报告 21/63 日事件研究、非重叠推断 N、rank-only 与 disciplined-verdict 的固定研究窗口及 managed 持仓管理仿真、单边成本、最大回撤以及标的/SPY buy-and-hold。supports 才能按冻结条件写“该标的这段历史支持”;inconclusive 必须写证据不足;contradicts 必须如实写方向相反。任何单标的结果都不得外推为宽市场 alpha。
回测只验证历史价量主链路:不历史回填账户、新闻、Finnhub、Snapshot 或 AI opinion,不调参、不下单。固定 21/63 日场景是标准化研究窗口;managed 场景按日线近似执行建议仓位、初始止损、1R 保本、移动止损与收盘信号的下一开盘退出(不执行静态止盈)。需要重渲染时使用 backtest.py render --artifact <json> --html <path>,不得在页面里重新计算指标。
contract 1.4 artifact 还会保留一个明确标为“已拒绝”的 stateful 实验场景,用于审计恢复/重新入场假设。该实验先未通过 16 标的 holdout,随后在排除 QQQ/SPY 的 15 个独立宽基/行业 ETF 分层 holdout 中也只有 13.33% 改善;不得作为正式策略结论、ETF 专用规则或 managed 基线替代品。同一 holdout 不得用于调参。
可选 flag(按需追加):
| Flag | 默认 | 作用 |
|---|---|---|
--snapshot auto|on|off |
auto |
当日 snapshot 写入补充信息,不参与 score |
--account-context auto|on|off |
auto |
只读账户/持仓生成敞口 overlay |
--finnhub-context auto|on|off |
auto |
有 FINNHUB_API_KEY 时读 Finnhub 补充;无 key 不触网 |
--llm-context-file path |
无 | 新闻面风控 JSON,只降级不加分 |
--ai-opinion auto|on|off |
auto |
有 ANTHROPIC_API_KEY 时生成 AI 意见对照;只展示不评分;无 key 不触网 |
--cache auto|refresh|off |
auto |
final 日线与 snapshot 的 SQLite 读穿策略;盘中 live 不进入评分 |
--cache-db path |
data/market-data.sqlite3 |
覆盖本次运行的数据库路径;环境变量 WORTH_BUY_STOCKS_DB 也可覆盖 |
--account-context-file / --finnhub-context-file / --snapshot-context-file / --ai-opinion-context-file |
无 | 离线复盘:喂对应 overlay JSON |
--input - |
无 | 硬离线模式:从 stdin 读 multi-bars JSON,不触网、不读写 DB |
- K 线图(默认执行):评分完成后,对每个非基准标的画带计划价位线的终端 K 线,放在最终回复
结论段上方展示:
python3 "$SKILL_DIR/scripts/chart.py" --symbol {TICKER} --feed "$FEED" --count 30 --plan result.json --html
图上的入场/止盈/止损价位线直接取自脚本 trade_plan(入场蓝、回踩入场黄、止损红、止盈绿/亮绿)。原样贴脚本输出,不重画、不手绘、不改价位。无法评分 或图表生成失败时省略图表,照常给结论,不写占位说明。
ANSI 颜色经回复转写必然丢失,彩色版由 --html 生成(自包含 HTML,含价位线与悬浮 OHLC)。不要加 --open 自动打开浏览器;在回复中列出各文件绝对路径,用户想看时自己点开。HTML 生成失败不影响终端图,照常输出。
- 可选步骤:
- ticker 歧义或需确认资产状态:
alpaca asset get --symbol-or-asset-id {TICKER} --quiet
全市场扫描
用户要"扫全市场找今天能买的"时,用一条命令完成,不要手动拼 asset list → snapshot → indicators 多步:
python3 "$SKILL_DIR/scripts/scanner.py" --feed "$FEED" --adjustment split --top 20
流程:取股池(NYSE+NASDAQ 活跃普通股)→ 流动性初筛(IEX 日成交量 ≥5 万、价 ≥5)→ 精简批量评分 → 提取 是 候选 → Finnhub 新闻复核降级 → 对最终候选生成 AI 意见(有 key 时)。输出含最终候选(按评分降序,每只候选带 AI 意见)、被新闻面降级的原"是"、市场 regime 和各阶段计数。全市场扫描耗时可达数分钟(开 AI 意见时每个候选再加数十秒),建议后台运行并告知用户预期等待。
关键 flag:
| Flag | 默认 | 作用 |
|---|---|---|
--entry all|pullback|trend |
all |
按入场时机过滤候选:pullback=只要回调拐点,trend=只要趋势延续 |
--verify-news auto|on|off |
auto |
auto=有 FINNHUB_API_KEY 才对候选做新闻复核降级 |
--ai-opinion auto|on|off |
auto |
仅对 top-N 最终候选生成 AI 意见对照;只展示不评分、不影响排序 |
--exchange |
NYSE,NASDAQ |
股池来源交易所 |
--min-price / --min-volume |
5 / 50000 |
流动性初筛阈值(IEX 量约为全市场 2-3%) |
--top |
20 |
候选列表上限 |
--symbols / --symbols-file |
无 | 覆盖股池(跳过 asset list,用于复盘) |
--cache auto|refresh|off / --cache-db |
auto / 默认路径 |
scanner chunk 共享同一 SQLite;warm 盘前/休市的 bars 与 snapshot 均零网络 |
--input |
无 | 硬离线复盘:读预取 JSON,不触网、不读写 DB、忽略在线 AI/通知开关 |
--notify on |
off |
把摘要推 Telegram |
新闻复核这步必须做(默认 auto 已开):漏掉会高估可买数量。扫描结果汇报仍遵循"输出格式"7 段,对每只候选单独展开;扫描模式候选数多,不默认逐只画 K 线,用户点名某只候选深入时再按单股流程补图。
轮动组合名单
用户问"轮动组合现在该持有什么/调仓名单"时,用一条命令输出研究晋升配置(63 交易日调仓、Top-20 等权、SPY 跌破 200 日线全现金)的当日目标名单:
python3 "$SKILL_DIR/scripts/rotation_list.py" --top 20 --holdings holdings.json
--holdings(可选)传当前持仓 JSON(symbol 列表或 {symbol: weight}),输出会附买入/卖出/保留差异。加 --record 把本次名单固化为前瞻记录(输出中的调仓到期状态基于上次记录推算,距上次 ≥63 交易日为到期);--evaluate 结算已满 63 交易日的记录,报告等权毛收益与相对 QQQ/SPY 的超额,这是晋升配置持续积累样本外证据的唯一正规通道。名单是分析结论不是订单;票池为 148 只冻结研究 universe,评分与排名完全来自生产脚本。该配置经预注册 dev/holdout 双门槛验证(holdout 净收益与回撤均优于 QQQ),历史证据与限制以 artifacts/backtests/rotation-study-*.json 为准:universe 有残余幸存者偏差、holdout 期较短,向用户说明结论时不得省略。单票深入仍走"数据流程"。
新闻面风控
新闻面进入评分只做 min(cap) 封顶:
severity=high(会计造假、停牌/退市、going-concern、要约/并购价格锚定等):封顶 50,结论最多否。severity=medium或data_trust=suspect(增发摊薄、重大诉讼、监管调查、同业重大事故传染、坏数据等):封顶 74,是降为观察。severity=low和利好 catalyst:只回显,不影响评分。
Finnhub 自动提炼只识别显式负面关键词(→ medium/high 候选)和临近财报(≤7 天 → medium,把可成立的 是 降级为 观察,理由注明"财报临近,趋势开仓纪律降级";8–14 天 → low 仅提醒),利好忽略。若同时提供 --llm-context-file,手工上下文标量字段优先,来源和红旗追加合并。
多 agent 编排
运行时支持 sub-agent 且用户要求多 agent/并行分析时才启用;单 agent 环境按上面"数据流程"执行即可。注意:indicators.py 已自动并行采集 account/finnhub/snapshot,拆 sub-agent 不会更快,只为满足用户显式的多 agent 需求或复用离线 artifact。
主 agent 必须保留:用户意图解析、安全边界(硬性纪律全部条款)、最终评分运行(只运行 scripts/indicators.py 或等价 build_result())、artifact 校验与合并、最终回复组织。
可委派角色(详细契约见 references/agent-contracts.md):
- Market data agent →
barsartifact(snapshot 已由脚本自动拉取,无需单独采集)。 - News/event-risk agent →
news_contextartifact;只识别风险,不写买入结论。 - Account overlay agent →
account_contextartifact;只读,失败返回 unavailable。 - Finnhub context agent →
finnhub_contextartifact;无 key/限流返回结构化状态。 - Chart agent → 运行
chart.py --plan生成默认展示的 K 线(评分产出 result.json 后才能画价位线)。 - QA agent → 只检查最终回复是否遵守本 skill,不得改写评分或生成替代结论。
AI 意见没有可委派角色:它由 indicators.py/scanner.py 内置生成,不得让 sub-agent(或主 agent 自己)代写 AI 意见;离线 ai_opinion artifact 仅用于复盘回放。
每个 artifact 喂入前用 python3 "$SKILL_DIR/scripts/validate_agent_contract.py" --kind <kind> <file> 预检(kind:news_context/account_context/finnhub_context/bars/snapshot_context/ai_opinion/result)。indicators.py 加载时会自动复检:可选 overlay 校验失败则丢弃并在 stderr 警告,核心 bars(--input)校验失败则输出 无法评分 退出。
评分合约
脚本输出的每个 symbol 都含 score,直接采用、不重算。核心字段:
score.verdict:是、观察、否、持仓需减风险或无法评分。score.composite:最终纪律评分(0-100),已应用风险封顶。score.blocking_reasons:强制排除/降级原因;空则写"无"。score.trade_plan:入场/止损/止盈(2R/3R)/移动止损/追价上限。风控参考,不是订单。score.account_overlay:持仓状态、当前/目标仓位、建议动作、保护性出场价。不可用时不得编造持仓。score.llm_overlay:新闻面封顶回显(cap、降级原因、catalyst、红旗)。score.entry_timing:入场时机层回显(分类与时机分)。分类:pullback_reversal=强趋势内回调拐点;recovery_reversal=深度回撤后的高置信放量强反转,长期趋势资格通过时允许 15% 受限试仓;trend_continuation=趋势延续;pullback_no_trigger=回调中反转未确认;overextended=过热;trend_broken=中期趋势破坏。详情(过热度、回调深度、触发信号)在分析对象entry_timing字段。score.position_exit:持仓保护信号;高位反转或有效趋势破位给出下一开盘退出,普通持有状态写“继续持有”。score.data_flags:历史不足、因子缺失、低流动性等提示。
辅助字段(按需引用,完整 schema 见 scripts/README.md):raw_composite、factor_breakdown(momentum 55 / rel_strength 35 / efficiency 10)、risk_gates、confirmation、suggested_position_pct、supplemental.finnhub、supplemental.ai_opinion(AI 意见:立场、是否与脚本一致、一句话理由、主要风险;只供结论段对照展示,绝不用于改评分或结论)。
score 缺失、关键字段缺失或脚本失败时输出 无法评分。字段名只供内部取数,最终答复按硬性纪律第 7 条翻译成自然语言。
输出格式
默认中文,先图后结论再证据。最终回复以 K 线图开头,随后必须包含 7 个标题,顺序固定:结论、关键证据、风控过滤条件、评分拆解、账户敞口与交易计划、新闻面风控、建议,不得省略或合并。所有价格、仓位、止损、止盈、封顶结论必须来自脚本;缺字段写"无法确认",不要猜。不要用代码样式包裹普通数值或状态(股票代码、命令和用户要求的原始字段例外)。
例外一:无法评分 时不硬套 7 段也不画图,简短说明缺失的数据和补救步骤(如安装 CLI、检查 ticker、补历史数据)。
例外二(轻量模式):用户明确要求简短(如"简单说""快速看""一句话")时,只输出 K 线图 + 结论 段——内容仍全部来自脚本评分——并在末尾提示可展开完整分析;用户追问时再给完整 7 段。评分流程本身不简化。
例外三(历史回测):用户要求历史回测或评分有效性验证时,不套用当前时点的 7 段交易建议。先给 validation status,再给事件研究样本/IC、仿真与基准、回撤/成本、数据与模型 provenance、限制和 JSON/HTML 路径;所有数字只取 canonical backtest artifact。
例外四(期权策略):不套用股票版 7 段。按 references/options-seller.md 的所选策略模板输出;垂直信用价差写 BOLL 触发与权利金,日历 IV 写期限配对与自然借记,Iron Condor/Butterfly 写四腿自然净权利金、双侧风险、净 Greeks 和指派风险。没有合格价差时列出最关键的硬过滤或数据缺口,不补造候选。
K 线图(置于 结论 上方,不占 7 个标题名额)
chart.py --plan 的输出用代码块原样贴出,含入场/止盈/止损价位线;多标的时每只一张(基准 SPY/QQQ 不画)。图表生成失败时直接省略整块,从 结论 开始,不写占位说明;用户明确说不要图时也省略。
代码块下方附一行彩色图指引:已生成的 HTML 文件绝对路径(用户自己点开,不自动打开),以及一条可直接复制到终端运行的命令($SKILL_DIR 等变量展开为实际绝对路径),例如:
彩色图: /path/to/chart_AAPL.html · 终端彩色版: python3 /abs/path/scripts/chart.py --symbol AAPL --plan /abs/path/result.json
结论
- 标的: TICKER
- 是否值得买: 是 / 观察 / 否 / 持仓需减风险 / 无法评分
- 建议: 新开仓 / 观察等待 / 回避 / 减仓退出 / 补充数据后重评
- 纪律评分: X/100
- 当前持仓: 无 / 已持仓 X% 账户权益 / 账户持仓无法确认
- 建议入场价: 脚本计划价;不建议新开仓写"不建议入场"
- 建议出场价: 脚本止损价;已持仓优先写保护性出场价
- 止盈参考: 第一/第二止盈价,注明移动止损比例
- 强制排除条件: 自然语言原因;没有写"无"
- AI 意见: 同意,加一句话理由 / 分歧:AI 倾向买入/观察/回避,加一句话理由 / 无法确认
- 一句话: 最关键依据
关键证据
列 4-7 条:日线趋势、周线趋势、30 日结构、相对 SPY/QQQ 强度、技术确认、量价、当日入场质量。
风控过滤条件
表格列名固定:过滤条件, 状态, 关键证据, 处理建议。固定 8 行,没有触发风险的行也要填写结论状态("通过"或"未发现")与事实证据,不能省略:
| 过滤条件 | 状态 | 关键证据 | 处理建议 |
|---|---|---|---|
| 大盘 regime | 通过 / 风险 | 大盘趋势事实(如 SPY 相对 200 日线的位置与方向) | 大盘风险时不新增仓位或降至观察 |
| 个股趋势闸门 | 通过 / 风险 | MA60、MA200、周线排列和关键趋势位 | 跌破关键均线不新开;已持仓按保护价管理 |
| 相对强度 | 通过 / 偏弱 / 无法确认 | 相对 SPY/QQQ 的 3m/6m 强弱 | 跑输基准则等待重评 |
| 30 日结构与追价 | 通过 / 过热 / 破位 | 30 日位置、回踩价、突破价、追价上限 | 高于追价上限不追;等回踩或突破确认 |
| 技术与量价确认 | 通过 / 未确认 | 技术确认、MACD/RSI/KDJ 和成交量是否达标 | 确认不足时维持观察 |
| 流动性/数据质量 | 通过 / 风险 / 无法确认 | 历史数据、snapshot 新鲜度、价差和成交量的核对结果 | 数据异常时补数据后重评 |
| 新闻/事件红旗 | 未发现 / 低 / 中 / 高 / 无法确认 | 红旗等级与可验证来源;无红旗写"近 30 天未发现需要处置的事件风险" | 存在中高红旗时按降级后的结论执行;无法确认时以价量结论为准 |
| 账户敞口 | 无持仓 / 已持仓 / 无法确认 / 风险 | 当前仓位、目标仓位、现金比例、是否超配 | 超目标减仓至目标;无持仓按入场计划执行 |
评分拆解
至少写明动量、相对强度、趋势效率三项得分/贡献,以及确认状态和建议仓位。若已封顶,用自然语言说明触发原因和封顶后影响。
账户敞口与交易计划
读取到持仓时:当前持仓占账户权益比例、目标仓位、差额、成本价、浮盈亏、保护性出场价、移动止损、2R/3R 止盈、追价上限和处理建议。无持仓时写"当前无持仓",并给出完整的入场/止损/止盈/追价上限计划价。账户读取失败写"账户持仓无法确认",处理建议只基于价量与新闻面给出。
新闻面风控
写新闻检索状态、Finnhub 补充状态、主要 catalyst、红旗、来源日期/链接;存在降级时写明事件与降级后的结论。无红旗写"近 30 天未发现需要处置的事件风险";不可用写"新闻面无法确认"。
建议
给出一个明确动作并结合账户处理建议:无持仓且计划允许入场可写"按计划价分批新开";持仓需减风险 明确写"减仓至目标敞口 / 跌破保护性出场价退出";账户 overlay 不可用则动作只基于价量和新闻面。仅在用户要求详细数据时追加 Alpaca 明细或完整 JSON。
结论为 否 或 观察 时,必须附上重评触发条件,写成正式条件句("满足以下任一条件时重新评分:……"),不附加"仅作重评参照"之类的限定语;用较快的信号组合而非慢速确认(如"等 3 个月相对强度转正"太滞后,不要用作默认触发)。默认触发组合:1 个月相对 SPY/QQQ 强度转正,且放量收复 60 日均线(或脚本给出的回踩/突破参考价确认);观察 标的若因新闻封顶降级,还需红旗解除或影响明朗。内部约束(不写进回复):触发条件只决定"什么时候重跑脚本重评",不是评分输入,升级与否仍完全由脚本评分决定——1 个月强度存在短期反转噪声,禁止据此直接给出买入结论。
输出前自检(不写进回复):K 线图在 结论 上方且为脚本原样输出(生成失败或用户拒绝时可整块省略);7 个标题齐全且顺序正确(轻量模式只查 K 线图 + 结论 段完整);结论 段含入场/出场/止盈/持仓/强制排除条件/AI 意见(同意/分歧写明理由,不可用写"无法确认",且未据此改动任何评分或结论);风控表 8 行齐全且每行有处理建议;结论为 否/观察 时建议段含正式条件句的重评触发条件;新闻段明确红旗或不可用状态;全文无字段路径、snake_case、空数组/对象、true/false/null、命令参数等源码式文本;全文无机制性否定句与免责声明——逐句检查不得出现"未影响评分""评分未被压低""不构成……降级""未用于降级/升级/调整""仅为分析参考""仅作重评参照""不构成下单指令"及同义变体(硬性纪律第 7 条)。
Telegram
需要推送时:
printf '%s' "$DECISION_SUMMARY" | python3 "$SKILL_DIR/scripts/notify_telegram.py"
凭证从本地 .env 读取 TELEGRAM_BOT_TOKEN / TELEGRAM_CHAT_ID(查找顺序:WORTH_BUY_STOCKS_ENV_FILE 指定路径 → skill 根目录 .env → ~/.config/worth-buy-stocks/.env),环境变量作为 fallback。未配置时转达脚本提示,分析结论不受影响。