invest-a-event-calendar
GitHub提供宏观事件前瞻、限售解禁排雷及题材日历记账功能,通过本地脚本采集数据并生成报告,辅助投资决策。
触发场景
安装
npx skills add Veblin/invest-skills --skill invest-a-event-calendar -g -y
SKILL.md
Frontmatter
{
"name": "invest-a-event-calendar",
"version": "0.3.0",
"metadata": {
"requires": {
"bins": [
"uv",
"python3"
]
}
},
"whenToUse": "查未来一段时间有哪些定期事件('下周有什么数据''什么时候议息')、持仓\/自选池排雷('我的票哪天解禁')、或低频查看全市场解禁压力分布(解禁≠减持,与减持公告联动)",
"description": "事件日历 v3 — 定期事件前瞻(宏观日程:中美 CPI\/社零\/非农\/议息)+ 限售解禁排雷(池模式清单池下钻 + 市场模式日级分位)。研究工具非决策。触发词:事件日历\/宏观日历\/经济数据日程\/CPI日程\/议息会议\/解禁日历\/解禁压力\/限售股解禁",
"allowed-tools": "Bash, Read, Write",
"argument-hint": "\/invest-a-event-calendar --macro | --pool-file pool.txt | --theme <题材>",
"user-invocable": true
}
invest-a-event-calendar 事件日历(v3)
工具约束说明:frontmatter 的
allowed-tools是 Claude Code 约定;在 DSH 等不读取该字段的 harness 下不生效,实际可用工具由平台自身沙箱控制。本技能全部操作为本地数据采集与计算(Bash/Python 引擎)。
概述(四模式)
① 宏观日程模式(--macro):未来一段时间内周期性、非突发的定期事件日程 ——
中美官方统计数据发布日(CPI/PPI/社零/工业增加值/非农/GDP/零售…)与美联储议息会议。产出:
- ⭐ 重点事件(头部速览):只取策展档位「高」的事件,按日期一行, 带距今(交易日)——回答「接下来要紧的是什么」
- 📡 源覆盖矩阵:逐源列出实测覆盖边界与状态(正常/部分失败/不可得)
- 📅 日程时间轴:日期为统一尺度,一天一行,格内含当日全部区域事件 (区域标识 🇨🇳 中国 · 🇺🇸 美国 · 🇯🇵 日本 + 时刻);全集,仅列有排期的日期
- 🧾 降级与过滤留痕:本次不可得的源、被过滤的噪音条数
- 落盘
reports/event-calendar/{YYYYMMDD}-macro.md
档位(高/中/低)是影响量级判断、不是方向判断,在
references/macro_sources.yaml里策展:同一次发布的细分项(如 Q2 GDP 被源拆成 6 条)用更长的关键词降到中/低档,避免重点段被灌满。重点段另有单日上限 (超出折叠为「…另 N 项」),被折叠项在完整日程中仍可见。
时区口径(统一轴的前提):表中「时刻」列一律为北京时间。百度源本就是 北京口径(2026-09-10 实测:61/61 个美国事件的时刻 = 公认美东发布时刻 +12h, 即 8:30 ET → 20:30 北京),中国/日本同源同口径 → 三区时刻可直接比较。 美国(FRED)条目无时刻(源不提供,不推测),其日期为美东日期口径。 议息决议为美东 14:00 → 表中日期已换算为北京次日(否则按北京日期查看会 整整错过一天)。
覆盖窗口是不对称的(如实标注,勿当成全集):中国 ≈30 天(百度源前向窗限制)、 美国 ≥3 个月(FRED)、议息 ~1 年(人工表)。报告会写明各区实测覆盖至哪一天; 覆盖边界之外不可得 ≠ 没有事件。事件按
references/macro_sources.yaml按区域分别配置的白名单收录——源中未收录的条目不在表内。
② 池模式(解禁排雷首选):对清单内的个股逐一下钻个股解禁队列,产出:
- 🔔 提醒段:未来
--alert-days(默认 30 自然日)内有解禁批次的标的(解禁日/距今交易日/数量/股东数/类型) - 🆕 变化段:相较上次运行的新增/消失/字段变化(状态存私有文件;首跑建基线不告警)——只推新增与临近,不做每日全表
- 📋 全池明细:含逐标的「无解禁记录」与「取数失败」区分标注
- 落盘
reports/event-calendar/{YYYYMMDD}-pool.md
③ 市场模式(低频参考):全市场解禁日汇总(东财 summary_em),回看近 120 日 + 展望未来 30 日,未来解禁日按市值相对近 120 日序列分位标注(≥80% 高压 / ≥90% 极高压力)。注明:市场级日历不含个股名单,用于给时段分配注意力,不能用于个股排雷——个股排雷用池模式。
解禁 ≠ 减持:解禁是供给事件提示,非方向信号。控股股东/实际控制人解禁后多数不立即减持(锁定期另有承诺);真减持需看减持预披露公告(invest-a-stock 公告采集已有)。压力/提醒的作用 = 提示「何时去看供给面事件」,配合减持公告与 journal 评估使用。
v2 边界(如实标注):池来源本期 = 清单文件;journal 持仓推导与 portfolio holdings.json 直读为二期(扩展位见 _run_pool 的单一入口)。股东户数/高管持股/分红实施日历仍为按股票接口,未接入。
运行
# 宏观日程模式(定期事件前瞻)
cd "${INVEST_SKILLS_ROOT:-.}" && uv run python skills/invest-a-event-calendar/scripts/unlock_calendar.py --macro
# 池模式(解禁排雷首选):清单文件每行一个 6 位代码(# 注释)
cd "${INVEST_SKILLS_ROOT:-.}" && uv run python skills/invest-a-event-calendar/scripts/unlock_calendar.py --pool-file /path/to/pool.txt
# 市场模式(低频)
cd "${INVEST_SKILLS_ROOT:-.}" && uv run python skills/invest-a-event-calendar/scripts/unlock_calendar.py
# 题材日历记账(R-D01;只记账不预测扩散路径)
cd "${INVEST_SKILLS_ROOT:-.}" && uv run python skills/invest-a-event-calendar/scripts/unlock_calendar.py \
--theme 示例题材 --stage 首波 --anchor "某规划正式发布" --anchor-source "发改委公告" --concepts 甲,乙
四种模式互斥(--theme / --macro / --pool-file 两两同传会报参数错;三者都缺省为市场模式)。
--macro 不读写状态文件;--theme 与解禁模块共用状态文件但只读写 themes 键(保留 symbols)。
题材日历(--theme,R-D01)
定位:只记账,不预测扩散路径。 源文档裁决(hypothesis-registry C9/C10):
- 阶段字段固定四值:首波 / 扩散 / 延伸 / 兑现(无「下一轮扩散方向」类字段)
- 证实锚点 = 官方/权威来源确认;⚠️ 题材热度见顶 ≠ 证实
(
热度/涨停家数/涨幅榜/情绪等市场热度描述会被拒绝为来源) - 「兑现」阶段须给
--confirmed-date(证实日入日历,供 journal / 复盘对照预期差) - 多概念归属 = 拥挤度「加总」,不输出「托底/更稳」语义(C10 后半无支持)
- 消息方向语义不预设(分类器验证前,见 C8)
- 状态文件损坏时拒绝写入并报错(不静默清空既有记录)
时间窗口:需求窗口 vs 炒作窗口(R-D02,禁止合并)
--theme 登记时可带两类互斥的时间窗口,渲染时分列且显式声明不可合并:
| 类型 | 性质 | 强制要求 |
|---|---|---|
| 需求窗口 | 基本面季节性(有据) | 文本 + 来源(缺来源即拒绝)+ 可选商品基本面文献注记 |
| 炒作窗口 | 从业者惯例(非学术验证) | 强制标注 [从业者惯例,非学术验证:{出处}](出处不可考写「出处不可考」);不得带收益预期(「预期收益/目标位/涨幅预期」等一律拒绝) |
为什么禁合并:C9 裁决——「基本面季节性」有据,而「股价提前数周布局」无直接证据; 合并输出等于让惯例借用事实的证据等级。
可跟踪度字段(R-D03,替代「小作文干扰小」)
tractability_field() = 硬催化占比 × 覆盖充分度:
- 硬催化占比 = 可核验日历事件数(财报/政策/重组等)/ 总事件数
- 覆盖充分度 = 三类指标的归一化均值(研报覆盖数 / 公告频率 / 媒体提及)
- 低覆盖给对称风险提示:「坏消息消化可能更慢」(Hou 2007 反向警示)—— 不得读作「覆盖低 ⇒ 波动小」;本字段不含「干扰小/易跟踪」类主观措辞(单测守护)
- 归一化上限为工程近似,随
backtest_prereg/C12_预注册.md裁决 - ⚠️ 落地状态(2026-09-13 校正):
tractability_field()函数已交付(含单测), 但尚无生产调用方——宏观/解禁/题材三个报告均不含该字段。调用点待 v0.3.1 (见host-docs/v0.3.0/round-plans/r5-20260912.md移档记录)
| 参数 | 默认 | 说明 |
|---|---|---|
--macro |
false | 宏观日程模式开关:定期宏观数据发布日程 + 议息会议 |
--macro-days N |
90 | 宏观展望窗(自然日;中国区受源限制最多覆盖 30 天) |
--macro-regions |
中国,美国,日本 |
宏观区域(逗号分隔) |
--macro-rules-file PATH |
references/macro_sources.yaml |
宏观策展规则表(白名单/噪音 pattern) |
--fomc-file PATH |
references/fomc_meetings.yaml |
FOMC 会议策展表 |
--baidu-cookie |
— | 百度财经日历 cookie(可选;复用可显著降低逐日失败率) |
--pool-file PATH |
— | 池模式开关:清单文件路径(每行一个 6 位代码;# 注释;坏行跳过并告警) |
--alert-days N |
30 | 提醒窗(自然日;池模式) |
--lookahead N |
90 | 拉取展望(自然日;池模式) |
--state-file PATH |
~/.local/share/investment/event_calendar_state.json |
变化检测状态(私有) |
--no-state |
false | 不读写状态(调试) |
--days-past |
120 | 分位回看窗口(自然日;市场模式) |
--days-future |
30 | 展望窗口(自然日;市场模式) |
--no-out |
false | 不落盘 |
--out-dir |
reports/event-calendar/ |
输出目录 |
落盘:宏观日程 {YYYYMMDD}-macro.md;池模式 {YYYYMMDD}-pool.md;市场模式 {YYYYMMDD}.md。
退出码:0 正常(含部分失败/部分源降级,报告逐段标注);2 参数/池文件错误;3 不可得(市场空返回且窗口含交易日,或池内全部标的失败,或全部宏观源不可得)。
数据源与口径
宏观日程(--macro)—— 三源,覆盖窗口不对称
| 区域/类别 | 源 | 前向窗口(实测) | 备注 |
|---|---|---|---|
| 🇨🇳 中国 | 百度财经日历(akshare.news_economic_baidu) |
≈30 天 | 逐日拉取;单日失败重试 3 次(实测单次失败率 ≈12%) |
| 🇺🇸 美国(近场) | 同上 | ≈30 天 | 窗口内不含美国 CPI(实测:103 条 CPI 全是其他国家的) |
| 🇺🇸 美国(长窗) | FRED releases/dates |
≥3 个月 | 需 FRED_API_KEY;无时刻字段(不推测) |
| 🏛 议息会议 | references/fomc_meetings.yaml |
~1 年 | 人工策展(无自动源);年度刷新 |
- 无
FRED_API_KEY是显式降级(报告出「❌ 不可得」,不是「无事件」);中国段照常 - 事件按
references/macro_sources.yaml白名单收录;重要性列是本地策展档位, 源的重要性(实测只有 1/2 两档且 str/float 混型,噪音行同样有值)只作备注原值 - 噪音过滤 = 频率检测(同名同刻出现于 ≥5 个不同日期 → 每日类)+ 极窄 pattern; 过滤条数在报告「降级与过滤」段留痕
- FRED 白名单按 (release_id, release_name) 对匹配;id 命中但 name 不符 → 报配置漂移并排除
- FOMC 表过期/缺失 → 报告出「❌ 不可得 / 已过期」,不得渲染成「无议息会议」
解禁(池模式 / 市场模式)
- 个股源(池模式):
stock_restricted_release_queue_em(symbol=...)(东财,单标的;共享实现skills/lib/unlock_source.py)——失败以(rows, error)显式返回,报告逐标的标注「取数失败:原因」,不得当作「无解禁」 - 市场源(市场模式):
stock_restricted_release_summary_em(symbol="全部股票")(东财数据中心;ProxyError → 「数据不可得」退出码 3,不硬编) - 原始单位:解禁数量 = 股(脚本换算为亿);市场模式实际解禁市值 = 元(换算为亿)
- 距今天数 = 近场(≤365 自然日)交易日口径(经
skills/lib/freshness.py,长假后不误报);远场或日历不可用 → 自然日 + 标注「自然日粗判」(交易日历不覆盖远端,防截断计数) - 分位 = bisect_left 口径(同 pulse),基准 = 近 120 日有解禁日的市值序列
- 状态文件:私有 JSON(
~/.local/share/investment/),只存批次与运行日;失败标的保留旧状态不覆盖
分析纪律
- 解禁 ≠ 必然减持:提醒/压力日只提示事件集中度;个股层面须查减持预披露(若大股东计划减持会先公告)——提醒 + 减持公告双信号才构成供给面关注(仍非买卖信号)
- 分位/提醒是横向提示:市值分位高、临近解禁 ≠ 利空成立——需看解禁股东类型(控股 vs 财务投资者)、承诺与当前股价位置,本工具只给日历与分位
- 不要用回看段的沪深300表现做因果:那是参考坐标,不是「解禁日必跌」的证据(样本与混杂因素未控制)
- 数据不可得时如实降级:取数失败逐行标注,不以「无解禁记录」冒充;市场模式 ProxyError → 明确「数据不可得」
- 变化段是运行间差异:不是「新增解禁事件」的公告确认——同一标的首次纳入池时只建基线;把变化段当排雷信号使用前,先核对原始公告
宏观日程(--macro)追加:
- 日程是排期事实,不是预测:本表只说明「何时公布」,不预测「公布什么」;源里的「预期」列未纳入(窗口内多为空,纳入会误导)
- 「表里没有」不等于「没有事件」:中国区源前向窗 ≈30 天,覆盖边界外不可得;报告已写明各区覆盖至哪一天——引用前先看覆盖矩阵
- 议息会议日期为暂定:官方注明「会议日期在紧邻的上次会议确认前均为暂定」;且本表取决议公布日(会议第二日),不是会议开始日
- 数据发布 ≠ 方向信号:公布时点是波动来源提示;方向取决于实际值 vs 预期,不在本表范围
- 降级项必须随结论一并读出:若某区显示「❌ 不可得」,该区不可下「那段时间很平静」类判断
参考输出层
| 参考类型 | 内容 | 来源 |
|---|---|---|
| 重点事件(事件参考) | 档位「高」的事件速览(日期/星期/距今交易日/事件) | [来源: macro_calendar 引擎输出] |
| 宏观日程(事件参考) | 未来排定的全部定期事件(日期/时刻/地区/统计周期/策展档位)+ 逐源覆盖矩阵与降级项 | [来源: macro_calendar 引擎输出] |
| 池提醒(事件参考) | 提醒窗内有解禁批次的标的(日/距今交易日/数量/股东数/类型) | [来源: unlock_source 引擎输出] |
| 池变化(对照参考) | 相较上次运行的新增/消失/字段变化 | [来源: 状态文件 diff 引擎输出] |
| 市场日历(事件参考) | 未来 30 日逐日解禁家数/市值 + 高压日标注(无个股名单) | [来源: unlock_calendar 引擎输出] |
只描述供给事件事实,不含任何动作建议;执行由你依据自身纪律决定。
机器层准出(报告类产出必跑,非可选):
uv run python skills/lib/report_qc.py <产出文件> --fail-on error→ 无 error 级发现(退出码 0/1)方可交付;sourcing warning(F2 派生词缺来源 / F4 §N 引用不存在)须人工复核后消除或说明。
版本历史
- 9fbd24f 当前 2026-09-21 23:59


