如果您可以用一个在本地运行、毫秒级返回结果且无需额外训练的小型 AI 模型来预测股价,会怎样?
时间序列预测通常意味着使用诸如 ARIMA 的统计方法、机器学习流水线,或在特定数据集上训练的模型。Timestral 是 Mistral AI 于 2026 年 10 月 15 日发布的一系列开放权重预测模型,采用了不同路径。它无需微调,即可根据历史数据预测未来数值。根据 Mistral 的说法,其最大模型在三个公共基准上的预训练零样本模型中排名第一。
尽管规模很小,这些模型在多个预测基准上仍能提供有竞争力的准确率,适用于从金融市场到能源消耗与零售需求等多种场景。
在本教程中,我们将了解 Timestral 是什么以及其工作原理,使用 Python 和 uv 在本地进行搭建,并在真实的苹果(AAPL)股票数据上进行测试。我们将生成滚动的一日预测,将其与实际收盘价和一个朴素基线进行比较,并将预测转化为简单的买入(Buy)、卖出(Sell)或持有(Hold)信号。您也可以查看我们关于使用 TimeGPT 进行时间序列预测 和ARIMA 时间序列预测 的教程。
什么是 Mistral Timestral?
Timestral 是 Mistral AI 推出的开放权重时间序列基础模型家族,用于快速、通用的预测。时间序列基础模型在大量多样的序列上进行一次预训练,因此可以对从未见过的数据进行预测。
与需要在特定数据集上训练的传统预测模型不同,Timestral 支持零样本预测 。它可直接根据历史数据预测未来值,无需额外训练或微调。
Timestral 是一种因果、基于补丁的 Transformer,主要在合成数据上训练,随后在真实与合成数据的混合上进行第二阶段训练。它可处理股价、能源需求、销售额和传感器测量。Mistral 在其技术报告 中介绍了架构与训练细节。
Mistral 发布了四种规模,在模型大小、速度与准确率之间做出不同权衡:
模型 参数量 权重大小(FP32) Timestral-5M 500 万 21 MB Timestral-28M 2800 万 111 MB Timestral-123M 1.23 亿 490 MB Timestral-209M 2.09 亿 837 MB
根据 Mistral 发布的基准测试,Timestral-209M 在 GIFT-Eval 、TIME 和 fev-bench 的预训练零样本模型中排名第一 。在其报告的对比中,它超越了更大的模型,如 TimesFM-3 和 Falcon-2.0。上述为 Mistral 自己的结果,并提交到了 GIFT-Eval 和 TIME 榜单,请查看榜单以获取独立确认。
速度也是一大优势。在一台标准的 8 线程服务器 CPU 上,Mistral 报告称 Timestral-209M 能在113 毫秒 内,基于三周的 15 分钟历史数据,预测一天后的数值,而 5M 模型仅需 17 毫秒。无需 GPU。
Timestral 支持以下预测功能:
长历史上下文: 最多接受 32,768 个历史时间步。
多变量预测: 可联合预测多个相关时间序列以改进结果。
概率预测: 返回 21 个分位数来估计预测不确定性,而非单一数值。
协变量: 可接收仅含过去信息和已知未来的信息变量,既可为数值型也可为分类型,这些变量可能影响预测。
本地推理: 可在 CPU 与 GPU 上运行,无需付费 API。代码以 Apache 2.0 许可证发布,权重以经修改的 MIT 许可证发布。
在本教程中,我们将使用 Timestral-209M 。根据 Mistral 发布的基准,它是该系列中规模最大、准确率最高的模型。我们将在一张 NVIDIA RTX 4070 GPU 上本地运行它来预测股价,并在真实市场数据上评估其表现。
在 Linux 上安装 Timestral
Timestral 需要 Python 3.10 或更高版本,以及 PyTorch 2.4 或更高版本。我们将使用Python 3.12、PyTorch 2.7.0 和 uv 在 Linux 机器上创建一个轻量的开发环境。Timestral 也支持 CPU 推理,因此 GPU 为可选。
首先,确认您的 NVIDIA GPU 已被检测到且驱动工作正常:
nvidia-smi技术支持
该命令会显示您的 GPU 信息、驱动版本与 CUDA 兼容性。如果输出中出现了您的 GPU,即可继续。
接下来安装 uv ,这是一个快速的 Python 包与环境管理器:
curl -LsSf https://astral.sh/uv/install.sh | sh 技术支持
安装 uv 后请重启终端 ,以便在您的 shell 中启用该命令。
现在创建一个项目目录与 Python 3.12 虚拟环境:
mkdir timestral-project
cd timestral-project
uv venv --python 3.12
source .venv/bin/activate技术支持
然后安装支持 CUDA 12.6 的 PyTorch 2.7.0:
uv pip install torch == 2.7 .0 \
--index-url https://download.pytorch.org/whl/cu126技术支持
在测试中,我们的 RTX 4070 上 CUDA 12.8 版本会抛出驱动兼容性错误。切换到带 CUDA 12.6 的 PyTorch 2.7.0 无需更新驱动即可解决。根据您的 GPU 与 NVIDIA 驱动,您可能需要不同的 CUDA 构建。
如果没有 GPU,请将索引 URL 替换为 https://download.pytorch.org/whl/cpu 来安装 CPU 版本。稍后教程中的代码会自动回退到 CPU。
现在直接从其官方 GitHub 仓库 安装 Timestral:
uv pip install git+https://github.com/mistralai/timestral.git技术支持
安装其余库以下载股票市场数据、处理预测结果、创建可视化并运行笔记本:
uv pip install numpy "pandas>=2.2,<3.1" matplotlib \
yfinance jupyterlab ipykernel tqdm技术支持
我们使用 yfinance 获取历史股价,使用 pandas 和 NumPy 进行数据处理,用 Matplotlib 绘制实际与预测价格对比图。我们还将 pandas 版本限制在测试时使用的范围,以避免因兼容性导致的警告。
继续之前,确认 PyTorch 能访问您的 GPU:
python -c "import torch; print(torch.__version__); print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0) if torch.cuda.is_available() else 'No CUDA GPU available')" 技术支持
我们的输出:
2.7.0+cu126
True
NVIDIA GeForce RTX 4070技术支持
True 表示 PyTorch 可用 CUDA,最后一行给出 GPU 名称。现在我们已准备好开始体验 Timestral。
相比单独的 Python 脚本,我们将使用 JupyterLab,以便逐步运行代码、检查预测值,并将预测与实际市场数据进行对比。在项目目录中启动 JupyterLab:
python -m jupyter lab技术支持
打开终端中显示的 URL,通常是 http://localhost:8888/lab,并使用刚配置的环境创建一个新的 Python 笔记本。我们将用该笔记本加载 Timestral、生成预测并评估模型表现。
用 Timestral 预测苹果股价
我们将不生成合成数据,而是使用真实的苹果历史股价,衡量 Timestral 对下一个交易日收盘价的预测准确性。
为使实验更贴近现实,我们将使用滚动一日预测 。在测试期的每个交易日,Timestral 接收之前 500 个收盘价,并只预测接下来一天的收盘价。
我们还将比较两种方法:
原始价格预测: 直接预测下一日收盘价。
对数收益率预测: 预测下一日价格对数变化,并将其转换回收盘价。
1. 下载历史股价
启动笔记本并导入所需库。我们还设置股票代码、测试天数、上下文窗口与模型名称。
import numpy as np
import pandas as pd
import torch
import yfinance as yf
import matplotlib. pyplot as plt
from tqdm. auto import tqdm
from IPython. display import display
from timestral import TimestralForecaster
TICKER = "AAPL"
DAYS = 60
WINDOW = 500
MODEL = "mistralai/Timestral-209M" 技术支持
现在下载苹果近五年的日频数据。将 auto_adjust=True 设为真可返回已根据拆股与分红调整后的收盘价。
data = yf. download(
TICKER,
period= "5y" ,
interval= "1d" ,
auto_adjust= True ,
multi_level_index= False ,
progress= False ,
)
close = data[ "Close" ] . dropna( ) . astype( float )
assert len ( close) >= WINDOW + DAYS
assert ( close > 0 ) . all ( )
display( data. tail( ) ) 技术支持
我们使用最近 60 个交易日作为测试集,并为每次预测提供之前的 500 个观测值作为上下文。
2. 在 GPU 上加载 Timestral
将 209M 模型加载到 GPU 上,如果没有 CUDA 则回退到 CPU。首次运行该单元时,837 MB 的权重会从 Hugging Face 下载。
device = "cuda" if torch. cuda. is_available( ) else "cpu"
model = TimestralForecaster. from_pretrained(
MODEL,
device= device,
)
print ( f"Loaded { MODEL} on { device} " ) 技术支持
我们的模型已在 RTX 4070 上成功加载:
Loaded mistralai/Timestral-209M on cuda技术支持
3. 生成滚动一日预测
现在我们为每个交易日生成两种预测:一种基于历史收盘价,另一种基于对数收益率。对数收益率是价格对数的日度变化,我们将每个预测的收益率用前一日收盘价转换回价格。
actual = [ ]
price_predictions = [ ]
return_predictions = [ ]
previous_prices = [ ]
lower_bounds = [ ]
upper_bounds = [ ]
dates = [ ]
for i in tqdm( range ( DAYS) , desc= "Forecasting" ) :
pos = len ( close) - DAYS + i
history = close. iloc[ pos - WINDOW: pos] . to_numpy( dtype= np. float32)
previous = float ( history[ - 1 ] )
with torch. inference_mode( ) :
price_fc = model. forecast(
history,
prediction_length= 1 ,
)
price_pred = float ( price_fc. median. squeeze( ) )
returns = np. diff( np. log( history) )
return_fc = model. forecast(
returns. astype( np. float32) ,
prediction_length= 1 ,
)
return_pred = previous * np. exp(
float ( return_fc. median. squeeze( ) )
)
actual. append( float ( close. iloc[ pos] ) )
previous_prices. append( previous)
price_predictions. append( price_pred)
return_predictions. append( return_pred)
lower_bounds. append( float ( price_fc. quantile( 0.1 ) . squeeze( ) ) )
upper_bounds. append( float ( price_fc. quantile( 0.9 ) . squeeze( ) ) )
dates. append( close. index[ pos] )
actual = np. array( actual)
previous_prices = np. array( previous_prices)
price_predictions = np. array( price_predictions)
return_predictions = np. array( return_predictions)
lower_bounds = np. array( lower_bounds)
upper_bounds = np. array( upper_bounds)
results = pd. DataFrame( {
"Previous Close" : previous_prices,
"Actual" : actual,
"Raw Prediction" : price_predictions,
"Return Prediction" : return_predictions,
"Lower 10%" : lower_bounds,
"Upper 90%" : upper_bounds,
} , index= pd. DatetimeIndex( dates, name= "Date" ) )
display( results. tail( ) ) 技术支持
该模型共生成 60 个滚动的一日预测,每个预测使用先前 500 个收盘价。每次预测只使用目标日之前可用的数据,避免未来信息泄漏进模型输入。
4. 评估预测准确性
我们测量平均绝对误差(MAE)、均方根误差(RMSE)、平均绝对百分比误差(MAPE)和方向准确率。我们还将 Timestral 与一个朴素基线进行比较,该基线假设“明日收盘价等于今日收盘价”。
actual = results[ "Actual" ] . to_numpy( )
previous = results[ "Previous Close" ] . to_numpy( )
raw = results[ "Raw Prediction" ] . to_numpy( )
ret = results[ "Return Prediction" ] . to_numpy( )
def evaluate ( prediction, baseline= False ) :
metrics = {
"MAE ($)" : np. mean( np. abs ( actual - prediction) ) ,
"RMSE ($)" : np. sqrt( np. mean( ( actual - prediction) ** 2 ) ) ,
"MAPE (%)" : np. mean( np. abs ( ( actual - prediction) / actual) ) * 100 ,
}
metrics[ "Direction (%)" ] = (
np. nan if baseline
else np. mean( np. sign( actual - previous) == np. sign( prediction - previous) ) * 100
)
return metrics
metrics = pd. DataFrame( {
"Baseline" : evaluate( previous, baseline= True ) ,
"Raw Prices" : evaluate( raw) ,
"Log Returns" : evaluate( ret) ,
} ) . T
coverage = (
( actual >= results[ "Lower 10%" ] . to_numpy( ) )
& ( actual <= results[ "Upper 90%" ] . to_numpy( ) )
) . mean( ) * 100
display( metrics. round ( 2 ) )
print ( f"Raw-price 10-90% interval coverage: { coverage: .1f } %" ) 技术支持
我们的结果显示,Timestral 在预测对数收益率时的表现略优于直接预测原始股价。
对数收益率方法取得了最低的 MAE($3.05)、RMSE($3.84)与 MAPE(0.93%),略微优于我们的基线模型。
更重要的是,方向准确率从原始价格预测的 41.67% 提升至对数收益率预测的 55%,表明其在预测涨跌方向上更胜一筹。
原始价格模型的预测区间覆盖率也达到了 81.7%,接近预期的 80%,这表明不确定性估计的校准程度较为合理。总体而言,Timestral 生成的价格预测相当准确,但相对简单基线的提升幅度很小,仍需进一步测试以判断其预测能否可靠地支持交易决策。
5. 可视化 Timestral 预测
我们用 Matplotlib 将实际收盘价与两种预测方法进行对比绘图。
fig, axes = plt. subplots(
2 , 1 ,
figsize= ( 14 , 9 ) ,
gridspec_kw= { "height_ratios" : [ 2 , 1 ] } ,
sharex= True ,
)
axes[ 0 ] . plot(
dates, actual,
label= "Actual Price" ,
color= "green" ,
linewidth= 2.5 ,
)
axes[ 0 ] . plot(
dates, price_predictions,
label= "Timestral Raw Price" ,
color= "orange" ,
linestyle= "--" ,
)
axes[ 0 ] . plot(
dates, return_predictions,
label= "Timestral Log Returns" ,
color= "royalblue" ,
linestyle= "--" ,
)
axes[ 0 ] . fill_between(
dates,
lower_bounds,
upper_bounds,
color= "orange" ,
alpha= 0.12 ,
label= "10-90% Forecast Range" ,
)
axes[ 0 ] . set_title( f"Timestral-209M | { TICKER} Rolling One-Day Forecast" )
axes[ 0 ] . set_ylabel( "Adjusted Close (USD)" )
axes[ 0 ] . legend( )
axes[ 0 ] . grid( alpha= 0.2 )
axes[ 1 ] . plot(
dates,
price_predictions - actual,
label= "Raw Price Error" ,
color= "orange" ,
)
axes[ 1 ] . plot(
dates,
return_predictions - actual,
label= "Log Return Error" ,
color= "royalblue" ,
)
axes[ 1 ] . axhline( 0 , color= "black" , linestyle= ":" )
axes[ 1 ] . set_ylabel( "Error ($)" )
axes[ 1 ] . set_xlabel( "Date" )
axes[ 1 ] . legend( )
axes[ 1 ] . grid( alpha= 0.2 )
fig. autofmt_xdate( )
plt. tight_layout( )
fig. savefig( "aapl_improved.png" , dpi= 180 , bbox_inches= "tight" )
plt. show( ) 技术支持
图表展示了在 60 个交易日内,Timestral 与苹果实际价格的贴合程度。两种方法都捕捉到了上行趋势,橙色阴影区域为原始价格模型的 10-90% 预测区间。底部面板绘制了每日预测误差。
大多数误差在约 $5 以内,少数在价格突然波动时出现 $9 到 $11 的较大偏差。两种方法生成的预测几乎相同,对数收益率略胜一筹。两条预测线也大致滞后实际价格约一天,这与其与朴素基线之间的微小差距相吻合。
6. 生成买入、持有与卖出信号
现在我们将原始价格预测转换为实验性的买入、持有与卖出信号。我们对预测价格变动设置 1% 的阈值:
BUY: 预测涨幅大于 1%。
SELL: 预测跌幅大于 1%。
HOLD: 预测涨跌幅介于 -1% 与 +1% 之间。
我们用 NumPy 实现这些规则:
THRESHOLD = 1.0
change_pct = (
price_predictions / previous_prices - 1
) * 100
signals = np. where(
change_pct > THRESHOLD,
"BUY" ,
np. where( change_pct < - THRESHOLD, "SELL" , "HOLD" ) ,
)
results[ "Expected Change (%)" ] = change_pct
results[ "Signal" ] = signals
display( results. tail( 10 ) . round ( 2 ) )
display( results[ "Signal" ] . value_counts( ) )
results. to_csv( "aapl_signals.csv" ) 技术支持
60 个交易日全部产生 HOLD 信号 ,没有 BUY 或 SELL 建议。在所示的最后 10 行中,预期变动在任一方向上均未超过 0.15%,远低于 1% 的阈值。
这些信号基于原始价格预测,该方法的方向准确率较弱(41.67%)。若要查看基于对数收益率预测的信号,请在 change_pct 计算中将 price_predictions 替换为 return_predictions。降低阈值会产生更多 BUY 与 SELL 信号,但也会让它们对预测误差与市场噪声更敏感。
这些信号仅用于实验而非实盘交易,本教程不构成任何投资建议。若要评估其是否可支持盈利策略,还需要进一步回测、阈值调优与交易成本分析。
结语
总体而言,我对 Timestral 印象深刻。
整个搭建过程十分顺畅,推理速度很快,我可以在本地的 RTX 4070 上完成全部流程,无需依赖外部 API。
更吸引我的是,这些轻量模型也能在 CPU 上运行,无需昂贵硬件即可使用。
至于预测准确性,我们的结果好坏参半。
Timestral 对股价的跟踪尚可,但仅略微优于简单基线。
我并非金融预测或交易方面的专家,在数据准备、预测策略与参数调优方面或许还能做得更好,以取得更佳结果。
我过去使用过 TimeGPT 等托管预测服务,但 Timestral 让本地预测更具吸引力。自它发布以来,我开始将更多预测工作负载迁移到本地模型,因为它们快速、轻量,且无需 API 调用与按用量付费。
对我而言, Timestral 最大的优势不仅在于准确率,更在于它让预测变得简单而低成本。
您可以在自有硬件上运行一款功能强大的时间序列模型,自由试验,并将其集成到应用中,而不必依赖外部服务。即使我们的股价预测并不亮眼,我仍认为 Timestral 是任何构建本地预测应用人士的极佳选择。
如果您想进一步学习预测,推荐查看我们的Python 时间序列分析 课程。面向金融建模,您可以尝试Python 金融机器学习 。
如果您可以用一个在本地运行、毫秒级返回结果且无需额外训练的小型 AI 模型来预测股价,会怎样?
时间序列预测通常意味着使用诸如 ARIMA 的统计方法、机器学习流水线,或在特定数据集上训练的模型。Timestral 是 Mistral AI 于 2026 年 10 月 15 日发布的一系列开放权重预测模型,采用了不同路径。它无需微调,即可根据历史数据预测未来数值。根据 Mistral 的说法,其最大模型在三个公共基准上的预训练零样本模型中排名第一。
尽管规模很小,这些模型在多个预测基准上仍能提供有竞争力的准确率,适用于从金融市场到能源消耗与零售需求等多种场景。
在本教程中,我们将了解 Timestral 是什么以及其工作原理,使用 Python 和 uv 在本地进行搭建,并在真实的苹果(AAPL)股票数据上进行测试。我们将生成滚动的一日预测,将其与实际收盘价和一个朴素基线进行比较,并将预测转化为简单的买入(Buy)、卖出(Sell)或持有(Hold)信号。您也可以查看我们关于使用 TimeGPT 进行时间序列预测和ARIMA 时间序列预测的教程。
什么是 Mistral Timestral?
Timestral 是 Mistral AI 推出的开放权重时间序列基础模型家族,用于快速、通用的预测。时间序列基础模型在大量多样的序列上进行一次预训练,因此可以对从未见过的数据进行预测。
与需要在特定数据集上训练的传统预测模型不同,Timestral 支持零样本预测。它可直接根据历史数据预测未来值,无需额外训练或微调。
Timestral 是一种因果、基于补丁的 Transformer,主要在合成数据上训练,随后在真实与合成数据的混合上进行第二阶段训练。它可处理股价、能源需求、销售额和传感器测量。Mistral 在其技术报告中介绍了架构与训练细节。
Mistral 发布了四种规模,在模型大小、速度与准确率之间做出不同权衡:
根据 Mistral 发布的基准测试,Timestral-209M 在 GIFT-Eval、TIME 和 fev-bench 的预训练零样本模型中排名第一。在其报告的对比中,它超越了更大的模型,如 TimesFM-3 和 Falcon-2.0。上述为 Mistral 自己的结果,并提交到了 GIFT-Eval 和 TIME 榜单,请查看榜单以获取独立确认。
速度也是一大优势。在一台标准的 8 线程服务器 CPU 上,Mistral 报告称 Timestral-209M 能在113 毫秒内,基于三周的 15 分钟历史数据,预测一天后的数值,而 5M 模型仅需 17 毫秒。无需 GPU。
Timestral 支持以下预测功能:
在本教程中,我们将使用 Timestral-209M。根据 Mistral 发布的基准,它是该系列中规模最大、准确率最高的模型。我们将在一张 NVIDIA RTX 4070 GPU 上本地运行它来预测股价,并在真实市场数据上评估其表现。
在 Linux 上安装 Timestral
Timestral 需要 Python 3.10 或更高版本,以及 PyTorch 2.4 或更高版本。我们将使用Python 3.12、PyTorch 2.7.0 和 uv在 Linux 机器上创建一个轻量的开发环境。Timestral 也支持 CPU 推理,因此 GPU 为可选。
首先,确认您的 NVIDIA GPU 已被检测到且驱动工作正常:
该命令会显示您的 GPU 信息、驱动版本与 CUDA 兼容性。如果输出中出现了您的 GPU,即可继续。
接下来安装 uv,这是一个快速的 Python 包与环境管理器:
安装 uv 后请重启终端,以便在您的 shell 中启用该命令。
现在创建一个项目目录与 Python 3.12 虚拟环境:
然后安装支持 CUDA 12.6 的 PyTorch 2.7.0:
在测试中,我们的 RTX 4070 上 CUDA 12.8 版本会抛出驱动兼容性错误。切换到带 CUDA 12.6 的 PyTorch 2.7.0 无需更新驱动即可解决。根据您的 GPU 与 NVIDIA 驱动,您可能需要不同的 CUDA 构建。
如果没有 GPU,请将索引 URL 替换为
https://download.pytorch.org/whl/cpu来安装 CPU 版本。稍后教程中的代码会自动回退到 CPU。现在直接从其官方 GitHub 仓库安装 Timestral:
安装其余库以下载股票市场数据、处理预测结果、创建可视化并运行笔记本:
我们使用 yfinance 获取历史股价,使用 pandas 和 NumPy 进行数据处理,用 Matplotlib 绘制实际与预测价格对比图。我们还将 pandas 版本限制在测试时使用的范围,以避免因兼容性导致的警告。
继续之前,确认 PyTorch 能访问您的 GPU:
我们的输出:
True表示 PyTorch 可用 CUDA,最后一行给出 GPU 名称。现在我们已准备好开始体验 Timestral。相比单独的 Python 脚本,我们将使用 JupyterLab,以便逐步运行代码、检查预测值,并将预测与实际市场数据进行对比。在项目目录中启动 JupyterLab:
打开终端中显示的 URL,通常是
http://localhost:8888/lab,并使用刚配置的环境创建一个新的 Python 笔记本。我们将用该笔记本加载 Timestral、生成预测并评估模型表现。用 Timestral 预测苹果股价
我们将不生成合成数据,而是使用真实的苹果历史股价,衡量 Timestral 对下一个交易日收盘价的预测准确性。
为使实验更贴近现实,我们将使用滚动一日预测。在测试期的每个交易日,Timestral 接收之前 500 个收盘价,并只预测接下来一天的收盘价。
我们还将比较两种方法:
1. 下载历史股价
启动笔记本并导入所需库。我们还设置股票代码、测试天数、上下文窗口与模型名称。
现在下载苹果近五年的日频数据。将
auto_adjust=True设为真可返回已根据拆股与分红调整后的收盘价。我们使用最近 60 个交易日作为测试集,并为每次预测提供之前的 500 个观测值作为上下文。
2. 在 GPU 上加载 Timestral
将 209M 模型加载到 GPU 上,如果没有 CUDA 则回退到 CPU。首次运行该单元时,837 MB 的权重会从 Hugging Face 下载。
我们的模型已在 RTX 4070 上成功加载:
3. 生成滚动一日预测
现在我们为每个交易日生成两种预测:一种基于历史收盘价,另一种基于对数收益率。对数收益率是价格对数的日度变化,我们将每个预测的收益率用前一日收盘价转换回价格。
该模型共生成 60 个滚动的一日预测,每个预测使用先前 500 个收盘价。每次预测只使用目标日之前可用的数据,避免未来信息泄漏进模型输入。
4. 评估预测准确性
我们测量平均绝对误差(MAE)、均方根误差(RMSE)、平均绝对百分比误差(MAPE)和方向准确率。我们还将 Timestral 与一个朴素基线进行比较,该基线假设“明日收盘价等于今日收盘价”。
我们的结果显示,Timestral 在预测对数收益率时的表现略优于直接预测原始股价。
对数收益率方法取得了最低的 MAE($3.05)、RMSE($3.84)与 MAPE(0.93%),略微优于我们的基线模型。
更重要的是,方向准确率从原始价格预测的 41.67% 提升至对数收益率预测的 55%,表明其在预测涨跌方向上更胜一筹。
原始价格模型的预测区间覆盖率也达到了 81.7%,接近预期的 80%,这表明不确定性估计的校准程度较为合理。总体而言,Timestral 生成的价格预测相当准确,但相对简单基线的提升幅度很小,仍需进一步测试以判断其预测能否可靠地支持交易决策。
5. 可视化 Timestral 预测
我们用 Matplotlib 将实际收盘价与两种预测方法进行对比绘图。
图表展示了在 60 个交易日内,Timestral 与苹果实际价格的贴合程度。两种方法都捕捉到了上行趋势,橙色阴影区域为原始价格模型的 10-90% 预测区间。底部面板绘制了每日预测误差。
大多数误差在约 $5 以内,少数在价格突然波动时出现 $9 到 $11 的较大偏差。两种方法生成的预测几乎相同,对数收益率略胜一筹。两条预测线也大致滞后实际价格约一天,这与其与朴素基线之间的微小差距相吻合。
6. 生成买入、持有与卖出信号
现在我们将原始价格预测转换为实验性的买入、持有与卖出信号。我们对预测价格变动设置 1% 的阈值:
我们用 NumPy 实现这些规则:
60 个交易日全部产生 HOLD 信号,没有 BUY 或 SELL 建议。在所示的最后 10 行中,预期变动在任一方向上均未超过 0.15%,远低于 1% 的阈值。
这些信号基于原始价格预测,该方法的方向准确率较弱(41.67%)。若要查看基于对数收益率预测的信号,请在
change_pct计算中将price_predictions替换为return_predictions。降低阈值会产生更多 BUY 与 SELL 信号,但也会让它们对预测误差与市场噪声更敏感。这些信号仅用于实验而非实盘交易,本教程不构成任何投资建议。若要评估其是否可支持盈利策略,还需要进一步回测、阈值调优与交易成本分析。
结语
总体而言,我对 Timestral 印象深刻。
整个搭建过程十分顺畅,推理速度很快,我可以在本地的 RTX 4070 上完成全部流程,无需依赖外部 API。
更吸引我的是,这些轻量模型也能在 CPU 上运行,无需昂贵硬件即可使用。
至于预测准确性,我们的结果好坏参半。
Timestral 对股价的跟踪尚可,但仅略微优于简单基线。
我并非金融预测或交易方面的专家,在数据准备、预测策略与参数调优方面或许还能做得更好,以取得更佳结果。
我过去使用过 TimeGPT 等托管预测服务,但 Timestral 让本地预测更具吸引力。自它发布以来,我开始将更多预测工作负载迁移到本地模型,因为它们快速、轻量,且无需 API 调用与按用量付费。
对我而言,Timestral 最大的优势不仅在于准确率,更在于它让预测变得简单而低成本。
您可以在自有硬件上运行一款功能强大的时间序列模型,自由试验,并将其集成到应用中,而不必依赖外部服务。即使我们的股价预测并不亮眼,我仍认为 Timestral 是任何构建本地预测应用人士的极佳选择。
如果您想进一步学习预测,推荐查看我们的Python 时间序列分析课程。面向金融建模,您可以尝试Python 金融机器学习。