关于 crucible-research-foundations
crucible-research-foundations 是用于评估交易信号和量化实验的研究技能,强调因果特征、恰当的随机置换零假设、显著性核验和持久审计记录。它还要求在放弃信号前分析亏损。
主要功能
- 01因果特征与标签泄漏检查
- 02选择匹配假设的随机置换零假设
- 03核验显著性估计
- 04仅追加的发现台账与审计目录
- 05信号亏损的事后分析
适用场景
- 01检查交易特征是否存在前视偏差
- 02检验信号是否优于恰当的零假设
- 03核验 Agent 报告的显著性结果
- 04记录正向与零结果研究
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ terrylica/ cc-skills --skill crucible-research-foundations安装后在 Claude Code 中输入/crucible-research-foundations确认已加载。
附带文件references/evolution-log.md
详细介绍
研究基础——6 项认识论准则
自我演进技能:此技能会在使用过程中不断改进。如果某项准则的指导在实践中失效,或出现了新的陷阱,请更新相关章节,并追加记录到
references/evolution-log.md。不要拖延。
请按顺序阅读。前三项(因果性、标签、空值)是最难掌握的前置条件——违反其中任何一项,都会让所有后续结果悄然失效。
1. 因果特征不变量 (bars[:i])
在触发/决策 K 线 i 上使用的每个特征 f[i],都必须仅使用 bars[0:i] 计算——绝不能使用 bars[i] 或 bars[i+1:]。违反此规则会造成前视偏差;研究发现会悄然变得毫无价值。
标准模式:
for i in range(n):
lo = max(0, i - window)
wind = values[lo:i] # EXCLUSIVE upper bound — no peeking
f[i] = compute(wind)
注意 lo:i(不包含末尾),而不是 lo:i+1。这项准则“感觉像差了一个位置”,但它是正确的。
验证测试(为每个新特征函数添加):
def test_causality(fn, n=1000):
bars = generate_test_bars(n)
f_orig = fn(bars)
bars_mod = bars.copy()
bars_mod[500:] *= 2 # perturb the FUTURE
f_mod = fn(bars_mod)
assert np.array_equal(f_orig[:500], f_mod[:500]), "look-ahead detected"
隐蔽错误的表现:结果好得不真实(外汇上 tw > 10 bps,胜率 > 70%,样本外结果与样本内完全一致)。
完整参考:findings/methodology/10-causal-feature-invariant.md。
2. 标签泄漏(按 K 线局部缩放可消除窗口泄漏)
前向标签必须按触发 K 线自身的区间缩放,绝不能按整个窗口的尺度缩放。相对于窗口的标签是同义反复。
陷阱:如果你将 fwd+H = UP when close[i+H] - close[i] > window.span/20 作为标签,那么当 close[i] 接近 window.min(loc=B)时,fwd=UP 几乎会自动成立。Agent 会报告虚假的“信号”。
修复方法:使用 K 线局部的三重障碍标签:
r = high[i] - low[i] # THIS bar's range, not window's
tp_level = close[i] + tp_mult * r
sl_level = close[i] - sl_mult * r
# walk forward, exit at first tp/sl/expiry
陷入此陷阱的表现:表面上的信号随着 loc 五分位数单调增强;在测试相邻单元时则会崩溃。
完整参考:findings/methodology/02-label-leakage-bar-local-scaling.md。
3. 随机打乱空值设计(3 种空值类型——选对方法)
在信任结果之前,必须进行随机打乱空值测试,但打乱什么是一项设计决策。
| 假设类别 | 打乱什么 | 阶段示例 |
|---|---|---|
| “特征 X 可以预测结果” | 打乱特征值 | Phase F-B(使用了错误的空值,错误地“证伪”了真实信号) |
| “触发模式在有信息量的时间点触发” | 打乱触发掩码(保留触发频率,移动触发位置) | Phase C(在 z=+5.74 处验证了 ngram_triple_fast_up) |
| “筛选器能改善选取结果” | 打乱哪些交易通过筛选器 | Phase L-C(将筛选器与 N 组随机抽取进行评估) |
规则:问自己:“用一句话概括,备择假设是什么?”如果你无法说清,就说明你还不知道自己在检验什么。
常见错误:
- 测试触发模式时使用特征打乱 → 破坏模式所依赖的时间结构 → 真实信号看起来比打乱后的噪声更差
- 空值约束不足(空值标准差相对于观测效应过大)→ 统计检验效能不足
- 空值约束过严(置换次数太少)→ z 估计值不可靠;z<3 时使用 ≥100 次,z<2 时使用 ≥1000 次
完整参考:findings/methodology/03-shuffled-null-design.md。
4. Agent 显著性校正(z 分数被夸大了 2–3 倍)
大模型 Agent 会系统性地夸大 z 分数。应将 Agent 报告的 p 值视为上限。
两种夸大模式:
- 将筛选结果报告为单次检验:Agent 尝试了 25 个变体(或从 17,280 种组合中选出最佳组合),却把胜出项的样本内 z 分数报告得仿佛它是唯一一次检验。胜出项只是一个假设,并非发现。不要用试验次数校正(Bonferroni、
sqrt(2 ln K)零假设最大值、Deflated Sharpe Ratio、最小回测长度(MinBTL)、FDR/FWER、e-LOND)来修正:本仓库不会计算、报告或排序这些指标,也不会引用它们(issue #35)。应记录胜出项(规则、阈值、窗口),并用未用于筛选任何变体的数据重新检验;报告该 z 分数。 - 混淆样本均值 z 分数与二项比例 z 分数:N=840 时,53.5% 与 50% 的差异对应 z≈2.0,而不是 4.2。
务必核实:
- Agent 在报告某个结果前尝试了多少个变体?如果不止一个,报告的规则是否已在未使用的数据上得到验证?
- 自行重新推导 z:
(real - null.mean) / null.std - 假设(规则、阈值、窗口)是否在运行前就已固定?应根据模型本身的简约性进行判断,而不是根据试验次数。
可信度阈值:
- z > 5,N > 500:可能是真实信号,应进一步检验
- z 在 [3, 5]:有希望,必须通过门控验证
- z 在 [2, 3]:可疑,要求相邻单元梯度 + 零假设检验
- z < 2:视为零效应
完整参考:findings/methodology/09-agent-significance-corrections.md。
5. 记录管理规范(仅追加台账 + 审计文件夹)
每项调查——无论结果为正还是零效应——都必须生成永久且易于查找的记录。
三层架构:
findings/
├── evolution/
│ ├── evolution.jsonl # append-only ledger
│ └── audits/
│ └── YYYY-MM-DD-slug/
│ ├── CLAUDE.md # navigator
│ ├── verdict.md # plain-English conclusion
│ ├── CHRONICLE.md # narrative (for major findings)
│ ├── <reproducer>.py # script that regenerates headline numbers
│ └── <artifact>.json # raw telemetry
└── methodology/ # universal principles
台账条目字段:id、date、status、supersedes、superseded_by、headline、key_numbers、evidence(文件路径)、sha256_results。
supersedes 模式:当后续发现取代先前发现时,新增条目并设置 supersedes: "OLD-ID";更新旧条目并设置 superseded_by: "NEW-ID"。不要删除较早的审计文件夹。
完整参考:findings/methodology/07-record-keeping-discipline.md。
6. 放弃前先做事后分析
在宣布某个信号失效前,应为每笔交易补充因果性入场前特征,并针对单笔亏损寻找筛选条件。一个“有时有效”的信号,往往只是尚未被识别出可筛选条件。
流程:
- 在完整历史数据上运行该信号;收集 N 笔交易结果
- 在每个触发 bar 计算约 20–30 个因果特征
- 导出逐笔交易 parquet + CSV(每笔交易一行)
- 提交给多视角 Agent(见 Skill B)
- 每个 Agent 寻找能区分赢家与输家的筛选条件
- 根据打乱后的零假设评估筛选条件(见 §3)
淘汰选择性指标:losers_killed / max(1, winners_killed)。< 1.0 = 有害;1.0–1.2 = 边际;1.2–1.5 = 有用;> 1.5 = 强。
会话示例:基准值为 +0.178 bps → 应用 Phase-L 筛选条件后为 +0.514 bps。通过丰富特征驱动的筛选条件搜索,提升了 2.9 倍。
完整参考:findings/methodology/06-per-trade-enrichment-postmortem.md。
确认次数(暂定,截至会话 ca9d7ffa)
| 原则 | 已确认 | 备注 |
|---|---|---|
| 1. causal-feature-invariant | 18+(每个阶段) | 根本原则;只有经过证明才能舍弃 |
| 2. label-leakage | 2 | 直接发现了虚假的“底部拒绝率更低”现象 |
| 3. shuffled-null-design | 4 | Phase F-B 错误零假设、Phase C 正确零假设、Phase L 筛选零假设、Phase M 管理零假设 |
| 4. agent-sig-corrections | 5+ | 组合分析、转变不对称性、交易管理 Agent 都夸大了结果 |
| 5. record-keeping | 5 条账目记录 | NGRAM3FU-STRADDLE 的完整链路 |
| 6. post-mortem | 1 | Phase L 找到了筛选条件;需要在其他活动中重新确认 |
confirmed 越高 = 越可信。原则 6 只有一次确认,应视为暂定。
执行后反思
使用此技能后:
- 应用某条原则是否发现了 bug 或误报?在上表中增加其
confirmed次数;在references/evolution-log.md中注明该原则生效的会话。 - 某条原则是否失效(指导错误)?在表中降低其等级;在
references/archive/中添加superseded_by指针,并注明resurrect_if:条件。 - 是否遇到了尚未涵盖的新陷阱?在此处起草新章节,并追加到演变日志中。
- 切勿悄然略过。只有将现实修正反馈回来,此技能的价值才能不断累积。