K线不会说话,Kronos却听懂了:一次金融预测实战笔记
【免费下载链接】KronosKronos: A Foundation Model for the Language of Financial Markets项目地址: https://gitcode.com/GitHub_Trending/kronos14/Kronos
上周三晚上十一点,我盯着屏幕上那只股票连续第43根阴线,突然意识到一件尴尬的事:看了三个月K线,我只学会了"哇,又跌了"。那些跳动的红绿柱子明明承载着海量信息——开高低收、成交量、资金流向,但我只能靠眼睛目测。朋友甩给我一句话:"你去试试Kronos吧,它就是专门为读懂K线而生的。"这是我第一次听说Kronos,一个把K线数据翻译成预测结果的开源金融基础模型。读完这篇,你会和我一样,用一个晚上跑通自己的第一次K线预测,并知道模型微调和回测验证这条路该怎么走。
为什么通用时间序列模型,总是搞不定K线
如果你尝试过用 LSTM、Transformer 预测股价,大概会经历同样的挫败:训练时loss降得很漂亮,一上真实行情就"预测均线"。这不是你菜,而是通用模型天生不适合这个任务。
金融K线数据有三个让通用模型头疼的特性:
- 噪声极大:价格在分钟级几乎随机游走,真实信号淹没在波动里;
- 多维耦合:open、high、low、close、volume 五个维度互相牵制,最高价永远大于等于收盘价,这种硬约束普通模型学不会;
- 分布漂移:牛市和熊市的"语言习惯"完全不同,模型容易过拟合到某一段历史。
通用时间序列模型(TSFM)在天气、能源负荷上表现不错,但面对K线这种高噪声、强约束、分布漂移的数据就力不从心。Kronos 的解法很直接:既然通用模型读不懂金融市场的"语言",那就专门训练一个懂行的。
Kronos 把K线拆成了"金融单词"
Kronos 的核心设计是两阶段架构,官方把它称为"金融市场的语言"(The Language of Financial Markets)。第一阶段,一个专用的令牌化器(Tokenizer)把连续的 OHLCV 数据压缩成层次化离散令牌;第二阶段,一个大型自回归 Transformer 在这套"金融词汇"上做预训练,学会预测下一根K线。
上面这张架构图说明了整套预测流程:原始K线先经过量化编码变成离散令牌序列,再喂给 Transformer 自回归地生成未来令牌,最后解码回价格。它采用的 BSQuantizer 做了分层量化(前段令牌 s1 负责粗粒度走势、后段令牌 s2 补充细节),这让模型既能抓住大趋势,又不丢细节。更关键的是,这套模型在超过45个全球交易所的数据上完成了预训练,也就是说它见过美股、A股、港股、加密货币等各种"方言"。
项目提供了四个规格的模型,从轻到重分别是 Kronos-mini(4.1M参数)、Kronos-small(24.7M参数)、Kronos-base(102.3M参数)和 Kronos-large(499.2M参数)。新手推荐从 Kronos-small 入手:预测质量够用,单张消费级显卡甚至纯 CPU 都能跑。
十五分钟跑通第一次K线预测
上手过程比我想象的干净得多。克隆仓库、装依赖,然后直接用KronosPredictor这个封装类,它把数据预处理、归一化、预测、反归一化全部包好了:
git clone https://gitcode.com/GitHub_Trending/kronos14/Kronos cd Kronos pip install -r requirements.txtfrom model import Kronos, KronosTokenizer, KronosPredictor # 加载预训练模型,首次运行会自动从 Hugging Face 下载权重 tokenizer = KronosTokenizer.from_pretrained("NeoQuasar/Kronos-Tokenizer-base") model = Kronos.from_pretrained("NeoQuasar/Kronos-small") # 封装预测器,max_context 对应模型最大上下文长度 predictor = KronosPredictor(model, tokenizer, max_context=512)准备输入数据时,你需要一个 pandas DataFrame,必须包含open / high / low / close四列,volume和amount可选(没有会自动补零)。我拿了一只A股股票的5分钟线,用前400根K线做回顾窗口,预测后面120根:
import pandas as pd df = pd.read_csv("your_kline.csv") df['timestamps'] = pd.to_datetime(df['timestamps']) lookback, pred_len = 400, 120 x_df = df.loc[:lookback-1, ['open','high','low','close','volume','amount']] x_ts = df.loc[:lookback-1, 'timestamps'] # 历史时间戳 y_ts = df.loc[lookback:lookback+pred_len-1, 'timestamps'] # 未来时间戳 pred_df = predictor.predict( df=x_df, x_timestamp=x_ts, y_timestamp=y_ts, pred_len=pred_len, T=1.0, top_p=0.9, sample_count=1 ) print(pred_df.head()) # 输出预测的 open/high/low/close/volume/amount输出是一个 DataFrame,索引就是你传入的 y_timestamp。把这套代码跑通,全程大概就是十几分钟的事。
上面是项目仓库里的一个预测示例图,蓝色是真实行情、红色是模型预测。一眼扫过去,预测线不是简单地把历史曲线平移,而是跟着真实走势的转折在走——这正是自回归生成式模型和"外推法"的本质区别。
真正决定预测质量的是这三个参数
跑通只是开始,想让预测质量上台阶,关键在三个参数,这也是我踩坑最多的地方:
| 参数 | 作用 | 我的经验 |
|---|---|---|
T(温度) | 控制预测的随机性 | 1.0 起步,1.2~1.5 之间往往更准 |
top_p(核采样) | 控制候选令牌的多样性 | 0.9~1.0 能让模型考虑更多可能路径 |
sample_count | 生成几条预测路径再取平均 | 2~3 条,方差明显下降 |
另外有个容易忽略的坑:Kronos-small 和 Kronos-base 的 max_context 是 512,也就是说回顾窗口不要超过512根K线,否则预测器会自动截断,而截断意味着模型看不到足够长的历史。想要更长的上下文,可以换用 context 为 2048 的 Kronos-mini。这就是为什么 WebUI 里的时间窗口默认是"400+120",正好卡在 512 以内。
进阶一点:这几个参数本质上是在控制"采样策略"。Kronos 的生成过程和你用 ChatGPT 写文章一模一样——从预测的概率分布里采样令牌,T越高采样越"发散",top_p控制只看概率最高的前多少令牌。理解了这个,调参就不再是玄学。
进阶:让Kronos学会你那个市场的"方言"
预训练模型已经很强,但每个市场都有自己的脾气。港股、期货、加密货币的K线节奏和A股完全不同。Kronos 在finetune_csv/目录下提供了一套完整微调流程,支持直接吃自定义 CSV 数据,格式只要包含timestamps / open / high / low / close / volume / amount即可。
仓库里自带一个港股阿里巴巴(09988)5分钟K线的微调示例,配置写在configs/config_ali09988_candle-5min.yaml,改好数据路径后一行命令开训:
python train_sequential.py --config configs/config_ali09988_candle-5min.yaml脚本会按顺序自动完成两阶段训练:先微调令牌化器(让它适应你的数据分布),再微调预测模型。如果机器有多张GPU,还能用torchrun --standalone --nproc_per_node=8做分布式加速。
上面是微调后的预测结果示例,模型在高频的5分钟K线上依然能贴合真实走势。注意看:微调阶段不需要从零训练,而是基于预训练权重继续学习,所以数据量要求并不苛刻——日线级别有个一两年历史就足够跑出不错的效果。
实战收尾:预测好不好,回测说了算
预测图再漂亮,也不能替代回测。Kronos 仓库里同时提供了完整的回测管线:finetune/qlib_test.py会用微调后的模型在测试集上生成预测信号,跑一个 top-K 策略,输出累计收益曲线。
上面这张回测图展示的是策略资金曲线(绿色)与基准的对比。看这类图时,别只盯收益,更要看三件事:最大回撤(净值从峰值回落多少)、超额收益(相对买入持有策略多赚多少)、夏普比率(每单位风险的回报)。一个预测模型方向对了60%,配上糟糕的资金管理照样亏钱——模型只负责信号,风险控制是另一门功课。
顺便说一句,仓库的examples/yuce/目录里还放了几份A股个股的综合分析报告(比如 000021 深科技),把价格预测、成交量预测、涨跌幅分析、宏观与板块评分整合在了一起,算是"从预测到决策"的完整演示,值得参考。
现在轮到你了
回到开头那个盯着43根阴线发呆的夜晚——后来我用 Kronos 跑了一遍那只股票的预测,又用历史数据做了回测,虽然它没让我一夜暴富,但至少让我第一次"看懂"了K线在说什么。对量化新手来说,这是一个极佳的开始;对经验丰富的交易员来说,它可以成为你策略流水线上的一环。
下一步,你可以这样开始:
git clone https://gitcode.com/GitHub_Trending/kronos14/Kronos克隆仓库,装好依赖;- 跑通
examples/prediction_example.py,亲眼看看预测线和真实走势; - 换上你自己的CSV数据,用
finetune_csv做一次针对性的微调; - 有任何问题,去仓库提 Issue,开源社区的维护者就在那里。
风险提示:金融市场存在固有风险,Kronos 的预测结果仅供研究参考,不构成任何投资建议。任何策略在实盘前,请务必经过充分的回测与风险评估,并警惕过拟合与数据偏差。
【免费下载链接】KronosKronos: A Foundation Model for the Language of Financial Markets项目地址: https://gitcode.com/GitHub_Trending/kronos14/Kronos
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考