KronosTokenizer训练教程:从自定义金融数据训练专属分词器
引言:为什么需要专属金融分词器
在金融市场分析中,KronosTokenizer扮演着至关重要的角色。它能将复杂的金融时间序列数据转化为模型可理解的语言,就像翻译官一样架起数据与模型之间的桥梁。普通的分词器无法理解金融数据中的特殊模式,比如K线形态、成交量变化等,而专属的金融分词器却能精准捕捉这些关键信息。
通过本教程,你将学会如何利用Kronos项目提供的工具,基于自己的金融数据训练出专属的分词器。完成后,你将能够:
- 处理自定义的金融K线数据
- 配置并运行分词器训练
- 评估训练效果并保存最佳模型
- 将训练好的分词器应用于实际预测任务
准备工作:环境与数据
项目结构概览
Kronos项目中与分词器训练相关的主要文件和目录如下:
- 训练脚本:finetune/train_tokenizer.py 和 finetune_csv/finetune_tokenizer.py
- 配置文件:finetune/config.py 和 finetune_csv/configs/config_ali09988_candle-5min.yaml
- 数据目录:finetune_csv/data/
- 模型定义:model/kronos.py
数据准备
Kronos支持多种金融数据格式,本教程以CSV格式的K线数据为例。项目中提供了示例数据:
- finetune_csv/data/HK_ali_09988_kline_5min_all.csv:阿里巴巴(09988.HK)的5分钟K线数据
如果你要使用自己的数据,需要确保CSV文件包含以下列:时间戳、开盘价、最高价、最低价、收盘价、成交量和成交额(分别对应"open"、"high"、"low"、"close"、"vol"、"amt"字段)。
环境配置
确保你已经安装了项目所需的依赖,可以通过以下命令安装:
pip install -r requirements.txt
配置训练参数
配置文件详解
Kronos提供了两种配置方式:Python代码配置和YAML文件配置。
Python配置方式
finetune/config.py 文件中定义了训练相关的各种参数。关键参数包括:
# 数据相关参数
self.lookback_window = 90 # 输入的历史时间步数
self.predict_window = 10 # 预测的未来时间步数
self.feature_list = ['open', 'high', 'low', 'close', 'vol', 'amt'] # 使用的特征列表
# 训练相关参数
self.epochs = 30 # 训练轮数
self.batch_size = 50 # 每个GPU的批次大小
self.tokenizer_learning_rate = 2e-4 # 分词器学习率
# 路径配置
self.dataset_path = "./data/processed_datasets" # 处理后的数据保存路径
self.save_path = "./outputs/models" # 模型保存路径
self.pretrained_tokenizer_path = "path/to/your/Kronos-Tokenizer-base" # 预训练模型路径
YAML配置方式
finetune_csv/configs/config_ali09988_candle-5min.yaml 提供了YAML格式的配置示例:
data_path: ./data/HK_ali_09988_kline_5min_all.csv
lookback_window: 90
predict_window: 10
tokenizer_epochs: 30
batch_size: 32
tokenizer_learning_rate: 0.0002
关键参数说明
以下是训练分词器时需要重点关注的参数:
| 参数名称 | 说明 | 推荐值 |
|---|---|---|
| lookback_window | 输入序列长度,即模型查看的历史时间步数 | 60-120 |
| predict_window | 预测序列长度,即模型要预测的未来时间步数 | 5-20 |
| batch_size | 批次大小,根据GPU内存调整 | 16-128 |
| tokenizer_learning_rate | 学习率 | 1e-4 - 5e-4 |
| epochs | 训练轮数 | 20-50 |
| accumulation_steps | 梯度累积步数,用于模拟大批次训练 | 1-8 |
开始训练分词器
训练脚本选择
Kronos提供了两个主要的分词器训练脚本,适用于不同场景:
- finetune/train_tokenizer.py:基于Qlib数据格式的训练脚本
- finetune_csv/finetune_tokenizer.py:基于CSV文件的训练脚本
本教程以CSV文件训练脚本为例,因为它更适合处理自定义数据。
执行训练命令
使用以下命令启动分词器训练:
cd finetune_csv
python finetune_tokenizer.py --config configs/config_ali09988_candle-5min.yaml
训练过程解析
训练过程主要包含以下步骤,这些步骤在finetune_csv/finetune_tokenizer.py中实现:
-
数据加载与预处理:
train_dataset = CustomKlineDataset( data_path=config.data_path, data_type="train", lookback_window=config.lookback_window, predict_window=config.predict_window, clip=config.clip ) -
模型初始化:
tokenizer = KronosTokenizer.from_pretrained(config.pretrained_tokenizer_path) -
优化器与调度器设置:
optimizer = torch.optim.AdamW( model.parameters(), lr=config.tokenizer_learning_rate, weight_decay=config.adam_weight_decay ) scheduler = torch.optim.lr_scheduler.OneCycleLR( optimizer, max_lr=config.tokenizer_learning_rate, steps_per_epoch=len(train_loader), epochs=config.tokenizer_epochs ) -
训练循环:
for epoch in range(config.tokenizer_epochs): model.train() for batch_idx, (ori_batch_x, _) in enumerate(train_loader): # 前向传播 zs, bsq_loss, _, _ = model(batch_x) z_pre, z = zs # 计算损失 recon_loss_pre = F.mse_loss(z_pre, batch_x) recon_loss_all = F.mse_loss(z, batch_x) recon_loss = recon_loss_pre + recon_loss_all loss = (recon_loss + bsq_loss) / 2 # 反向传播与优化 loss.backward() optimizer.step() scheduler.step() optimizer.zero_grad() -
验证与模型保存:
if avg_val_loss < best_val_loss: best_val_loss = avg_val_loss model_save_path = os.path.join(save_dir, "best_model") model.save_pretrained(model_save_path)
训练过程中的日志
训练过程中,系统会输出类似以下的日志信息:
[Epoch 5/30, Step 100/500] LR: 0.000180, Loss: 0.0235
- VQ Loss: 0.0120
- Recon Loss Pre: 0.0156
- Recon Loss All: 0.0204
--- Epoch 5/30 Summary ---
Validation Loss: 0.0228
Epoch Time: 0:05:32
Total Training Time: 0:28:45
这些日志反映了当前的训练进度、损失值等关键信息,帮助你判断训练效果。
评估训练结果
理解损失值
训练分词器时主要关注以下几种损失:
- 总损失(Loss):重构损失和量化损失的加权平均
- 重构损失(Recon Loss):衡量模型重构输入数据的能力
- 量化损失(VQ Loss):衡量向量量化过程中的损失
一个训练良好的分词器应该同时具有较低的重构损失和量化损失。如果重构损失高,说明模型没有很好地学习数据特征;如果量化损失高,说明模型在将连续数据转换为离散token时损失较大。
可视化评估
训练完成后,你可以在finetune_csv/examples/目录下找到一些可视化结果,例如:
这些图表展示了模型对K线数据的重构效果,可以直观地评估分词器的质量。
保存与加载模型
保存最佳模型
训练过程中,程序会自动保存验证集上表现最好的模型到指定目录:
model_save_path = os.path.join(save_dir, "best_model")
(model.module if use_ddp else model).save_pretrained(model_save_path)
默认情况下,模型保存在./outputs/models/目录下的对应子目录中。
加载训练好的分词器
训练完成后,可以使用以下代码加载保存的分词器:
from model.kronos import KronosTokenizer
tokenizer = KronosTokenizer.from_pretrained("./outputs/models/finetune_tokenizer_demo/checkpoints/best_model")
实际应用:使用自定义分词器进行预测
训练好分词器后,可以将其用于金融预测任务。以下是使用示例,完整代码可参考examples/prediction_example.py:
from model.kronos import KronosTokenizer, KronosPredictor
# 加载分词器和预测器
tokenizer = KronosTokenizer.from_pretrained("./path/to/your/tokenizer")
predictor = KronosPredictor.from_pretrained("./path/to/your/predictor")
# 准备输入数据
input_data = load_your_financial_data() # 加载你的金融数据
# 数据编码
tokens = tokenizer.encode(input_data)
# 预测
predictions = predictor.predict(tokens)
# 结果解码
decoded_predictions = tokenizer.decode(predictions)
# 输出预测结果
print(decoded_predictions)
常见问题与解决方案
训练过程中GPU内存不足
如果遇到GPU内存不足的问题,可以尝试以下解决方案:
- 减小
batch_size参数 - 增加
accumulation_steps参数 - 减小
lookback_window参数 - 使用梯度检查点(需要修改代码)
模型不收敛或过拟合
- 不收敛:尝试调整学习率,检查数据格式和预处理步骤
- 过拟合:增加数据量,添加正则化,减小模型复杂度,早停训练
如何提高分词器质量
- 使用更多样化的训练数据
- 尝试不同的
lookback_window参数 - 调整训练轮数,使用早停策略
- 尝试不同的特征组合
总结与后续步骤
通过本教程,你已经学会了如何使用Kronos训练专属的金融分词器。关键步骤包括:
- 准备和预处理金融数据
- 配置训练参数
- 运行训练脚本
- 评估训练结果
- 保存和加载模型
- 将分词器应用于预测任务
接下来,你可以尝试:
- 使用不同类型的金融数据(如不同市场、不同频率)训练分词器
- 调整模型超参数以获得更好的性能
- 将训练好的分词器与预测器结合,构建完整的预测系统
- 探索项目中的Web界面webui/,实现更便捷的交互
希望本教程能帮助你更好地利用Kronos项目处理金融数据,为你的量化分析工作提供有力支持!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




