时间序列/信号处理的自动趋势检测

Jos*_*a G 6 python signal-processing time-series trendline trend

有哪些好的算法可以自动检测时间序列数据的趋势或绘制趋势线(上升趋势、下降趋势、无趋势)?如果您能为我指出任何好的研究论文或 python、R 或 Matlab 库,我将不胜感激。

理想情况下,该算法的输出将有 4 列:

  1. 从时间

  2. 到时间

  3. 趋势(上升/下降/无趋势/未知)
  4. 趋势概率或趋势程度

非常感谢您的参与。

趋势线示例

izk*_*ros 1

我有一个类似的问题 - 想要对具有相似趋势的片段进行时间序列分割。对于该任务,您可以使用趋势分类器Python 库。它可以通过 pip 安装 ( pip3 install trend-classifier)。

下面是一个从 YahooFinance 获取时间序列数据并进行分析的示例。

import yfinance as yf
from trend_classifier import Segmenter

# download data from yahoo finance
df = yf.download("AAPL", start="2018-09-15", end="2022-09-05", interval="1d", progress=False)

x_in = list(range(0, len(df.index.tolist()), 1))
y_in = df["Adj Close"].tolist()

seg = Segmenter(x_in, y_in, n=20)
seg.calculate_segments()
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用趋势线和段边界绘制时间序列:

seg.plot_segments()
Run Code Online (Sandbox Code Playgroud)

您可以检查有关每个段的详细信息(例如,斜率的正值表示上升趋势,负值表示下降趋势)。要查看有关索引段的信息3

from devtools import debug
debug(seg.segments[3])
Run Code Online (Sandbox Code Playgroud)

您可以使用Segmenter.segments.to_dataframe()生成 Pandas DataFrame 的方法以表格形式获取有关所有段的信息。

seg.segments.to_dataframe()
Run Code Online (Sandbox Code Playgroud)

有一个参数控制“泛化”因素,即您可以尝试将趋势线拟合到较小的时间序列范围 - 您最终会得到大量的线段,或者您可以选择跨越更大范围的线段时间序列的一部分(更一般的趋势线),最终将时间序列分为更少的部分。为了控制该行为,在初始化时Segmenter()(例如,Segmenter(x_in, y_in, n=20)使用不同的n参数值。越大,n泛化性越强(段越少)。

免责声明:我是趋势分类器包的作者。