最初的 Chronos 模型在时间序列基础领域掀起了波澜,它在广泛的预测任务中展现出了极高的预测准确性,但在实际应用中却极其缓慢。这就是为什么尽管 chronos-t5-small 是 HuggingFace 上下载量最高的模型之一,但更大版本的 Chronos 却没有得到广泛使用的原因之一。几天前发布的 Chronos-Bolt 改变了这一状况:它在每个模型尺寸上都显著加快了推理速度,同时全面提高了准确性!
在尝试了新的 Chronos-Bolt 之后,我发现即使是小模型也能准确预测出人类肉眼可见的模式。但我想进一步测试:我能否找到 Chronos-Bolt 在金融领域实际应用的场景?
通常,像 Chronos 这样的时间序列基础模型在涉及外生变量时才在金融领域有用,因为大多数证券没有明显的可推断模式。幸运的是,对我来说,证券的衍生品通常比证券本身更容易预测:因此,我决定尝试预测波动率。
我还想看看 Chronos-Bolt-Small 在实际运行中的速度如何。令我惊喜的是,我的预测不仅准确,而且在相当多的时间步长上只花了大约5秒钟!
现实世界测试:市场波动率
我特意选择了UVXY(ProShares Ultra VIX Short-Term Futures ETF)来测试Chronos-Bolt,因为它具有独特的衰减模式。接下来,我们将一起了解整个实施过程:
import yfinance as yf
import pandas as pd
from autogluon.timeseries import TimeSeriesDataFrame, TimeSeriesPredictor
import matplotlib.pyplot as plt
from datetime import timedelta
import numpy as np
# Fetch UVXY data
vix_futures = yf.download('UVXY', start='2022-01-01')
vix_futures = vix_futures.reset_index()
# Create DataFrame with required columns
vix_ts = vix_futures[['Date', 'Close']].copy()
vix_ts.columns = ['timestamp', 'target']
vix_ts['item_id'] = 'UVXY'
# Convert timezone-aware timestamp to timezone-naive datetime64[ns]
vix_ts['timestamp'] = vix_ts['timestamp'].dt.tz_localize(None)
# Create TimeSeriesDataFrame
full_data = TimeSeriesDataFrame(vix_ts)
时区处理可能看起来微不足道,但对模型的性能至关重要。我在几次失败的尝试后深刻地认识到了这一点。
首先查看数据
在做出预测之前,重要的是要可视化我们正在处理的数据:
plt.figure(figsize=(15, 7))
plt.plot(full_data.index.get_level_values('timestamp'),
full_data['target'],
label='Historical UVXY',
color='blue')
plt.title('UVXY Historical Data (2x Leveraged VIX Futures ETF)')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.grid(True)
plt.show()
设置预测器
这里事情就变得有趣了:
predictor = TimeSeriesPredictor(
prediction_length=500,
eval_metric='MASE',
freq='B' # Business day frequency - crucial for financial data
)
# Split data into train and validation sets
validation_length = 200 # 200 trading days for validation
last_date = full_data.index.get_level_values('timestamp').max()
validation_start = last_date - timedelta(days=validation_length)
train_end = validation_start - timedelta(days=1)
train_data = full_data[full_data.index.get_level_values('timestamp') <= train_end]
validation_data = full_data[full_data.index.get_level_values('timestamp') > train_end]
# Fit and predict
predictor = predictor.fit(
train_data,
presets="bolt_small",
time_limit=600
)
predictions = predictor.predict(train_data)
'freq="B"'参数对于金融数据至关重要,它告诉模型预期的工作日频率。如果没有这个参数,你会在周末和节假日得到错误的预测。
结果可视化
可视化结果显示,模型不仅预测准确,还提供了一个我们可以用来检测异常的置信区间。
plt.figure(figsize=(15, 10))
# Plot training data
plt.plot(train_data.index.get_level_values('timestamp'),
train_data['target'],
label='Training Data',
color='blue',
alpha=0.5)
# Plot validation data
plt.plot(validation_data.index.get_level_values('timestamp'),
validation_data['target'],
label='Actual (Validation)',
color='green',
linewidth=2)
# Plot predictions with confidence intervals
plt.plot(predictions.index.get_level_values('timestamp'),
predictions['mean'],
label='Forecast',
color='red',
linestyle='--',
linewidth=2)
plt.fill_between(predictions.index.get_level_values('timestamp'),
predictions['0.1'],
predictions['0.9'],
color='red',
alpha=0.2,
label='80% Confidence Interval')
plt.title('UVXY Forecast vs Actual (Validation Period)')
plt.xlabel('Date')
plt.ylabel('Price (USD)')
plt.grid(True)
plt.legend()
plt.show()
哪些方法奏效了(哪些没奏效)
结果揭示了一些重要信息:
实际应用
以下是我看到的真正价值所在:
展望未来
关键的好处不仅仅是速度的提升,还有它所启用的实际应用。能够在本地以如此改进的性能运行这些模型,为之前不可行的实时应用开辟了可能性。同样令人兴奋的是,Chronos模型的大小得到了如此大的缩减,同时在点和概率预测方面都保持了最先进的水平!
无论你是在构建交易系统、风险管理工具,还是仅仅需要快速的模式验证,Chronos-Bolt的速度和准确性都使其非常适合在交易和风险管理系统中进行快速迭代。只需记住:它在具有固有模式的时间序列上表现最为出色,而不是那些受外部因素主导的时间序列。