使用tsfresh进行多ID时间序列预测实战指南
前言
时间序列预测是数据分析领域的重要课题,在金融、物联网、工业生产等场景都有广泛应用。本文将介绍如何利用tsfresh这一强大的时间序列特征提取工具,对多个时间序列ID(如多只股票)进行预测分析。
环境准备
首先需要确保已安装以下Python库:
- tsfresh:用于时间序列特征提取
- pandas_datareader:用于获取金融数据
- scikit-learn:用于构建预测模型
import numpy as np
import pandas as pd
import matplotlib.pylab as plt
from tsfresh import extract_features, select_features
from tsfresh.utilities.dataframe_functions import roll_time_series, impute
from sklearn.ensemble import AdaBoostRegressor
数据获取与预处理
我们将以福特(F)、苹果(AAPL)和谷歌(GOOGL)三只股票的最高价数据作为示例:
df = web.DataReader(['F', "AAPL", "GOOGL"], 'stooq')["High"]
数据预处理步骤包括:
- 重置索引并将日期作为普通列
- 将宽表转换为长表格式
- 按股票代码和日期排序
df_melted = df.copy()
df_melted["date"] = df_melted.index
df_melted = df_melted.melt(id_vars="date", value_name="high").sort_values(["Symbols", "date"])
df_melted = df_melted[["Symbols", "date", "high"]]
时间序列窗口构建
tsfresh的roll_time_series
函数可以自动创建滑动时间窗口,这对时间序列预测至关重要:
df_rolled = roll_time_series(df_melted, column_id="Symbols", column_sort="date",
max_timeshift=20, min_timeshift=5)
参数说明:
max_timeshift=20
:使用最多20个历史数据点min_timeshift=5
:至少使用5个历史数据点
特征提取
从滚动时间窗口中提取特征:
X = extract_features(df_rolled.drop("Symbols", axis=1),
column_id="id", column_sort="date", column_value="high",
impute_function=impute, show_warnings=False)
提取的特征包括各种统计量、傅里叶变换系数、熵值等数百种时间序列特征。
数据索引处理
为方便后续操作,我们将索引转换为多级索引:
X = X.set_index([X.index.map(lambda x: x[0]), X.index.map(lambda x: x[1])], drop=True)
X.index.names = ["Symbols", "last_date"]
目标变量构建
预测目标是下一个时间点的股票价格,通过shift操作实现:
y = df_melted.groupby("Symbols").apply(lambda x: x.set_index("date")["high"].shift(-1)).T.unstack()
模型训练与评估
数据划分
按时间划分训练集和测试集:
X_train = X.loc[(slice(None), slice(None, "2020")), :]
X_test = X.loc[(slice(None), slice("2021", "2022")), :]
y_train = y.loc[(slice(None), slice(None, "2020"))]
y_test = y.loc[(slice(None), slice("2021", "2022"))]
特征选择
使用tsfresh的特征选择功能:
X_train_selected = select_features(X_train, y_train)
模型训练
为每只股票单独训练AdaBoost回归模型:
adas = {stock: AdaBoostRegressor() for stock in ["AAPL", "F", "GOOGL"]}
for stock, ada in adas.items():
ada.fit(X_train_selected.loc[stock], y_train.loc[stock])
预测与可视化
X_test_selected = X_test[X_train_selected.columns]
y_pred = pd.concat({
stock: pd.Series(adas[stock].predict(X_test_selected.loc[stock]), index=X_test_selected.loc[stock].index)
for stock in adas.keys()
})
y_pred.index.names = ["Symbols", "last_date"]
总结
本文展示了如何使用tsfresh处理多ID时间序列预测问题,关键点包括:
- 正确处理多ID时间序列的数据结构
- 使用滚动窗口构建特征工程
- 针对每个ID单独训练模型
- 灵活运用pandas的多级索引功能
这种方法不仅适用于股票预测,也可应用于物联网设备监测、工业生产监控等多时间序列场景。tsfresh的强大特征提取能力结合机器学习模型,为复杂的时间序列预测问题提供了有效解决方案。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考