wbt 0.2.1

Weight-based backtesting engine for quantitative trading
# 设计方案调整

## 20260402

1. WeightBacktest 中的 dfw 参数名称改成 data,同时支持三种类型的输入
    - pd.DataFrame
    - pl.DataFrame / pl.LazyFrame
    - file 路径(csv/feather/parquet/xlsx 四种常见格式)

2. 评估指标的优化(三大类:收益、风险、特质)

    收益指标:

    - 绝对收益
    - 年化收益
    - 夏普比率
    - 卡玛比率
    - 新高占比
    - 单笔盈亏比    - 用pairs计算
    - 单笔收益      - 用pairs计算
    - 日胜率
    - 周胜率
    - 月胜率
    - 季胜率
    - 年胜率 - 细节:当年交易天数不到 yearly days 的一半,不计算这一年

    风险指标:

    - 最大回撤
    - 年化波动率
    - 下行波动率
    - 新高间隔

    特质指标:

    - 交易次数      - 用pairs计算
    - 年化交易次数  - 用pairs计算
    - 持仓K线数     - 用pairs计算
    - 交易胜率      - 用pairs计算
    - 多头占比      - 用weight计算
    - 空头占比      - 用weight计算

    stats - 多空综合的评估指标
    long_stats - 只看多头部分的评估指标
    short_stats - 只看空头部分的评估指标

3. 新增 segment_stats 函数
    s = segment_stats(sdt="20170101", edt="20190101", kind="多头/空头/多空")
    按 sdt 和 edt 分别过滤 dailys 和 pairs,然后计算出 2 种的所有指标

4. 新增 long_alpha_stats 函数
    将多头的日收益和基准的日收益,按目标年化波动率20%调整后,多头累计 - 基准累计 = 多头超额;
    用 daily_performance 在多头超额上面计算指标

5. python/wbt 下面新增 plotting 模块,根据 weight backtest 的输出数据格式,绘制各种可视化图表

    画图仅依赖 plotly
    参考 czsc 库下面的 svc 模块和 utils/plotting 模块,需要仔细甑别哪些绘图函数是针对回测场景有效的。
    可以先统一数据格式,然后根据统一的格式来绘制图表

## 20260403

1. 所有涉及到 stats 输出的函数,输出的字段顺序都按照以下方式(包括字段名称),这样人工可读性强

    {'绝对收益': -8.9528,
    '年化收益': -0.4117,
    '夏普比率': -2.9296,
    '卡玛比率': -0.0455,
    '新高占比': 0.0011,
    '单笔盈亏比': 0.927,
    '单笔收益': -1.98,
    '日胜率': 0.4226,
    '周胜率': 0.3406,
    '月胜率': 0.2541,
    '季胜率': 0.0984,
    '年胜率': 0.0,
    '最大回撤': 9.0425,
    '年化波动率': 0.1405,
    '下行波动率': 0.0907,
    '新高间隔': 2.0,
    '交易次数': 7497492,
    '年化交易次数': 344775.18,
    '持仓K线数': 3.77,
    '交易胜率': 0.5078,
    '多头占比': 0.1575,
    '空头占比': 0.84,
    '品种数量': 5,
    '开始日期': '2010-01-01',
    '结束日期': '2025-01-01'}

2. segment_stats 中 sdt 和 edt 参数应该以 str 为主,兼容 timestamp 之类的格式,不要用 int 

3. 在 wbt\python\scripts\quick_start.ipynb 中提供 plotting 函数的使用案例,并直接运行出来

## 20260517

从 czsc 库迁移 5 个常用函数到 wbt,并把可发布行为保持一致。

1. 业务逻辑全部下沉到 Rust(针对 Rust 核心 + Python 适配的两个函数),Python 侧只做 pandas ↔ Arrow IPC 格式适配;Rust 端的 warning 通过 `log` + `pyo3-log` 桥接到 Python `logging`,loguru 用户配一次 `InterceptHandler` 即可接管。

2. 模块组织:每个函数在 `python/wbt/utils/` 下独立一个 `.py` 文件,由 `utils/__init__.py` 汇总后再由顶层 `wbt/__init__.py` 透传。

3. 新增 API 清单:

   | API | 来源 | 实现层 | 说明 |
   |---|---|---|---|
   | `cal_yearly_days(dts)` | `czsc.eda` | Rust core + Python adapter | 年度交易日数,跨度 <365 天时回退 252 并发 warning |
   | `rolling_daily_performance(df, ret_col, window, min_periods, yearly_days)` | `czsc.utils.analysis.stats` | Rust core + Python adapter | 滚动窗口日度绩效;自动排序、NaN→0、自动推断 yearly_days |
   | `weights_simple_ensemble(df, weight_cols, method, only_long)` | `czsc.eda` | 纯 Python | 多策略权重集成(mean / vote / sum_clip) |
   | `cal_trade_price(df, digits, windows)` | `czsc.eda` | 纯 Python | TWAP / VWAP 与下根 K 线交易价表 |
   | `log_strategy_info(strategy, df)` | `czsc.utils.log` | 纯 Python | 用 loguru 打印每个品种的权重摘要 |

4. 依赖变更:Rust 端新增 `log = "0.4"` + `pyo3-log = "0.13"`(兼容 pyo3 0.28);Python 端新增 `loguru`
5. 关键质量门:cargo test 142 / cargo clippy clean / pytest 230 / ruff clean / basedpyright clean。

6. 兼容性:所有改动是 additive,没有移除或重命名既有 API。

实施计划与逐 task review 记录见 `docs/superpowers/plans/2026-05-17-czsc-functions-migration.md`。