资讯动态

Kronos与FaceCat-Kronos:时间序列基础模型在金融量化预测中的应用实践

发布时间:2026/10/27 6:24:21 来源:尧图企业网站定制
简介FaceCat-Kronos是一套结合清华大学Kronos框架与深度学习技术的金融量化预测工具包面向做市商与短线交易者用于通过历史行情预训练捕捉价格形态规律优化交易策略。包内共50个文件压缩包约19.71MB包含23个Python脚本预测示例、训练器与数据预处理代码、模型权重目录、dll动态库、K线图/回测界面等10张png截图、json配置、csv历史数据如XSHG_5min_600977.csv、README与license说明目录按模型、示例、微调、工具等模块组织便于对照学习和二次开发。已有519人学习下载。通过源码可了解Kronos模型在时序预测中的具体实现掌握从数据预训练到预测推理的完整流程并借助自带界面文件快速搭建可视化回测环境是一份适合具备一定Python与机器学习基础者深入研究的实战参考。1. 为什么金融量化预测需要Kronos这种人工智能基础模型手工特征加LightGBM的量化策略最近两年越来越像玄学特征调了十几版回测曲线漂亮实盘一上就不对味。Kronos是清华大学开源的时间序列预测基础模型FaceCat-Kronos则是把Kronos接进金融数据流的一套工具。它做的事情很直接吃进历史行情和因子用预训练模型预测未来价格再转成可回测的交易信号。很多人说人工智能正从尝鲜工具变成日常帮手在量化这个最吃数据的领域这句话落地得最快。这套方案的重点不是预测百分百准而是把“大模型做时序预测”这件事变成可复现、可回测、可上线的工程流程。适合那些已经不想从头训Transformer又需要快速验证AI预测能不能用在策略里的投研开发者和量化研究人员。2. 先看懂Kronos这个框架凭什么敢做金融预测2.1 Kronos的预训练思路把K线当成时间序列patchKronos是清华大学开源的时间序列基础模型家族。它的核心思路和NLP里的预训练模型如出一辙先在大量非金融的时间序列上做自监督预训练再把学到的序列规律迁移到目标领域。这里有一个重要认知金融K线本质上是“带噪声的时间序列”它不特殊。趋势、周期、突变、水平回归这些结构在电力负荷、交通流量、气象数据里也反复出现。Kronos之所以能用于金融预测不是因为它见过多少张K线图而是因为它见过足够多不同形态的序列能对“下一步可能怎么走”给出一个合理的先验分布。具体到结构常见实现会把连续序列切成长度相同的patch。每一个patch相当于一个token再叠加时间戳和频率编码扔进Transformer编码器。这样有两个好处一是patch结构让模型更关注局部形态而不是单点噪声二是把长度不定的历史序列统一成固定token序列方便预训练和迁移。默认配置里常见patch_size32、输入长度512、预测长度96。这张默认表不是随便定的。patch太大K线里的关键转折点会被抹平patch太小模型容易过拟合噪声。对小时级和日级数据32步patch是比较平衡的选择。这里有一个常见误解以为Kronos输出的是未来价格曲线所以直接用预测价格做信号就行。但实际输出通常是未来多个patch的分布参数而不是一条确定的线。FaceCat-Kronos在包装模型时会把预测转成未来收益的采样路径再给出不同分位数。分位数比均值重要得多。量化策略不怕预测错怕的是模型不知道自己会错。Kronos能输出预测区间意味着你可以拿这个区间控制仓位而不是下注在单一点上。2.2 FaceCat-Kronos的模块划分数据、模型、信号三层FaceCat-Kronos不是为了跑模型而做的demo它是一个准备落地的量化预测工具。从常见封装习惯来看整个工具大概可以拆成三层。第一层是数据层负责把CSV里的OHLCV或者外部因子数据统一成固定频率的序列处理缺失值、时区、停牌。第二层是模型层加载Kronos权重对输入序列做预测并输出预测分布。第三层是信号层把预测分布转成策略信号比如阈值、买卖方向、仓位再送进回测引擎。这三层分开的好处是你可以只替换其中一层验证自己的假设。比如我怀疑Kronos对特定频率不敏感就在数据层换一个重采样频率模型层不动或者我想验证预测分布是否有用就保留模型层预测在信号层改分位数阈值。很多人在迁移量化策略时喜欢把数据和模型耦合在一起最后连特征是哪个时间点生成的都说不清楚。FaceCat-Kronos把数据流和模型流分开其实就是逼用户把回测里最关键的时间对齐问题提前暴露出来。还有个容易忽略的细节数据层的对齐是否严格按“先有数据后有预测”来切分。Kronos模型本身是不管这个的它只看你给的序列。如果你不小心把当日全天数据都喂进去模型就会用当日收盘信息去预测当日开盘回测结果当然好实盘根本复现不了。这也是为什么FaceCat-Kronos的数据层里会要求升序时间戳、固定频率、以及一个显式的“预测起点”参数。用的时候要认真看这个参数而不是直接传整份DataFrame进去。2.3 为什么不用自己训LSTM/Transformer数据量是最大的墙很多人一看到Kronos就想到“我也可以自己训一个Transformer来做预测”。还真不行。问题不在模型能力在数据量。以日线数据为例一支股票上市至今也就五六千根K线。LSTM或Transformer要学出趋势和周期的组合规律至少需要几十万到上百万个样本。用几千根数据去训练一个深度模型最常见的结果是训练集loss很低验证集一塌糊涂。这不是超参数问题是样本量撑不住模型复杂度。自监督预训练缓解的正是这个问题。Kronos在源领域见过大量序列形态学习到的是通用的时序变换规律。拿到金融数据时它不需要从零学“什么是趋势”只需要在已有的先验上稍微适配金融序列的噪声分布。这就把有效样本量需求降下来了一个数量级。当然这不代表Kronos对每个品种都管用。更理性的做法是先零样本跑一轮看预测和真实值的相关性和分位数的校准情况。如果零样本表现已经可用再考虑微调如果零样本一塌糊涂微调大概率也救不回来因为基础模型的先验方向可能和这个标的运动规律不对付。还有一个工程原因自训模型从头到尾都需要自己处理归一化、滑窗、验证集切分、未来函数。这些细节一旦出错模型再强也是白搭。用FaceCat-Kronos这类封装好的工具虽然不能保证赚钱但至少把“预测是否用了未来数据”这个基本问题隔离掉了。我可以把精力放在策略信号和仓位管理上而不是反复质疑回测结果的真实性。3. 本地跑通FaceCat-Kronos环境、数据和最小预测脚本3.1 安装与权重准备先解决环境。FaceCat-Kronos依赖PyTorch和配套的数据处理库Python版本建议3.10以上。我一般习惯先建独立conda环境避免把系统Python搞乱。安装路径以项目开源仓库的README为准常见做法是clone后直接pip install -e。git clone FaceCat-Kronos仓库地址 cd FaceCat-Kronos conda create -n facecat python3.10 -y conda activate facecat pip install -e .安装完成后不要急着跑先确认权重能不能自动下载。Kronos模型权重一般托管在模型仓库里第一次加载时会自动下载到本地缓存目录。如果你所在的网络访问不了默认下载地址可以手动把权重文件放到~/.cache/kronos下具体目录结构看项目文档。检查是否装好的命令是python -c from facecat_kronos import KronosPipeline; print(KronosPipeline)没有报错就说明核心库和依赖都齐了。这里要提醒一句不要跳过pip install -e里的-e。它会把项目以开发模式安装后续更新代码不用重新安装。这个工具更新比较勤直接用pip install .的话每次升级都要重装很容易出现版本对不上的问题。3.2 行情CSV转成Kronos数据集金融预测项目里数据清洗比模型训练更花时间。FaceCat-Kronos的数据层需要标准OHLCV格式至少包含时间戳、open、high、low、close、volume六列。我一般先用pandas做排序和缺失检查再交给数据加载器转换。import pandas as pd from facecat_kronos import KronosDataset df pd.read_csv(btc_1h.csv, parse_dates[datetime]) df df.sort_values(datetime) # 必须升序否则预测序列是反的 ds KronosDataset.from_ohlcv( dfdf, timestamp_coldatetime, price_cols[open, high, low, close], volume_colvolume, freq1h, ) print(ds.len)这里几个参数值得展开。timestamp_col必须是datetime类型不要用字符串否则时间排序会按字母排。price_cols一般把OHLC都传进去因为Kronos在预训练时见过多变量序列只传close会丢掉高低开信息。freq很关键它告诉模型数据是小时级还是日级频率错了模型内部的时间编码就错位预测结果会非常奇怪。如果原始CSV里有缺失时间戳比如某些小时没有交易不要直接drop。金融数据里的缺失往往代表流动性差直接删掉会让模型以为时间连续从而低估波动。FaceCat-Kronos的处理方式是把缺失时间戳补成NaN由模型内部决定是否忽略。你只需要保证排序正确重复时间戳不能出现。3.3 最小预测脚本与输出解读数据集准备好之后最小预测脚本很短。下面这段是我在本地验证模型是否正常时用的模板也是后续接策略的基础。from facecat_kronos import KronosPipeline pipe KronosPipeline( model_namekronos-base, devicecuda, # CPU环境改成 cpu ) forecast pipe.predict( dsds, input_length512, horizon96, num_samples20, ) print(forecast.mean_close) print(forecast.quantile(0.05)) print(forecast.quantile(0.95))这里的input_length是喂给模型的K线根数horizon是预测未来多少根K线。默认512和96的意思是用过去512根小时K线预测未来96小时。num_samples20表示从预测分布里采样20条路径用这些路径算均值和中位数。第一次运行会下载权重几GB不等耐心等。跑完后输出的mean_close是一条未来96小时的预测价格曲线quantile(0.05)和quantile(0.95)是90%预测区间的下界和上界。我拿到输出后的第一件事不是看涨还是跌而是看区间宽度如果预测区间宽到覆盖了涨跌两个方向那这个预测对单边策略没有意义只能做波动率或做市策略。如果你想把预测结果可视化直接对forecast.mean_close调用pandas内置的plot即可。注意预测索引是从最后一个真实K线之后开始的不是从第一个真实K线开始很多人第一次画图会把两条线错位看图误以为模型滞后其实是索引没对齐。4. 把预测变成策略窗口参数、微调与回测设置4.1 输入长度和预测步数怎么配对Kronos的预测表现很吃输入长度和预测步数的匹配。我见过不少踩坑案例直接把horizon设成几十甚至几百然后发现预测均值几乎是一条水平线。这不是模型坏了而是预测步数拉长后不确定性累积模型回归到历史均值是完全合理的。经验法则是预测步数不要超过输入长度的三分之一。比如输入512根K线预测96步即未来不到输入长度的20%效果相对稳定。如果你做日线级别目标是预测未来5天那就用过去30到60天作为输入。输入太短模型看不到趋势输入太长会把早已失效的旧行情当成当前状态。频率和高度的组合也要调。对于小时级数据我一般用输入512到1024预测24到96。对于分钟级数据输入长度可以放宽到2048但要小心高频噪声。Kronos在分钟级上的零样本表现通常不如小时级和日级因为高频数据的微观结构和预训练数据差异更大。如果策略本身就是日内高频建议先用日线数据验证模型有没有预测能力再决定值不值得上分钟级。这里还涉及一个信号周期问题。预测步数应该对应持仓周期你做3天持仓就预测3天做1小时持仓就预测1小时。不要把预测周期和交易周期错开。预测周期比持仓周期长信号更新太慢预测周期比持仓周期短噪音又会掩盖真正的中期趋势。我在配置时会把持仓周期先定下来然后反推horizon而不是先跑模型再想怎么用。4.2 冻结backbone微调和全量微调怎么选Kronos零样本输出适合做初筛但如果你想对一个特定品种持续预测微调一般会带来稳定提升。FaceCat-Kronos的微调接口预留了两种模式冻结backbone只训练输出头或者全参数微调。两者适用场景完全不同。冻结backbone微调的数据需求量小训练快也不容易忘记预训练学到的通用规律。我认为大多数个人和中小团队应该先用这种模式。尤其当你只有几千根K线时全参数微调很容易直接把预训练权重冲坏。全参数微调不是不能用但前提是数据量足够大并且验证集切分严格按时间顺序。下面是一段典型微调代码from facecat_kronos import KronosForecaster model KronosForecaster.from_pretrained(kronos-base) trainer model.finetune( train_loadertrain_loader, val_loaderval_loader, freeze_backboneTrue, lr1e-4, epochs5, gradient_clip1.0, )freeze_backboneTrue是关键参数。它把Kronos主体网络的权重冻结只更新最后输出层。lr一般从1e-4起步epochs在3到5之间。金融时序信噪比低训练太久必然过拟合。gradient_clip1.0是防止个别异常样本把梯度拉爆这个参数在金融数据上基本必须开。微调后不要看训练集loss要看验证集的预测方向准确率或IC。验证集必须严格在时间上晚于训练集。比如2019到2022年训练2023到2024年验证。不能随机打乱切分否则模型会“记住”每个时点的噪声验证结果虚高。另外微调前后最好保留同一个验证集用零样本预测作为baseline微调后如果IC没有提升超过20%说明这个标的和预训练规律差异不大微调的收益有限。4.3 回测参数阈值、止损、滑点预测做完只是第一步能不能变成策略要看信号生成和回测参数。我常用的是预测收益率阈值触发只有当预测未来N期收益的置信区间下界大于0时才做多上界小于0时才做空。拿90%置信区间举例预测收益的5%分位数大于0意味着模型有95%把握未来N期收益为正。阈值越严格交易次数越少胜率越高但可能错过机会。回测时需要把阈值和换手成本放在一起看。我习惯用这张参数表做初始配置再根据标的波动调整参数初始值调整方向input_length512波动大加长趋势市缩短horizon96等于持仓周期num_samples20信号稳定后可以降到5开仓阈值置信区间下界 0交易过频就提高置信度止损预测区间宽度的1.5倍始终大于单次滑点回测滑点万五到千一流动性差要上调止损用预测区间宽度而不是固定百分比是我自己的习惯。Kronos预测区间宽说明当前不确定性高止损放太近会被噪声扫掉预测区间窄说明行情清晰止损放太远又没意义。用区间宽度的1.5倍相当于给策略设了一个自适应止损。回测里最容易让人产生幻觉的是滑点参数。做分钟级回测我用万五起步做日线用千一也不夸张。如果回测模型里没有显式滑点参数至少要按成交价的0.1%做成本扣减。很多策略在没有任何交易成本时年化50%扣完滑点手续费直接变负这不是模型失效是成本没算够。5. FaceCat-Kronos避坑指南数据泄露、过拟合与失效场景5.1 回测很漂亮实盘却亏损现象回测年化50%胜率65%实盘连续三周亏损回撤曲线和回测完全对不上。原因通常出在两个地方。一是数据泄露比如用全样本均值做归一化或者把未来一段时间的统计量混进了历史输入二是成交时点过于理想回测假设信号出现后立刻按当前价成交实盘却要等下一根K线价差和延迟全被吃掉。解决方法是做两步检查。第一步把归一化切到窗口滚动模式只用t时刻之前的数据算均值方差第二步把回测成交价改到信号生成后的下一根K线开盘价滑点设到万五以上。这样改完再看回测一般会砍掉一半以上收益剩下的是相对可信的部分。FaceCat-Kronos的数据层本身就支持预测起点参数回测时务必让预测起点晚于最后一个输入K线。5.2 预测曲线比真实行情滞后半拍现象把Kronos预测均值和真实收盘价叠在一起发现预测曲线看起来总是慢半拍涨跌方向都对但转折点晚一两个周期。原因很常见模型预测的是未来多个patch的平均路径本身就带有平滑效应如果是多步预测均值会向历史水平收缩看起来就像滞后。另一个原因是你拿预测的“最后一个点”去和“当前真实值”比较但预测点是在历史序列基础上外推的比较基准根本不对。解决方式不看价格看预测收益率。用未来N期收益率预测比用价格预测更不容易产生“滞后感”。如果仍然滞后检查输入序列是否用了未复权价格分红除权会造成假跳变模型会把这些跳变当成真实行情预测自然对不上。换用前复权价格基本能解决。5.3 微调后验证集反而变差现象训练集loss不断下降验证集IC却比零样本还低而且每多训练一个epoch就再降一点。原因几乎总是过拟合。金融数据是强噪声低信噪比模型训练到一定程度就开始记忆噪声。另外验证集在时间上在后市场状态可能已经切换模型在训练集上习得的规律不适用于新的环境。解决方式优先用冻结backbone的轻量微调限制输出头的学习率把epochs从5降到2到3观察验证集IC随epoch变化选验证集最优的checkpoint而不是训练集收敛的checkpoint。如果验证集还是比零样本差就接受零样本结果不要强行微调。5.4 CPU推理太慢GPU显存不够现象用CPU跑512输入、96预测、20次采样单次推理要几十秒分钟级策略根本跑不动侥幸上了GPUbatch一加大直接Out of Memory。原因Kronos的Transformer结构在长序列和多采样次数下计算量线性放大采样20次等于一次推理20倍成本。解决方式先做信号粗筛把num_samples降到1只保留预测方向对通过粗筛的时间点再用20次采样做精细仓位。推理时用半精度很多深度学习框架里只需在模型层加半精度转换显存占用几乎减半。如果显存还是不够把input_length从512降到256代价是预测精度轻微下降但能换来稳定运行。上了GPU还慢要先检查batch size是否过小GPU利用率太低增大batch往往比调模型更有效。5.5 加了因子却没有提升IC现象原本只用OHLCVIC在0.04到0.06之间加了换手率、资金流、情绪因子后IC反而降到0.03或者完全没有变化。原因FaceCat-Kronos默认的数据接口以OHLCV为骨架额外因子如果不在模型预训练格式里可能被当作独立序列拼接但模型没有针对这些因子的时间编码做适配结果等于给输入增加噪声。还有一个原因是因子本身已经包含在OHLCV的衍生信息里比如某些流动性因子和成交量高度相关模型已经有了这个信息再加是冗余。解决方式把新增因子当成条件特征在数据层和价格序列分别编码再拼接进输入特征。每个因子单独做IC检验只保留零样本下IC绝对值大于0.02且与价格因子相关性低于0.7的因子。不要迷信因子越多越好时序基础模型不是机器学习竞赛里的堆特征游戏它的先验来自序列形态因子必须转换为模型能理解的“序列信息”才有用。6. 先做预测能力体检再谈盈利IC验证与滚动更新技巧最后这条建议值一次血泪经验不要先写策略先给模型做体检。把Kronos的预测当成一个黑匣子你需要先确认它有没有预测能力再决定值不值得为它投入。所谓预测能力我现在只看两个指标IC和ICIR。IC是预测收益率和未来真实收益率的Spearman相关系数ICIR是IC的均值除以标准差。一个稳健的时序模型ICIR至少在0.3以上才值得继续做低于0.1基本就是噪声。我自己的常规流程是取一只流动性好的标的三年日线数据用滚动窗口做预测每120天滚动一次预测未来3到5天收益算整个区间IC均值。下面这段代码是一个可行的验证脚本from facecat_kronos import evaluate_ic result evaluate_ic( pipepipe, dfdf, window_days120, horizon3, metricspearman, ) print(result.ic_mean) print(result.icir)window_days120表示每隔120天重新训练或重新做窗口对齐horizon3表示预测未来3天收益。如果IC均值大于0.05ICIR大于0.3模型在这个标的上具备基础预测能力。这时再做策略不迟。如果IC均值在0附近直接放弃这个标的或换预测频率比调一万个参数都有效。体检通过之后还有一个滚动更新习惯要养成。Kronos虽然预训练强大但金融数据的状态会漂移。我一般每周五收盘后用最新数据重跑一遍预测每个月做一次轻度微调每次微调保留验证集最优的权重而不是最新epoch的权重。实盘信号生成时间和策略执行时间之间必须留出足够间隔不要让预测K线没收盘就下单。这套做完你会发现自己对Kronos的预期越来越正常。我不再指望它预测每个转折点而是把它当成一个能给未来收益“排出概率分布”的助手。预测区间宽的时候我减仓预测区间窄且有方向的时候我加仓模型也会犯错所以我永远保留止损。希望这些参数和踩坑记录能帮你少走一段弯路祝顺利跑通第一张K线预测。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑