KronosTokenizer训练教程:从自定义金融数据训练专属分词器

KronosTokenizer训练教程:从自定义金融数据训练专属分词器

【免费下载链接】Kronos Kronos: A Foundation Model for the Language of Financial Markets 【免费下载链接】Kronos 项目地址: https://gitcode.com/GitHub_Trending/kronos14/Kronos

引言:为什么需要专属金融分词器

在金融市场分析中,KronosTokenizer扮演着至关重要的角色。它能将复杂的金融时间序列数据转化为模型可理解的语言,就像翻译官一样架起数据与模型之间的桥梁。普通的分词器无法理解金融数据中的特殊模式,比如K线形态、成交量变化等,而专属的金融分词器却能精准捕捉这些关键信息。

通过本教程,你将学会如何利用Kronos项目提供的工具,基于自己的金融数据训练出专属的分词器。完成后,你将能够:

  • 处理自定义的金融K线数据
  • 配置并运行分词器训练
  • 评估训练效果并保存最佳模型
  • 将训练好的分词器应用于实际预测任务

准备工作:环境与数据

项目结构概览

Kronos项目中与分词器训练相关的主要文件和目录如下:

数据准备

Kronos支持多种金融数据格式,本教程以CSV格式的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提供了两个主要的分词器训练脚本,适用于不同场景:

  1. finetune/train_tokenizer.py:基于Qlib数据格式的训练脚本
  2. 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中实现:

  1. 数据加载与预处理

    train_dataset = CustomKlineDataset(
        data_path=config.data_path,
        data_type="train",
        lookback_window=config.lookback_window,
        predict_window=config.predict_window,
        clip=config.clip
    )
    
  2. 模型初始化

    tokenizer = KronosTokenizer.from_pretrained(config.pretrained_tokenizer_path)
    
  3. 优化器与调度器设置

    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
    )
    
  4. 训练循环

    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()
    
  5. 验证与模型保存

    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

这些日志反映了当前的训练进度、损失值等关键信息,帮助你判断训练效果。

评估训练结果

理解损失值

训练分词器时主要关注以下几种损失:

  1. 总损失(Loss):重构损失和量化损失的加权平均
  2. 重构损失(Recon Loss):衡量模型重构输入数据的能力
  3. 量化损失(VQ Loss):衡量向量量化过程中的损失

一个训练良好的分词器应该同时具有较低的重构损失和量化损失。如果重构损失高,说明模型没有很好地学习数据特征;如果量化损失高,说明模型在将连续数据转换为离散token时损失较大。

可视化评估

训练完成后,你可以在finetune_csv/examples/目录下找到一些可视化结果,例如:

5分钟K线预测示例

这些图表展示了模型对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内存不足的问题,可以尝试以下解决方案:

  1. 减小batch_size参数
  2. 增加accumulation_steps参数
  3. 减小lookback_window参数
  4. 使用梯度检查点(需要修改代码)

模型不收敛或过拟合

  1. 不收敛:尝试调整学习率,检查数据格式和预处理步骤
  2. 过拟合:增加数据量,添加正则化,减小模型复杂度,早停训练

如何提高分词器质量

  1. 使用更多样化的训练数据
  2. 尝试不同的lookback_window参数
  3. 调整训练轮数,使用早停策略
  4. 尝试不同的特征组合

总结与后续步骤

通过本教程,你已经学会了如何使用Kronos训练专属的金融分词器。关键步骤包括:

  1. 准备和预处理金融数据
  2. 配置训练参数
  3. 运行训练脚本
  4. 评估训练结果
  5. 保存和加载模型
  6. 将分词器应用于预测任务

接下来,你可以尝试:

  • 使用不同类型的金融数据(如不同市场、不同频率)训练分词器
  • 调整模型超参数以获得更好的性能
  • 将训练好的分词器与预测器结合,构建完整的预测系统
  • 探索项目中的Web界面webui/,实现更便捷的交互

希望本教程能帮助你更好地利用Kronos项目处理金融数据,为你的量化分析工作提供有力支持!

【免费下载链接】Kronos Kronos: A Foundation Model for the Language of Financial Markets 【免费下载链接】Kronos 项目地址: https://gitcode.com/GitHub_Trending/kronos14/Kronos

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值