# hs300_x6667 数据预处理与转存

将 `/intern9/NST0_h5_data/hs300_x6667` 下按「日期_交易所」组织的 `x_part0..6`（因子）与 `yfw.h5`（标签）整理为：

- **全局因子索引**：6667 个因子的名称与 part/列号映射，便于按名或按下标筛选（如只取 200 个因子训练）。
- **按日 manifest**：所有可用 `日期_交易所` 目录列表。
- **按日合并 H5（可选）**：每个目录合并为单个 H5（`x`: 股票×时间×6667，`y`/`w` 等来自 yfw），便于按日加载。
- **统一加载接口**：按日期 + 因子下标/名称加载，优先读 merged 文件，不存在则从原始 part 按列拼接。

## 1. 运行顺序

```bash
# 1）生成全局因子索引（output/factor_index.json 等）
python build_factor_index.py

# 2）生成按日 manifest（output/days_manifest.json）
python build_days_manifest.py

# 3）按日合并为单个 H5（可选，单日数据量大，可先试 --max-days 2）
python convert_days_to_merged.py [--output-dir output] [--max-days N] [--float16]
```

不跑第 3 步也可以：加载时会自动从原始 `x_part*` + `yfw.h5` 按需读指定因子列。

## 2. 训练时加载示例

```python
from hs300_preprocess.load_merged import load_day, list_available_days

# 按 200 个因子下标加载（如训练时只取 200 个因子）
x, y, w, meta = load_day("20241008_sh", factor_indices=list(range(200)))
# x: (n_stock, n_time, 200), y: (n_stock, n_time, 44), w: (n_stock, n_time)

# 按因子名加载
x, y, w, meta = load_day("20241008_sh", factor_names=["HFTDepth.TStar9", "HFTDepth.TStar17", ...])

# 列出所有可用日期
dates = list_available_days()
```

## 3. 输出目录结构（默认 output/）

- `factor_index.json`：`n_factors`、`factor_names`、`part_col_ranges`。
- `factor_index_full.json`：每因子的 `global_index` / `name` / `part_id` / `col_in_part`。
- `days_manifest.json`：`days` 列表，每项含 `date_exchange`、`path`、`x_part_exists`、`yfw_exists`。
- `merged/`：按日合并后的 H5（仅当执行过 convert_days_to_merged.py 时存在）。

## 4. 说明

- 维度约定：**（股票, 时间, 因子）**；y 为（股票, 时间, 44）标签，w 为（股票, 时间）权重。
- 合并单日时若磁盘紧张，可使用 `--float16` 减半 x 体积；全量 650 天合并约十几 TB 量级，可按需只合并部分天数或仅用「原始 part + 加载器」不落盘合并。
