使用tsfresh进行多ID时间序列预测实战指南

使用tsfresh进行多ID时间序列预测实战指南

tsfresh Automatic extraction of relevant features from time series: tsfresh 项目地址: https://gitcode.com/gh_mirrors/ts/tsfresh

前言

时间序列预测是数据分析领域的重要课题,在金融、物联网、工业生产等场景都有广泛应用。本文将介绍如何利用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"]

数据预处理步骤包括:

  1. 重置索引并将日期作为普通列
  2. 将宽表转换为长表格式
  3. 按股票代码和日期排序
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时间序列预测问题,关键点包括:

  1. 正确处理多ID时间序列的数据结构
  2. 使用滚动窗口构建特征工程
  3. 针对每个ID单独训练模型
  4. 灵活运用pandas的多级索引功能

这种方法不仅适用于股票预测,也可应用于物联网设备监测、工业生产监控等多时间序列场景。tsfresh的强大特征提取能力结合机器学习模型,为复杂的时间序列预测问题提供了有效解决方案。

tsfresh Automatic extraction of relevant features from time series: tsfresh 项目地址: https://gitcode.com/gh_mirrors/ts/tsfresh

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

霍美予Mabel

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值