缠中说禅技术分析工具;缠论;股票;期货;Quant;量化交易

5,705 stars Rust #czsc#quant#tushare
RAW Rules

CLAUDE.md

# CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

## 项目概述

CZSC(缠中说禅技术分析工具)是基于缠中说禅理论的综合性量化交易Python库,提供技术分析、信号生成、回测和市场分析等功能。本项目专注于实现缠论的分型、笔、线段等核心概念的自动识别,以及基于此的多级别量化交易策略。

## 🏛️ 开发宪法(Constitution)

以下规则是本项目长期演进的**硬约束**,任何 PR、任何重构、任何"为了赶进度的临时变通"都不得违反。与此冲突的代码审查意见、个人偏好、历史代码一律以本节为准;违反本节的代码即便已合入,也按 bug 处理、必须回滚或修复。

### 第一条 · Rust ↔ Python 行为一致

**需要 Rust 实现的部分必须同时满足 Rust crate 与 Python wheel 行为一致(Python 端纯透传,禁止再写适配层)。**

> 落地参考(2026-05-17):策略门面 `CzscStrategyBase` 的 `unique_signals` / `save_positions` / `load_positions` 已全部下沉到 `crates/czsc-trader/src/strategy.rs`,Python 端只剩 1 行 `_native.*` 透传;新增的文件完整性校验改用 `sha256(canonical JSON)`,可在 Rust / Python 端 byte-for-byte 一致复现。任何违反本条的新 PR 都会被 `tests/unit/test_strategy_save_load_parity.py::test_strategies_module_no_longer_uses_hashlib_or_json` 等源码级 ratchet 拦下。

具体含义:

- 同一个名字(如 `monotonicity` / `CzscStrategyBase` / `generate_czsc_signals` / `CZSC`),`cargo add czsc` 的 Rust 用户与 `pip install czsc` 的 Python 用户调用后**行为必须一致**——同样的输入产生同样的输出,默认参数、错误处理、边界条件、字段命名都一致。
- Python 侧**只允许**做下面两类工作:
  1. **纯透传**:`from czsc._native import xxx` 后直接 re-export,不做任何包装;
  2. **不可避免的 PyO3 边界胶水**:DataFrame ↔ Arrow IPC 序列化、`pathlib.Path` ↔ `String` 转换等,PyO3 类型系统无法跨越的边界处理。
- **禁止**在 Python 侧做参数归一化、默认值补齐、返回值字段重命名、错误码翻译、`isinstance` 多态分支等"适配层"工作——这类逻辑必须下沉到 Rust 端实现(修改现有 API 或新增 API)。
- 新增 Python wrapper 之前,PR 描述里必须先回答"为什么不能改成 Rust 实现",并经过 reviewer 显式批准。

**违反本条的常见信号(在 review 中视为红线)**:

- Python 函数体内出现 `if isinstance(bars, pd.DataFrame): ... elif isinstance(bars, list): ...` 等多态分支;
- Python 函数返回的 dict 字段顺序 / 命名与 Rust 端 `serde` 输出不一致;
- 同一份功能在 Python 测试覆盖完整,但 `cargo test` 没有等价用例;
- CHANGELOG 写 "Python 端默认参数从 X 改为 Y",但 Rust 端无对应改动;
- `czsc/_runtime_adapters.py` 等"适配层"文件持续膨胀,而不是被逐步搬空到 Rust。

## 常用开发命令

### UV 包管理 (项目使用UV管理依赖)
```bash
# 同步依赖并安装开发工具(仅在 pyproject.toml / uv.lock 变更时跑)
uv sync --extra dev

# 安装所有依赖组合
uv sync --extra all

# 运行测试(日常默认 --no-sync,省去每次 4-5s 的 lockfile/venv 一致性检查)
uv run --no-sync pytest

# 运行指定测试文件
uv run --no-sync pytest tests/test_analyze.py -v

# 运行单个测试函数
uv run --no-sync pytest tests/test_analyze.py::test_czsc_basic -v

# 带覆盖率的测试
uv run --no-sync pytest --cov=czsc

# 跑全套(含 @pytest.mark.slow 标记的耗时测试,CI / 发布前用)
uv run --no-sync pytest --run-slow

# 代码格式化和检查(项目使用 ruff,不使用 black/isort/flake8)
uv run --no-sync ruff format czsc/ tests/
uv run --no-sync ruff check czsc/ tests/
```

> **`--no-sync` 约定**:`uv run` 默认会做 lockfile 解析 + venv 一致性检查(本地稳定 4-5s 固定开销)。日常开发循环里依赖很少变,统一用 `--no-sync` 跳过;仅在 `pyproject.toml` / `uv.lock` 改动后显式跑一次 `uv sync` 即可。

### 测试规范
- 所有测试文件位于 `tests/` 目录,使用 pytest 格式
- **关键原则**:测试数据统一通过 `czsc.mock` 模块获取,不要在测试中硬编码模拟数据
- 测试文件命名模式:`test_*.py`
- 模拟数据使用 `generate_symbol_kines` 函数生成,支持多品种、多频率、可重现的随机数据
- **慢测试约定**:依赖 `time.sleep` 或子进程冷启动的测试加 `@pytest.mark.slow`,默认跳过;CI / 发布前用 `pytest --run-slow` 跑全套。注册逻辑见 `tests/conftest.py`。


## 代码架构

### 核心组件

1. **`czsc._native`** - PyO3 编译产生的 Rust 扩展模块(缠论核心):
   - 由 `crates/czsc-python` 通过 `maturin` 打包,扩展模块名 `czsc._native`
   - 暴露 `CZSC / FX / BI / ZS / RawBar / NewBar / Freq / Mark / Direction / Operate / Signal / Event / Position / BarGenerator` 等核心类型
   - 暴露 `check_bi / check_fx / check_fxs / remove_include / freq_end_time / is_trading_time` 等工具函数
   - 暴露 220+ 信号函数(Python 端 7 个子模块:bar/cvolp/cxt/obv/pressure/tas/vol;底层 `crates/czsc-signals/src/` 有 22 个 .rs 源文件,可用 `ls crates/czsc-signals/src/` 自查最新清单)
   - 暴露 `czsc._native.ta.*`(Rust TA 算子,供信号函数内部使用;本次清理 起 Python 端不再暴露 `czsc.ta` 顶层 alias)
   - **不存在 Python 回退**:核心分析统一由 Rust 实现。

2. **`crates/`** - Rust workspace(9 个 crate):
   - `czsc` / `czsc-core` / `czsc-derive` / `czsc-signals` / `czsc-trader` / `czsc-utils` / `czsc-ta`
   - `czsc-signal-macros`(proc-macro,`#[signal]` 注册宏)
   - `czsc-python`(PyO3 binding 总入口,唯一启用 `pyo3/extension-module` 的 crate)

3. **`czsc/traders/`** - 交易执行框架:
   - `__init__.py`:facade,统一 re-export `CzscSignals / CzscTrader / generate_czsc_signals / get_signals_config / get_signals_freqs / derive_signals_config / derive_signals_freqs / get_unique_signals / WeightBacktest`,全部来自 `czsc._native` 或 `wbt`
   - `base.py` / `sig_parse.py` 纯透传文件已于 2026-05-17 PR-C 整文件 git rm,新代码请直接走 `czsc.traders` 或 `czsc._native`
   - `optimize.py` 已于 2026-05-17 PR-C `git mv` 到 `czsc/utils/optimize.py`(职责更贴近 utils);调用方请用 `from czsc.utils.optimize import OpensOptimize, ExitsOptimize, CzscOpenOptimStrategy, CzscExitOptimStrategy`

4. **`czsc/_native.signals`** - 信号函数(Rust 实现,通过 PyO3 暴露):
   - Python 端暴露 7 个子模块(bar/cvolp/cxt/obv/pressure/tas/vol);底层 `crates/czsc-signals/src/` 有 22 个 .rs 源文件,自查命令:`ls crates/czsc-signals/src/`
   - 原 `czsc/signals/` Python 命名空间层已在 Phase J **彻底删除**
   - 通过 `czsc.traders.generate_czsc_signals` 等接口调用信号
   - 信号解析 API:`get_signals_config` / `get_signals_freqs`(`czsc.traders`)

5. **`czsc/utils/`** - 工具模块(Phase J 精简后):
   - `data/cache.py` / `io.py` / `log.py` / `kline_quality.py`:缓存、IO、日志、K 线质量校验
   - `analysis/corr.py`(仅剩 `cross_sectional_ic`;`stats.py` 与 `nmi_matrix` / `single_linear` 已于 2026-05-17 PR-A 删除,`daily_performance` / `top_drawdowns` 改由顶层 `czsc.*` 透传 wbt)
   - `data/client.py`:统一数据客户端接口
   - TA 算子由 Rust `czsc._native.ta` 提供(信号内部依赖),顶层别名 `czsc.{ema,sma,rolling_rank,boll_positions,ultimate_smoother}` 保留;仪表盘场景的 MACD(×2 约定)已下沉为 `czsc/utils/plotting/_macd.py` 私有辅助
   - `trade.py`:交易工具
   - `plotting/{kline,weight}.py` + `plotting/lightweight/`:plotly 单周期 K 线 + 权重时序图 / lightweight-charts 自包含 HTML
   - 已删除:`bar_generator.py` / `bi_info.py`(Rust 已实现)、`st_components.py` / `echarts_*` / `pdf_report` / `html_report_builder` / `word_writer` / `signal_analyzer` / `crypto/` / `czsc/svc/` / `plotting/backtest.py` / `plotting/common.py`(本次清理 删除 Streamlit 组件库与回测可视化函数;迁移详见 `docs/migration/cleanup-non-czsc-core.md`)

7. **`czsc/connectors/`** - 数据源连接器:
   - 支持天勤、Tushare、CCXT 等多个数据源
   - 统一的数据接口封装;`local_data.py`(原 `research.py`)提供 CZSC 投研共享数据的本地缓存读取入口

### 信号-事件-交易体系

项目实现了系统化的量化交易方法:
- **信号(Signals)**: 基础技术指标和市场状态
- **事件(Events)**: 信号的逻辑组合,通过 signals_all/signals_any/signals_not 实现 AND/OR/NOT 逻辑
- **交易(Trading)**: 基于事件和风险管理的执行

### 多级别联立分析

CZSC 支持使用 `CzscTrader` 类进行多级别联立分析,可同时分析不同时间周期(如1分钟、5分钟、30分钟、日线)进行全面的市场决策。

## 开发指南

### 代码规范
- 行长度:120字符(在 pyproject.toml 中配置)
- 适当使用类型提示
- 遵循代码库中现有的命名约定
- 信号函数通过 `#[signal]` 宏在 Rust 端自动注册到 `SIGNAL_REGISTRY`,命名遵循 Rust 模块约定,不再使用历史上的 `V<yyMMdd>` 版本后缀
- **代码质量原则**:
  - **DRY(Don't Repeat Yourself)**: 提取重复代码为辅助函数
  - **KISS(Keep It Simple)**: 保持函数简洁,职责单一
  - **使用模块级常量**: 避免魔法值,集中管理配置
  - **类型提示优先**: 使用 `Literal`、`Optional` 等提升代码可读性
  - **向后兼容性**: 公共 API 修改需谨慎,避免破坏现有代码
  - **文档完整**: 所有公共函数必须有完整的 docstring

### 信号函数开发
- 信号函数应遵循飞书文档中的规范说明
- 信号函数由 Rust 实现,位于 `crates/czsc-signals/` 中
- 原 Python 版 `czsc/signals/` 已彻底删除(Phase J);新增信号需在 Rust 侧开发
- 信号解析公共 API:`get_signals_config(signals_seq)` / `get_signals_freqs(signals_seq)`(来自 `czsc.traders`)
- 直接使用上述两个函数解析信号配置。

### 数据处理最佳实践
- 测试数据统一通过 `czsc.mock.generate_symbol_kines` 生成
- 使用 `format_standard_kline` 将DataFrame转换为RawBar对象列表
- 使用 `BarGenerator` 进行K线合成和多级别分析
- 通过 `DataClient` 统一访问不同数据源
- 注意使用磁盘缓存提高重复计算效率

### 数据格式转换
```python
# 从 mock 数据生成 CZSC 对象(全部走顶层 czsc 命名空间)
from czsc import CZSC, Freq, format_standard_kline
from czsc.mock import generate_symbol_kines

# 生成K线数据
df = generate_symbol_kines('000001', '30分钟', '20240101', '20240105')

# 转换为RawBar对象列表
bars = format_standard_kline(df, freq=Freq.F30)

# 创建CZSC分析对象
czsc_obj = CZSC(bars)
```

### 回测可视化

`czsc.utils.plotting.backtest` 模块已在二阶段清理 PR-C 删除。推荐做法:

- **权重回测报告**:`wbt.generate_backtest_report(dfw, ...)` 生成自包含 HTML(参见 `docs/examples/13_event_weight_backtest.py`)
- **缠论 + 多周期联立**:`czsc.utils.plotting.lightweight.plot_czsc{,_trader,_signals}` 输出 lightweight-charts HTML
- **单周期 K 线 + 缠论结构**:`czsc.utils.plotting.kline.KlineChart` / `plot_czsc_chart`
- **自定义统计图**:直接用 `plotly.express` / `plotly.graph_objects`,迁移示例见 `docs/migration/cleanup-non-czsc-core.md`

### 依赖管理(UV配置)
- 核心运行时依赖定义在 `pyproject.toml` 的 `[project.dependencies]` 中
- 开发依赖在 `[project.optional-dependencies.dev]` 中
- 测试依赖在 `[project.optional-dependencies.test]` 中
- 使用 UV 进行依赖管理和虚拟环境控制
- 项目使用 UV 管理 Python 依赖与虚拟环境(详见根目录 README "开发环境" 章节)

## 关键环境变量和设置

- `CZSC_VERBOSE` / `czsc_verbose`:是否打印详细日志(来自 `czsc.envs`)
- `CZSC_MIN_BI_LEN` / `czsc_min_bi_len`:最小笔长度,默认 6(来自 `czsc.envs`)
- `CZSC_MAX_BI_NUM` / `czsc_max_bi_num`:最大笔数量,默认 50(来自 `czsc.envs`)
- 大小写两种写法都接受,大写优先;构造器显式参数优先级最高
- 缓存目录自动管理,具备大小监控功能

## 缓存管理

项目大量使用磁盘缓存:
- 缓存位置:`czsc.home_path`(顶层)或 `czsc.utils.data.cache.home_path`(实际定义处)
- 清除缓存:`czsc.empty_cache_path()`
- 监控大小:`czsc.get_dir_size(czsc.home_path)`
- 当缓存超过1GB时 `czsc.welcome()` 会显示清理提示

## 可视化(Plotly + HTML)

所有可视化统一由 plotly 实现,输出方式:

- `czsc.utils.plotting.kline.KlineChart` / `plot_czsc_chart`:单周期 K 线 + 缠论结构(plotly Figure,可 `fig.show()` 或写 HTML)
- `czsc.utils.plotting.weight.*`:权重时序图(plotly)
- `czsc.utils.plotting.lightweight.plot_czsc{,_trader,_signals}`:lightweight-charts 自包含 HTML,多周期联立 + 信号叠加

使用 `plot_czsc`、`plot_czsc_trader` 或 `plot_czsc_signals` 生成自包含 HTML 后,可直接在浏览器中打开。

## Rust/Python 混合架构

项目核心算法用 Rust 实现,通过 PyO3 暴露给 Python:
- **构建方式**:`maturin + Rust workspace`,扩展模块名 `czsc._native`
- **唯一架构**:Rust 是缠论核心算法的唯一实现;Python 端不再保留任何回退(spec §3.1 / §3.4)
- **API 暴露**:所有面向用户的 API 都通过 `czsc.xxx` 顶层命名空间暴露,禁止用户感知 `czsc._native`
- **Python/Rust 分工**:见本文件顶部「🏛️ 开发宪法 · 第一条」。该条款是硬约束,与此冲突的任何"局部例外"都不成立。
- **类型 stub**:`czsc/py.typed` 启用 inline 类型注解;扩展模块 stub 已生成于 `czsc/_native/__init__.pyi`,由 `pyo3-stub-gen` 自动维护
- **构建环境约束**:`pyo3-stub-gen` 与 `pyo3` 0.22 都要求 Python ≥ 3.10;通过 `crates/czsc-python/build.rs` 在编译期校验 `PYO3_PYTHON`,低于 3.10 时直接报错
- **版本号锁死**(PR-5):crates.io 与 PyPI 必须使用同一版本号。**唯一版本源**是 `Cargo.toml [workspace.package].version`;`pyproject.toml` 用 `dynamic = ["version"]`,由 maturin 在打 wheel 时从 Cargo workspace 注入。`crates/czsc-python/build.rs` 会在编译期校验 pyproject.toml 仍然走 dynamic 路径,禁止硬编码 `version = "..."`
- **发版流程**:bump `Cargo.toml [workspace.package].version` 后,同步 publish 到 crates.io(`cargo publish`)与 PyPI(`maturin publish`);CHANGELOG 必须列出本次 release 的 breaking changes
- **rs-czsc 关系**:czsc 一次性 fork rs-czsc 的 Rust 实现进本仓库,**不再做季度同步**;`tests/parity/` 目录已删除,不再保留 rs-czsc parity 比对测试

## 数据连接器支持

项目集成多个数据源连接器(见 `czsc/connectors/`):
- `tq_connector.py`: 天勤数据源
- `ts_connector.py`: Tushare 数据源
- `ccxt_connector.py`: 数字货币数据源
- `local_data.py`: 投研数据本地缓存接口(原 `research.py`,已于评审决议中改名)

## 回测和策略研究框架

### 策略开发基础(`czsc/strategies.py`)
- `CzscStrategyBase`: 策略开发的抽象基类
- `CzscJsonStrategy`: JSON 配置化的策略实现
- 策略要素:品种参数、K线周期、信号配置、持仓策略
- 支持策略序列化和反序列化
- 研究入口统一指向 `czsc.research.run_research / run_replay / run_optimize_batch`(Rust 后端)

### 信号函数体系(`czsc._native.signals`)
- 信号函数由 Rust 实现,通过 PyO3 暴露为 `czsc._native.signals.*`
- Python 端暴露 7 个子模块(bar/cvolp/cxt/obv/pressure/tas/vol);底层 `crates/czsc-signals/src/` 有 22 个 .rs 源文件,自查命令:`ls crates/czsc-signals/src/`
- 注册机制:`#[signal]` 宏自动注册到 `SIGNAL_REGISTRY`,不再使用 `V<yyMMdd>` 版本后缀
- 原 Python `czsc/signals/` 目录已彻底删除(Phase J)
- 信号配置解析:`get_signals_config` / `get_signals_freqs`(`czsc.traders`),底层调用 Rust 端 `derive_signals_config` / `derive_signals_freqs`

### 探索性数据分析(顶层 `czsc.*`,原 `czsc/eda.py` 已下线)
- `monotonicity`: 单调性分析(PR-D 已下沉 Rust 实现)
- `mark_cta_periods`: 标记 CTA 最易/最难赚钱时间段(PR-B 拆到 `czsc/utils/`)
- `mark_volatility`: 标记高/低波动率时间段(PR-B 拆到 `czsc/utils/`)

> 其余历史函数 `weights_simple_ensemble` / `cal_trade_price` / `cal_yearly_days` / `turnover_rate` 已于 PR-A 二阶段清理中删除;迁移说明见 [`docs/migration/cleanup-non-czsc-core.md`](docs/migration/cleanup-non-czsc-core.md)。

## 重要文档和资源

- [项目文档](https://s0cqcxuy3p.feishu.cn/wiki/wikcn3gB1MKl3ClpLnboHM1QgKf)
- [信号函数编写规范](https://s0cqcxuy3p.feishu.cn/wiki/wikcnCFLLTNGbr2THqo7KtWfBkd)
- [API文档](https://czsc.readthedocs.io/en/latest/modules.html)
- [B站视频教程](https://space.bilibili.com/243682308/channel/series)

## 示例代码和用例

项目维护的示例代码集中在 `docs/examples/` 下(如 `08_weight_backtest.py`、`13_lightweight_charts_html.py`、`15_lightweight_signals_html.py` 等);HTML 路径示例(13/15)完整保留。

## 项目特色和最佳实践

1. **混合架构设计**: Rust性能优化 + Python灵活性
2. **多级别联立分析**: 支持多时间周期综合决策
3. **系统化信号体系**: 信号→事件→交易的完整流程
4. **丰富的数据源**: 支持A股、期货、数字货币等多市场
5. **完善的测试框架**: 统一的模拟数据生成和测试规范
6. **可视化工具**: Plotly + lightweight-charts HTML 输出
7. **策略研究工具**: CTA框架、参数优化、回测分析一体化
8. **代码质量优化**: 遵循 DRY、KISS、SOLID 原则
   - 使用模块级常量消除魔法值
   - 提取辅助函数减少代码重复
   - 完善的类型提示(Type Hints)
   - 清晰的函数职责分离
   - 保持向后兼容性的 API 设计