如何在时序数据框中检测存在异常正弦波模式的公司标的
时序数据中正弦波模式标的检测方案
需求背景
- 现有**图1(数据框样式)的时序数据框,需识别其中存在图2(BFE IM Equity标的呈现的正弦波异常模式)**的公司标的
- 需构建可靠检测方法,即便仅BFE IM Equity单个标的存在该模式也适用
- 此前尝试K-means聚类、傅里叶变换、自相关方法均未达到预期效果
可行检测思路
1. 残差趋势拟合+周期性验证
先对每个标的的时序数据拟合线性(或低阶多项式)趋势,分离出残差后,针对残差做两项验证:
- 滚动标准差分析:正弦波模式的残差会呈现规律性的高低波动,滚动标准差曲线会有明显的周期性峰值
- 峰值间隔稳定性:用峰值检测工具提取残差的局部峰值,计算峰值间隔的变异系数(标准差/均值),若系数远小于正常时序(比如<0.1),说明间隔稳定,符合正弦波特征
2. 周期图功率谱峰值检测
对每个标的的时序(或残差)计算周期图,正弦波会在特定频率处形成尖锐的功率峰值:
- 计算功率谱中最大值与均值的比值,若比值超过设定阈值(比如10倍),说明存在显著的周期性分量
- 可结合频率对应的周期,与目标正弦波周期(从BFE IM Equity中提取)做比对进一步筛选
3. 模板匹配(单样本场景适配)
若仅BFE IM Equity有该模式,可将其作为模板:
- 用动态时间规整(DTW)计算其他标的与模板的相似度,DTW能适配时序长度、相位差异,相似度高于阈值则标记
- 或提取模板的关键特征(周期、振幅、波动幅度),逐一比对其他标的的对应特征,匹配度达标则标记
代码实现示例(Python)
import pandas as pd import numpy as np from scipy.signal import find_peaks, periodogram def detect_sine_pattern(series, peak_height=0.3, period_cv_limit=0.1, power_ratio_limit=10): # 处理缺失值 series_clean = series.dropna() if len(series_clean) < 20: # 数据量过少直接跳过 return False # 拟合线性趋势,计算残差 x = np.arange(len(series_clean)) linear_trend = np.polyval(np.polyfit(x, series_clean, 1), x) residual = series_clean - linear_trend # 峰值检测与周期稳定性验证 peaks, peak_props = find_peaks(residual, height=peak_height) if len(peaks) < 3: return False peak_intervals = np.diff(peaks) period_cv = np.std(peak_intervals) / np.mean(peak_intervals) if period_cv > period_cv_limit: return False # 周期图功率谱验证 _, power = periodogram(residual) power_ratio = np.max(power) / np.mean(power) if power_ratio < power_ratio_limit: return False return True # 遍历数据框所有标的列 # 替换为你的数据路径 df = pd.read_csv("time_series_data.csv", parse_dates=True, index_col=0) sine_targets = [col for col in df.columns if detect_sine_pattern(df[col])] print("检测到正弦波模式的标的:", sine_targets)
内容的提问来源于stack exchange,提问作者Ali Abdellatif
相关产品推荐
相关产品推荐

