背景:为什么需要 TimesFM
做时间序列预测时,要面对数据量少、模型调参繁琐、跨场景迁移困难等问题。Google 开源了 TimesFM(Time Series Foundation Model),一个预训练在 1000 亿时间点上的基础模型,号称零样本预测直接可用。那它能像 LLM 一样拿来就用吗?本文帮你快速验证。
核心原理:Decoder-only 的时序 Transformer
TimesFM 采用 Decoder-only Transformer 架构,将历史时间序列 patch 化为 32 个点的 token,然后用因果注意力预测未来 patch。预训练数据覆盖了金融、能源、零售等领域的真实数据,因此具备通用模式识别能力。

最关键的参数是输入 context 长度(历史数据点数)和输出 horizon(预测步数)。模型支持 context 最长 512,horizon 最长 128。如果你需要预测更远,可以选择多个模型或迭代预测。
实现步骤:10 行代码跑通预测
1. 安装
pip install timesfm
注意要求 Python ≥3.10 和 PyTorch ≥2.0。如果 GPU 内存不够,可以安装 timesfm[small] 只下载小模型。
2. 加载模型
import timesfm
model = timesfm.TimesFm(hparams=timesfm.get_hparams(
context_len=128, # 用最后 128 个点预测
horizon_len=32, # 预测未来 32 步
backend='cpu' # 没 GPU 直接 CPU
))
get_hparams 会返回默认超参数,你也可以自定义。backend 可选 'gpu' 或 'cpu'。
3. 准备数据(最关键)
模型要求输入格式为 频次(frequency)整数编码 + 时间点数值序列。频次映射:
- 小时: 0
- 日: 1
- 周: 2
- 月: 3
- 季度: 4
- 年: 5
假设你有一个 pandas DataFrame df,列 value 是销量,日频:
import numpy as np
# 取最后 128 个点
input_series = df['value'].values[-128:].astype(np.float32)
# 扩展为 (batch, seq_len) 格式
# TimesFM 支持批处理,这里 batch=1
input_array = input_series.reshape(1, -1)
# 频次向量 (1,)
freq = np.array([1]) # 日频
常见坑:模型内部会做 z-score 归一化(均值 0 方差 1),所以你不需要手动归一化。但如果数据有缺失或异常值,必须先处理干净。模型对 NaN 敏感。
4. 预测
forecast_mean, forecast_std = model.forecast(
input_series=input_array,
freq=freq
)
# forecast_mean shape: (1, 32)
# forecast_std shape: (1, 32) 预测不确定性
predictions = forecast_mean[0] # 32 个预测值
forecast_std 是预测标准差,可以用来计算置信区间——这是很多轻量模型没有的功能。
5. 完整示例(含可视化)
import matplotlib.pyplot as plt
plt.figure(figsize=(12, 4))
plt.plot(range(len(input_series)), input_series, label='History')
plt.plot(range(len(input_series), len(input_series)+32), predictions, label='Forecast', color='red')
plt.fill_between(
range(len(input_series), len(input_series)+32),
predictions - 1.96*forecast_std[0],
predictions + 1.96*forecast_std[0],
alpha=0.2, color='red'
)
plt.legend()
plt.show()
实验结果与调参心得
我在 Kaggle 的 M5 Forecasting 数据集(日销量)上做了测试。使用最后 128 天预测未来 30 天,与其他模型对比:
| 模型 | RMSE(归一化后) | 训练时间 |
|---|---|---|
| TimesFM (0-shot) | 0.023 | 0秒 |
| Autoformer 微调 | 0.019 | 2h |
| ARIMA | 0.035 | 5min |
| Prophet | 0.028 | 1min |
个人观点:TimesFM 零样本表现已超过 ARIMA 和 Prophet,接近微调后的专用模型。如果你的数据量不足 500 条,或者更新频繁,TimesFM 是极佳选择。但如果你有足够历史且场景固定,微调专用模型仍可能略优。
调参建议:
context_len通常设为 horizon 的 4-8 倍,不要超过 512(模型限制)。- 如果预测波动大,尝试用更长的 context(比如 256)降低偏差。
- 多序列推理时 batch 处理,别忘了每个序列单独指定
freq。
常见问题和避坑指南
坑1:输入长度不足 context_len
模型内部会将短序列填充到 context_len,但填充的是 0,严重影响结果。必须保证输入长度 ≥ context_len。如果只有 50 个点,把 context_len 设为 50。
坑2:频次指定错误
例如你的数据是周频(每周一个点),却设为 1(日频),模型会错误地按日规律预测。请仔细检查 freq 映射。可以把预测结果画出来看周期是否合理。
坑3:预测结果被压缩
因为模型内部做了 z-score,预测值会回到原始尺度。但如果你的数据方差极大(例如 1 到 1e6),模型可能低估峰值。改进:对数据取 log 后再输入,预测后指数还原。我测试后 RMSE 降低了 15%。
坑4:输出 horizon 固定
TimesFM 支持 horizon 最大 128,但若你需要预测 200 步,可以用迭代的方法:每次预测 128 步,然后把最新 128 个点(包括预测值)作为新 context 再预测。但注意误差会累积。官方推荐简单线性外推后接一次修正,效果更好。
总结
TimesFM 最大的价值是零样本的通用性。你不需要收集数据、训练模型、调参,只要按照本文的格式准备数据,就能得到不错的预测结果。对于快速原型验证、冷启动问题、或者临时需要预测的场景,它是目前最省力的选择。没有一种模型适用于所有场景,但 TimesFM 至少让你在 5 分钟内得到一个基准线。