模块以 models.py 中的冻结 dataclass(ShadowProfile、ShadowRule、AttributionBreakdown、ShadowBacktestResult)作为稳定契约边界,所有子模块仅通过该层交互:
- extractor.py:解析经纪商日志 → FIFO 配对 → 计算特征(含可选价格上下文 RSI/5d 收益)→ KMeans 聚类 + 分位数规则抽取 → 可选 LLM 翻译 → 产出 ShadowProfile。
- codegen.py:用 Jinja2 模板 templates/signal_engine.py.j2 将 ShadowProfile.rules 渲染为 Python 源码,并通过 ast.parse + 结构校验确保生成的 SignalEngine.generate 接口合法;同时生成 config.json。
- backtester.py:按结算货币分组(USD/HKD/CNY)选择流动性标的池,调用 write_run_dir 生成运行目录并驱动 src.tools.backtest_tool.run_backtest,解析 artifacts 得到 ShadowBacktestResult,并用算术方法对噪声交易、早/晚退出、过度交易进行 PnL 归因。
- scanner.py:基于相同 RSI 实现和条件匹配器,在当日 OHLCV 上扫描 ShadowProfile 中的规则,返回研究级候选信号。
- reporter.py + templates/shadow_report.html|css:渲染 HTML 报告。
- storage.py:按 shadow_id 管理 JSON profile 与回测结果的持久化。
依赖方向单向:__init__.py 聚合导出公共 API,各子模块不互相循环引用,外部依赖(sklearn、Jinja2、backtest loaders)均在函数内部延迟导入以避免冷启动开销。