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

6

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

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

  1. 开始时间

  2. 结束时间

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

非常感谢您的时间。

Example of Trend Lines


如果你只想要一行代码,可以看看时间序列回归。在R中,使用forecast包。 - Dinesh.hmn
感谢您...正在寻找多行(上、下和平)... - Joshua G
好的,你可能需要对日期进行一些转换,但是 MARS 可以帮助你。在这里查看 https://en.wikipedia.org/wiki/Multivariate_adaptive_regression_splines - Dinesh.hmn
1个回答

1

我曾经遇到一个类似的问题——希望将时间序列分段,使它们具有相似的趋势。对于这个任务,你可以使用 trend-classifier 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()

现在,您可以使用以下命令绘制带有趋势线和分段边界的时间序列:
seg.plot_segments()

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

from devtools import debug
debug(seg.segments[3])

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

有一个参数控制“泛化”因子,即您可以尝试将趋势线拟合到较小的时间序列范围 - 您将得到大量分段,或者您可以选择跨越更大时间序列部分的段(更一般的趋势线),从而将时间序列划分为较少的段。为了控制这种行为,在初始化Segmenter()(例如Segmenter(x_in, y_in, n=20))时使用各种参数值n。 n 越大,泛化就越强(分段更少)。
免责声明:我是trend-classifier软件包的作者。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接