从开源到实战:手把手教你用清华Kronos构建个性化股票预测模型
1. 环境准备与基础配置
第一次接触清华Kronos时,我和大多数量化爱好者一样,被它"用Transformer做股票预测"的创新思路吸引。但真正开始动手才发现,官方文档虽然专业,但对新手来说有些跳跃。这里我会把整个配置过程拆解成可执行的步骤,并分享几个容易踩坑的细节。
1.1 创建专属Python环境
建议使用conda而不是直接pip安装,因为金融数据处理的依赖库版本冲突太常见了。我习惯用Python 3.10版本,兼容性和稳定性都不错:
conda create -n kronos_env python=3.10 -y conda activate kronos_env安装依赖时有个小技巧:先单独安装pytorch,再装其他库。因为requirements.txt里的pytorch版本可能不匹配你的CUDA驱动。我测试过的最稳定组合是:
pip install torch==2.0.1+cu118 --extra-index-url https://download.pytorch.org/whl/cu118 pip install -r requirements.txt1.2 模型权重下载指南
官方提供了base和small两种规模的预训练模型。如果你是单卡用户(比如只有一张3090),建议先用small版本试水。下载时注意两点:
- 使用huggingface-cli下载比直接git clone更快
- 权重文件建议放在项目根目录下的models文件夹
huggingface-cli download NeoQuasar/Kronos-Tokenizer-base --local-dir models/tokenizer huggingface-cli download NeoQuasar/Kronos-small --local-dir models/predictor2. 跑通第一个预测案例
2.1 修改示例代码的关键参数
example/prediction_example.py这个文件相当于Kronos的"Hello World"。需要修改的核心参数有三处:
# 第42-43行改为你的本地路径 tokenizer = KronosTokenizer.from_pretrained("models/tokenizer") model = Kronos.from_pretrained("models/predictor") # 第49行替换成你关注的股票代码 stock_code = "sh.601318" # 中国平安 # 第52-53行调整观察窗口和预测长度 lookback = 400 # 建议首次运行不要超过500 pred_len = 60 # 预测未来60个交易日2.2 数据源的灵活替换
默认示例使用内置测试数据,如果想用自己的CSV数据,可以这样改造:
import pandas as pd df = pd.read_csv('your_data.csv', parse_dates=['date']) data = { 'date': df['date'].values, 'close': df['close'].values }运行后会生成两张图:价格走势对比和预测误差分布。我第一次运行时预测误差达到12%,后来发现是因为没有做数据标准化。解决方法是在预测前添加:
from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() data['close'] = scaler.fit_transform(data['close'].reshape(-1,1))3. 定制化数据准备实战
3.1 用Qlib构建本地数据库
虽然官方推荐Qlib,但它的国内数据更新不及时。我的解决方案是混合使用Tushare和Qlib:
# 安装Tushare Pro pip install tushare ts.set_token('你的token') # 获取日线数据 pro = ts.pro_api() df = pro.daily(ts_code='601318.SH', start_date='20200101')然后转换成Qlib格式:
from qlib.data import D df['date'] = pd.to_datetime(df['trade_date']) df = df.rename(columns={'vol':'volume'}) D.save_instruments([{'instrument':'sh601318', 'symbol':'601318'}]) D.save_features('sh601318', df.set_index('date'))3.2 数据预处理技巧
Kronos对数据质量很敏感。建议在qlib_data_preprocess.py之前先做:
- 处理异常值:用中位数替代涨跌幅超过10%的极端值
- 填充缺失值:用前复权方式处理除权除息
- 特征工程:添加5日/20日均线等技术指标
# 示例:添加MACD指标 df['ema12'] = df['close'].ewm(span=12).mean() df['ema26'] = df['close'].ewm(span=26).mean() df['macd'] = df['ema12'] - df['ema26']4. 模型微调与参数优化
4.1 Tokenizer训练实战
训练tokenizer时最容易遇到OOM(内存不足)问题。我的经验是:
- 单卡用户把batch_size降到32以下
- 开启梯度累积来模拟大batch
torchrun --standalone --nproc_per_node=1 finetune/train_tokenizer.py \ --batch_size 32 \ --gradient_accumulation_steps 44.2 Predictor调参技巧
在train_predictor.py中有几个关键参数需要关注:
- learning_rate:从3e-5开始尝试
- num_hidden_layers:小型数据集建议用4层
- warmup_steps:设为总step数的10%
# 在finetune/train_predictor.py中添加 training_args = TrainingArguments( learning_rate=3e-5, per_device_train_batch_size=8, warmup_steps=100, num_train_epochs=10 )训练过程中可以用TensorBoard监控:
tensorboard --logdir runs/5. 预测结果验证与改进
5.1 回测框架搭建
不建议直接用预测结果交易。我通常用backtrader做回测:
import backtrader as bt class KronosStrategy(bt.Strategy): def __init__(self): self.preds = [] # 加载你的预测结果 def next(self): if self.preds[0] > 0.05: # 预测涨幅超过5% self.buy() elif self.preds[0] < -0.03: # 预测跌幅超过3% self.sell()5.2 常见问题排查
如果遇到预测结果不稳定:
- 检查数据是否有未来函数
- 尝试减小lookback窗口
- 在Tokenizer输出层添加Dropout
model = Kronos.from_pretrained( "your_model", output_attentions=True, hidden_dropout_prob=0.1 )最后提醒:股票预测本质是概率游戏。在我的实测中,Kronos在趋势行情中表现较好,但在震荡市需要配合其他指标过滤信号。建议先用模拟盘验证策略,再考虑实盘应用。
