如何检测股票交付占比序列最后一个数值是否异常偏高?
检测股票交付占比序列最后一个数值是否异常偏高的方法
针对你给出的两组10日交付占比数据,我们可以通过统计特征结合业务规则的方式,判断最后一个值是否属于异常偏高——核心逻辑是拿最后一天的数据和前9天的正常交易数据做对比,看它是否显著超出合理波动范围。
方法一:均值+标准差法(适合近似正态分布的数据)
这是最常用的统计异常检测思路,适合数据波动相对稳定的场景:
- 提取前9天的数据作为正常样本,计算它们的均值和标准差
- 设定阈值(比如均值+2倍标准差,正态分布下95%的正常数据会落在这个区间内)
- 若最后一天的数值超过阈值,则判定为异常偏高
Python代码实现
def is_last_delivery_abnormal(delivery_pct): # 数据量不足时无法判断,直接返回False if len(delivery_pct) < 2: return False # 提取前n-1天的正常交易数据 normal_days = delivery_pct[:-1] mean = sum(normal_days) / len(normal_days) # 计算样本标准差 std_dev = (sum((x - mean)**2 for x in normal_days) / len(normal_days))**0.5 # 设定异常判定阈值:均值+2倍标准差,可根据业务灵活调整倍数 threshold = mean + 2 * std_dev # 额外加入业务规则:交付占比超过90%直接标记为异常(可选) return delivery_pct[-1] > threshold or delivery_pct[-1] > 90
测试验证
- 第一组数据:前9天均值≈60.73,标准差≈8.72,阈值≈78.17,90.2远超阈值,返回
True(异常) - 第二组数据:前9天均值≈59.65,标准差≈10.68,阈值≈81.01,74.03在合理范围内,返回
False(正常)
方法二:四分位数法(IQR,鲁棒性更强)
如果数据波动大、不符合正态分布,用四分位数法更靠谱——它不受极端值干扰,适合交易数据波动剧烈的场景:
- 将前9天的数据排序,计算上四分位数(Q3)和下四分位数(Q1)
- 计算四分位距IQR = Q3 - Q1
- 设定上界阈值为
Q3 + 1.5*IQR,超过这个值则判定为异常
Python代码实现
def is_last_delivery_abnormal_iqr(delivery_pct): if len(delivery_pct) < 2: return False normal_days = delivery_pct[:-1] sorted_days = sorted(normal_days) n = len(sorted_days) # 简单计算四分位数(也可使用numpy的percentile函数获得更精准结果) q1 = sorted_days[n//4] q3 = sorted_days[3*n//4] iqr = q3 - q1 upper_bound = q3 + 1.5 * iqr return delivery_pct[-1] > upper_bound
测试验证
- 第一组数据:前9天排序后Q1=55.2,Q3=66.57,上界≈83.63,90.2超过上界,返回
True - 第二组数据:前9天Q1=52.06,Q3=63.6,上界≈80.91,74.03未超过,返回
False
业务优化小技巧
- 阈值倍数可灵活调整:想放宽检测标准就用1.5倍标准差,想严格抓极端异常就用3倍标准差
- 结合行业经验加规则:比如交付占比超过90%直接标记,正常交易场景下很难达到这么高的比例
- 若数据量足够大(如超过20天),可改用滑动窗口取最近7/10天的数据计算统计值,更贴合近期交易趋势
内容的提问来源于stack exchange,提问作者RSW
相关产品推荐
相关产品推荐

