feat: agent-reviewed overnight_recovery_agent_top10; guard monitor hot-reload
overnight_recovery_agent_top10 (strategies/agent_review.py) re-ranks the
overnight_recovery top 50 with an LLM agent's daily scores:
final = quant percentile + 0.25 x score (-2..+2), vetoes for five event types,
top 10 on the base strategy's rebalance rows and hysteresis. Score files are
stamped by `agent_review.py submit` and steer a session only if stamped before
its 16:00 New York close; without one the strategy holds exactly what
overnight_recovery_top10 holds (checked on the live panel 2016-2026).
- agent_review.py: candidates / submit / evaluate; skill
.claude/skills/agent-stock-review drives the daily research.
- US only, skipped by precompute (no history before its first score file);
runs in the original book and in selected_2026_09 (from the book's start).
- .gitignore tracks .claude/skills/ and ignores data/agent/.
Monitor fix: hot-reload re-imports trader.py but not strategies/*. After the
2026-09-29 strategy commits the stale modules made every phase's panel refresh
fail ("Unknown signal 'low_risk'") and US books skipped 09-29 until a restart.
_reload_strategies now builds every factory and keeps the old registry when
any fails; CLAUDE.md says to restart the monitor after changing strategy code.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
70
.claude/skills/agent-stock-review/SKILL.md
Normal file
70
.claude/skills/agent-stock-review/SKILL.md
Normal file
@@ -0,0 +1,70 @@
|
||||
---
|
||||
name: agent-stock-review
|
||||
description: 每个美股交易日为 overnight_recovery_agent_top10 的 50 只量化候选做财报、基本面、产业逻辑和事件风险分析,打分并提交(agent_review.py)。用户说"跑今天的 agent 打分 / agent review / 给候选股打分"时使用;不用于研究回测或其他策略。
|
||||
---
|
||||
|
||||
# Agent 候选股打分
|
||||
|
||||
`overnight_recovery_agent_top10`(`strategies/agent_review.py`)每天用你的打分重排量化 top 50,持有 10 只。你的分数会直接进入 live 账本的决策,所以只写有证据的判断。
|
||||
|
||||
## 规则(2026-09-30 固定,不要改)
|
||||
|
||||
- `final = quant_pct + 0.25 × score`。`quant_pct` 是量化排名在 50 只里的百分位(第 1 名 = 1,第 50 名 = 0);`score` 是整数 −2..+2,未打分按 0。
|
||||
- 持有 `final` 前 10;已持有的名字排在前 30 就不卖。每 10 个交易日调仓一次,和对照组 `overnight_recovery_top10` 同一天。
|
||||
- 否决(veto)的名字直接剔除;持仓被否决时当天卖出,由候选里最好的未持有名字补位。
|
||||
- 分数只能影响你提交之后的交易:文件必须在下一交易日 16:00(纽约时间)前提交,截止时间见候选包的 `deadline_utc`。
|
||||
|
||||
量化排名已经包含价格动量。你的分数要回答的是价格数据看不到的东西:财报和指引、基本面、需求链条逻辑、未来 1–2 个月的催化剂和事件风险。
|
||||
|
||||
## 步骤
|
||||
|
||||
1. 生成候选包:`uv run python agent_review.py candidates`。如果包里的 `as_of` 早于最近一个美股交易日(monitor 没刷新数据),加 `--refresh` 再跑一次。包在 `data/agent/us/candidates_<as_of>.json`。
|
||||
2. 读包:`holdings`(策略和对照组的当前持仓)、`sessions_until_rebalance`(0 = 下一交易日按你的分数调仓;其他值 = 在那之前只有否决生效)、每只候选的 `previous`(上次的分数和摘要)、`customers_named` / `named_as_customer_by`(10-K 里的客户关系)。
|
||||
3. 分级处理,控制成本:
|
||||
- 完整研究:当前持仓;排名前 30;新进候选;上次分数超过 5 个交易日;以及上次打分后发布了财报、8-K 或重大新闻的名字。
|
||||
- 其余名字:确认上次打分后没有新的申报文件或新闻,沿用上次分数,`summary` 写明"沿用 <日期>,无新信息"。
|
||||
- `sessions_until_rebalance > 0` 时,至少要完整检查所有持仓有没有否决事件。
|
||||
4. 每只做完整研究的股票,从一手来源取当前信息,并记下链接和日期:
|
||||
- SEC EDGAR:最新 10-Q/10-K;8-K 的 Item 2.02 是业绩,1.01/2.01/8.01 是交易和重大事项。
|
||||
- 公司业绩新闻稿和电话会要点。
|
||||
- 有日期的可靠新闻。
|
||||
|
||||
不要凭记忆写训练截止日之后的事实;你的记忆可能过时,一律以当前查到的为准。
|
||||
5. 按四个维度各写一两句:
|
||||
- **财报**:最近一个季度的收入和 EPS 增速、利润率趋势、指引上调或下调、有没有超预期,下次财报日期(10 个交易日内要注明)。
|
||||
- **基本面**:增长能否持续、盈利能力、负债、自由现金流、稀释或回购,估值和自身历史及同行比。
|
||||
- **逻辑**:谁在为它的产品付钱,这份需求是在加速还是见顶;它在链条上处于哪一环(参考包里的客户关系);这波上涨有没有盈利预期上修支撑,还是主要靠资金;竞争威胁;未来 1–2 个月的催化剂。
|
||||
- **风险**:事件风险;是否属于下面的否决类别。
|
||||
6. 打分(和另外 49 只候选相比,看未来 2–8 周):
|
||||
- `+2`:盈利预期或指引在上修,而且前面有价格还没反映的催化剂。
|
||||
- `+1`:基本面支持当前的动量。
|
||||
- `0`:没有优势、信息矛盾或信息不足。
|
||||
- `−1`:动量没有基本面支撑,增长放缓,或估值过高且预期在下修。
|
||||
- `−2`:逻辑在破坏:指引下调、需求转移,或会计上有疑点但还不够否决。
|
||||
|
||||
大约一半应该是 0,±2 最多 8 只左右。不要按行业偏好打分;和上次相比改分要写原因。
|
||||
7. 否决只用于下面五类,并且必须有申报文件或新闻链接:
|
||||
- `pending_cash_acquisition`:已签最终协议,以现金或固定价格被收购,股价被锁定。
|
||||
- `fraud_or_restatement`:财务重述、审计师辞任,或有监管介入的可信造假指控。
|
||||
- `regulatory_action`:DOJ、SEC、FTC 等的行动实质影响业务,或面临退市。
|
||||
- `large_equity_offering`:已宣布的增发或 ATM 超过总股本约 5%。
|
||||
- `binary_event`:10 个交易日内有 FDA 审批、判决之类结果二选一、股价可能大幅双向波动的事件。
|
||||
8. 写草稿 `data/agent/us/draft_<as_of>.json`:
|
||||
|
||||
```json
|
||||
{"as_of": "<包里的 as_of>", "model": "<你的模型 id>",
|
||||
"scores": {"MU": {"score": 1, "veto": false, "veto_reason": null, "confidence": 0.6,
|
||||
"earnings": "...", "fundamentals": "...", "logic": "...", "risks": "...",
|
||||
"summary": "一两句结论", "sources": [{"url": "...", "date": "2026-09-24"}]},
|
||||
"...": {}}}
|
||||
```
|
||||
|
||||
50 只候选必须全部出现,不能多也不能少。
|
||||
9. 提交:`uv run python agent_review.py submit data/agent/us/draft_<as_of>.json`。被拒绝就按提示修改草稿后重交。不要改动已经存下的 `scores_*.json`,它们是 point-in-time 记录;重交会另存一份新文件,以最新的一份为准。
|
||||
10. 向用户汇报:
|
||||
- 上调和下调各前 5 名及理由;
|
||||
- 否决了哪些股票,证据是什么;
|
||||
- 下次调仓前后预计和对照组持仓的差别;
|
||||
- 是否赶上了截止时间。
|
||||
|
||||
隔几周跑一次 `uv run python agent_review.py evaluate`,看打分的 IC、否决的效果,以及本策略相对对照组的收益。样本少于约 50 个交易日时不要下结论。
|
||||
Reference in New Issue
Block a user