mcpField
C
crucible-research-foundations

crucible-research-foundations

github.com/terrylica数据与数据库150 次安装1 天前更新
代码仓库

关于 crucible-research-foundations

crucible-research-foundations 是用于评估交易信号和量化实验的研究技能,强调因果特征、恰当的随机置换零假设、显著性核验和持久审计记录。它还要求在放弃信号前分析亏损。

主要功能

  1. 01因果特征与标签泄漏检查
  2. 02选择匹配假设的随机置换零假设
  3. 03核验显著性估计
  4. 04仅追加的发现台账与审计目录
  5. 05信号亏损的事后分析

适用场景

  1. 01检查交易特征是否存在前视偏差
  2. 02检验信号是否优于恰当的零假设
  3. 03核验 Agent 报告的显著性结果
  4. 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 值视为上限。

两种夸大模式:

  1. 将筛选结果报告为单次检验:Agent 尝试了 25 个变体(或从 17,280 种组合中选出最佳组合),却把胜出项的样本内 z 分数报告得仿佛它是唯一一次检验。胜出项只是一个假设,并非发现。不要用试验次数校正(Bonferroni、sqrt(2 ln K) 零假设最大值、Deflated Sharpe Ratio、最小回测长度(MinBTL)、FDR/FWER、e-LOND)来修正:本仓库不会计算、报告或排序这些指标,也不会引用它们(issue #35)。应记录胜出项(规则、阈值、窗口),并用未用于筛选任何变体的数据重新检验;报告该 z 分数。
  2. 混淆样本均值 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. 放弃前先做事后分析

在宣布某个信号失效前,应为每笔交易补充因果性入场前特征,并针对单笔亏损寻找筛选条件。一个“有时有效”的信号,往往只是尚未被识别出可筛选条件。

流程:

  1. 在完整历史数据上运行该信号;收集 N 笔交易结果
  2. 在每个触发 bar 计算约 20–30 个因果特征
  3. 导出逐笔交易 parquet + CSV(每笔交易一行)
  4. 提交给多视角 Agent(见 Skill B)
  5. 每个 Agent 寻找能区分赢家与输家的筛选条件
  6. 根据打乱后的零假设评估筛选条件(见 §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-invariant18+(每个阶段)根本原则;只有经过证明才能舍弃
2. label-leakage2直接发现了虚假的“底部拒绝率更低”现象
3. shuffled-null-design4Phase F-B 错误零假设、Phase C 正确零假设、Phase L 筛选零假设、Phase M 管理零假设
4. agent-sig-corrections5+组合分析、转变不对称性、交易管理 Agent 都夸大了结果
5. record-keeping5 条账目记录NGRAM3FU-STRADDLE 的完整链路
6. post-mortem1Phase L 找到了筛选条件;需要在其他活动中重新确认

confirmed 越高 = 越可信。原则 6 只有一次确认,应视为暂定。


执行后反思

使用此技能后:

  1. 应用某条原则是否发现了 bug 或误报?在上表中增加其 confirmed 次数;在 references/evolution-log.md 中注明该原则生效的会话。
  2. 某条原则是否失效(指导错误)?在表中降低其等级;在 references/archive/ 中添加 superseded_by 指针,并注明 resurrect_if: 条件。
  3. 是否遇到了尚未涵盖的新陷阱?在此处起草新章节,并追加到演变日志中。
  4. 切勿悄然略过。只有将现实修正反馈回来,此技能的价值才能不断累积。

评论

支持 Markdown