如何识别这组交易数据中的重复模式

数据挖掘 时间序列 统计数据 相关性
2021-10-15 05:50:10

我正在研究银行交易数据集,并希望找到经常性交易。我一直在按时间序列映射每个商家的交易,并尝试使用 statsmodels.tsa.stattools 中的 acf 来计算自相关函数,但我没有得到预期的结果:

r = acf(ts, fft=False)

例如,当这组交易(ASSURANCE DESJ)显然是重复交易(相同数量,相同频率)时,acf 得分为 0.3159。

在此处输入图像描述

acf=0.22775 的重复交易的另一个示例:

在此处输入图像描述

但是这个不应该被发现是重复交易,并且得到的分数与上一组(0.26919)相差不远:

在此处输入图像描述

我一直在检查很多不同的方法,我实际上想出了常规时间序列的自相关、数量 = 1 的时间序列的自相关、固定检查和其他规则的组合,以使其不太完美结果。我还没有运气检查过 ARIMA 和其他方法。

您是否有更好的方法来检测时间序列中的重复交易?

链接到数据集

2个回答

我不知道您使用的模型,但我建议使用可能是老式的特征工程方法:

  • 在每组交易中,为每对连续交易计算两次连续交易之间的持续时间(即日期之间的差异)。然后将这些持续时间的标准差添加为一个特征,这样一个非常规则的交易集应该得到一个接近于零的值。
  • 与交易金额相同的想法:如果金额永远不会改变,标准偏差将为零。
  • 其他想法:
    • 所有交易中不同金额的数量
    • 交易之间不同的持续时间值的数量,以天、周、月、年为单位。
    • 日/周/月/年总和的标准差

我不确定您要实现什么,但这是我的解决方案

所以 acf 通常会告诉您所有滞后与原始趋势之间的自相关

例如,对于数据集 1

 a={'2019-07-15': 9831.0,
  '2019-08-15': 9818.0,
  '2019-09-16': 9818.0,
  '2019-10-15': 9818.0,
  '2019-11-15': 9818.0,
  '2019-12-16': 9818.0,
  '2020-01-15': 9818.0,
  '2020-02-17': 9818.0,
  '2020-03-16': 9818.0}
df = pd.DataFrame([[x,y] for x,y in zip(a.keys(),a.values())])
df[0] = pd.to_datetime(df[0])

new_df=pd.date_range(start=min(df[0]), end=max(df[0]))  ## adding blank dates in between so that data become continuous
new_df = pd.DataFrame(new_df)
new_df = new_df.merge(df, how="left", on=0)
new_df[1]=new_df[1].fillna(0)
new_df.head()
>>

    0   1
0   2019-07-15  9831.0
1   2019-07-16  0.0
2   2019-07-17  0.0
3   2019-07-18  0.0
4   2019-07-19  0.0


plt.plot(new_df[0], new_df[1])
plt.show()

数据图

如果我对这些数据进行 acf(绘制 acf 以更好地了解正在发生的事情)

plot_acf(new_df[1], lags=35)

ACF 图

我看到在 ~31 处,acf 有一个显着值(> 0.2 显着性水平),足以假设下一次交易可能会在 ~30-31 天内发生(27-32 的这个区域有非零值,由于数据的构建方式,日期不完全相隔 30 天,但略有不同)

分数本身并没有多大意义,如果它不包括分数高的时间(即高的滞后期),这实际上是用来识别季节性模式,所以在这种情况下你知道,因为模式重复每隔约 30 天,您可以在此基础上构建 SARIMA 模型,以预测下一笔交易

至于数据集 C:

数据集 C

acf 图是这样的:

ACF 数据集 c

这意味着该模式每 7 天左右重复一次,您可以使用该信息来构建 SARIMA 模型

有许多不同的方法来处理季节性趋势,也许构建 SARIMA 模型或线性模型将使用季节性分解(statsmodels)或 Prophet(http://facebook.github.io/prophet/