---
title: "概念-AlphaGPT-动态词表"
date: 2026-07-21
tags: [AlphaGPT, 择时, 词表, 概念]
source: "AlphaGPT择时框架"
---

## 一句话

词表 = 零件号码本,把每个"特征零件"和"算子零件"编成整数 token;"动态"= 特征的编号
**不写死**,而是拿用户这次传的 `feature_cols` 现场生成。

对应代码:`timing_adapter/timing_vocab.py` 的 `build_vocab` / `TimingVocab`。

---

## 为什么需要词表

模型(小 Transformer)**不认识字符串**,只跟数字打交道。可我们要它写公式,公式由零件拼成:
- **特征零件**:`close`、`volume`、`high`…(用户 DataFrame 的列)
- **算子零件**:`ADD`、`SUB`、`TS_MEAN`…

模型写公式的过程,本质是**一个数字一个数字往外吐**。所以必须先给每个零件编号:

```
  编号(token)    零件名
     0      →     close
     ...
     7      →     ADD
     8      →     SUB
```

模型吐出 `9`,系统查号码本知道"它要用 TS_MEAN"。**词表就是数字↔零件的翻译字典。**

---

## "动态" vs "写死"

### 写死(静态)—— model_core 原版
底层引擎原为 A股选股写,特征**永远固定 11 个**(`RET/MOM/RSI/ATR`…),写死在
`model_core/vocab.py`。想换特征就得改源码。

### 动态 —— timing_adapter 期货版
期货择时里特征是用户临时决定的。这次选 7 列,下次可能加 `ma5`、`mom10` 变 9 列。
号码本得**跟着这次的选择现场生成**——这就叫"动态"。`build_vocab()` 只干这一件事。 ^动态定义

```
  ┌─ 特征区(动态,由用户决定) ─┐
   0 → open           7个特征
   ...                operator_offset = 7
   6 → open_interest
  ├─ 算子区(固定,复用OPS_CONFIG)┤
   7 → ADD            19个算子永远不变
   ...
   25 → (最后一个算子)
  └────────────────────────┘
      总大小 = 7 + 19 = 26  (demo 打印的"词表=26")
```

---

## 最关键的一根轴:operator_offset

`operator_offset = feature_count`(这次是 7),是整个系统的"分界线":

```
  token < 7   →  这是特征,去 feat_tensor 魔方里取那一层切片
  token >= 7  →  这是算子,执行对应运算
```

虚拟机执行公式时碰到 token `3`,因为 `3 < 7` 就知道"这是特征",直接取
`feat_tensor[:, 3, :]`——第3层正好是 close。**编号和魔方的特征层严丝合缝对齐**。
参见 [[概念-AlphaGPT-数据加载与期货缺失值处理#^魔方]]。 ^offset

---

## 为什么费这个劲

| | 写死词表(选股原版) | 动态词表(期货版) |
|---|---|---|
| 特征来源 | 代码钉死11个 | 用户 feature_cols 现场传 |
| 换特征 | 改源码 | 改一个参数 |
| 加自算因子 | 做不到 | df加列+列名塞进feature_cols |
| 底层VM/模型代码 | — | **完全不用改** |

这正是框架那句设计说明的技术实现:**"系统不内置计算,公式里出现的就是你的列名。"**
所以挖出的公式全是用户自己的列名,如 `SUB(...(open)...,high)`。 ^设计意图

---

## 相关笔记
- [[MOC-AlphaGPT择时框架]] — 架构入口
- [[概念-AlphaGPT-数据加载与期货缺失值处理]] — token 编号如何对齐魔方特征层
- [[概念-AlphaGPT-后缀表达式与栈式虚拟机]] — 虚拟机如何用 offset 区分特征/算子

