数据与算法

金融时间序列异常检测:从统计阈值到机器学习的实战权衡

在金融市场里,“异常”从来不是一个只由数值大小决定的概念。…

金融时间序列异常检测:从统计阈值到机器学习的实战权衡

价格突然跳动,可能是撮合系统延迟,也可能是正常的宏观消息冲击;成交量瞬间放大,可能是大资金集中交易,也可能是数据重复写入;某个因子的横截面排名突然变化,可能代表市场风格切换,也可能只是成分股数据错位。相同的观测结果,放进不同的交易场景,含义完全不同。

这也是金融时间序列异常检测最容易被低估的地方:它不是在历史数据里找几个离群点,而是在有限延迟、噪声极高、分布持续变化的环境中,判断一个观测是否值得让交易系统、风控模块或研究人员停下来检查。

算法选择必须服从这个判断的用途。高频撮合链路关注的是延迟和稳定性,风险监控更关心漏报,研究型策略则可能更在意解释异常形成的原因。脱离业务损失函数讨论“哪个模型最好”,通常只会得到一个看起来复杂、上线后却很难维护的检测器。

统计阈值的边界:Z-Score与IQR在金融数据中的局限性

Z-Score通常是异常检测的第一站。对一个观测值 \(x_t\),可以用窗口均值和标准差计算:

\[

Z_t=\frac{x_t-\mu_t}{\sigma_t}

\]

当绝对值超过预设阈值时,系统触发报警。最常见的做法是使用三倍标准差作为参考边界。它的优点非常直接:计算量小,参数少,结果容易解释,也方便在流式数据中持续更新。

但这里有一个经常被忽略的前提:均值和标准差能够合理描述当前数据分布。金融时间序列往往并不满足这个条件。价格水平通常具有趋势性,收益率会表现出尖峰厚尾,波动率存在聚集现象,交易量则经常呈现明显的日内周期。如果把原始价格直接送进固定窗口的Z-Score检测器,模型很容易把趋势当成异常;如果对收益率使用长期均值和标准差,又可能在波动状态变化后迅速失去校准。

因此,第一步通常不是设置阈值,而是先确定检测对象。

价格、收益率和残差不是一回事

对价格序列做异常检测,得到的是价格水平偏离;对简单收益率或对数收益率做检测,得到的是单期变化异常;对模型残差做检测,判断的是观测与条件预测之间的不一致。三种序列回答的问题不同,不能混在一起解释。

例如,一只股票连续数日上涨,价格相对于较长窗口的均值不断偏离,原始价格的Z-Score可能持续升高。但这不一定意味着数据异常,也可能只是一个正常趋势。换成收益率后,检测器关注的是每天的变化幅度;再进一步,使用考虑市场指数和行业因子的残差,才有机会识别出个股相对其风险暴露的异常表现。

这也是金融场景中常见的错误:把“数值大”直接等同于“数据有问题”。更稳妥的流程是:

1. 先确认序列的经济含义,是价格、收益率、成交量、价差,还是模型残差。

2. 检查是否存在明显的时间周期,例如开盘、收盘和午间时段的交易行为差异。

3. 判断均值与波动是否随时间变化,再决定使用固定窗口、滚动窗口还是指数加权统计量。

4. 将异常标记与后续价格行为、成交状态或数据质量日志对照,而不是把标记本身当作结论。

IQR更抗极端值,但仍然是局部静态判断

IQR,也就是四分位距,使用第一四分位数和第三四分位数描述中间大部分数据:

\[

IQR=Q_3-Q_1

\]

常见的异常边界为:

\[

[Q_1-1.5IQR,\ Q_3+1.5IQR]

\]

相比均值和标准差,四分位数不容易被单个极端观测值拖动。因此,当序列中存在闪崩、突然放量或少量录入错误时,IQR通常比直接使用Z-Score更稳健。它尤其适合做初步数据清洗,或者作为后续模型的第一层粗筛。

但IQR并没有解决金融数据的核心问题。它依然主要针对单变量,并且依赖当前窗口中的分布形态。假设某个资产的成交量在消息发布后整体抬升,旧窗口估计出来的四分位数会持续偏低,于是接下来一段时间的正常交易都可能被标记为异常。相反,如果异常事件本身持续时间较长,它又可能逐渐进入新的窗口,使检测器把异常状态“学习”为正常状态。

这类现象可以称为基线污染:异常观测参与了基线估计,随后又降低了后续异常的可检测性。

解决方法不只是把系数从1.5调整到2或3。更有价值的改进包括:

  • 使用不包含当前观测的滚动窗口,避免当前异常立即改变边界;
  • 对不同交易时段分别建立基线,避免把开盘波动和午间波动混为一谈;
  • 对明显的趋势序列先做差分、收益率转换或去季节处理;
  • 使用中位数和中位数绝对偏差等更稳健的统计量;
  • 对连续异常采用冻结基线、分段重估或人工复核,而不是让窗口无条件继续更新。
统计阈值适合做第一道门,不适合独自承担异常的最终解释。它能回答“这个观测偏离了当前基线多少”,却不能单独回答“为什么偏离,以及是否值得交易”。

单变量阈值为什么会错过真正的市场异常

金融异常经常以关联结构的变化出现,而不是某一个变量单独越界。

价格变化并不大,但成交量、买卖方向不平衡和盘口深度同时发生变化,可能意味着流动性正在消失;某个资产的收益率看起来正常,但它与相关资产之间的价差突然偏离,才是真正值得关注的信号;期货价格没有突破历史区间,基差和持仓量却出现不寻常的组合,也可能代表展期或交割压力。

在这些情况下,单变量Z-Score和IQR最多只能分别给出几个局部提示。它们无法表达“多个变量同时以某种关系变化”这一层信息。阈值方法仍然有用,但更适合作为基础监控、数据质量检查和低延迟预警,而不是完整的市场状态识别系统。

无监督学习的突围:孤立森林如何捕捉非线性异常

当异常不再表现为单个变量的极端值,就需要把多个特征放进同一个判断框架。孤立森林的思路并不是先学习正常数据的精确边界,而是利用异常样本通常“数量少、位置偏、容易被分离”的特点,随机切分特征空间。

算法会反复随机选择特征和切分点,构建多棵随机树。一个样本如果只需要很少几次切分就能与其他样本分开,它的路径通常较短,更可能被判定为异常;如果一个样本处在密集区域,需要经过很多次切分才能被隔离,通常更接近正常状态。

这个方法对金融数据有吸引力,原因有三点。

第一,它不要求事先给每一种异常写出明确的规则。价格、成交量、波动率、盘口深度、价差和相关资产收益率可以共同构成特征空间,模型通过样本分布寻找稀疏区域。

第二,它能够处理非线性关系。某个成交量水平单独看不异常,但如果它与极低的盘口深度、异常的买卖方向不平衡同时出现,组合状态可能变得罕见。孤立森林不需要把这种关系预先写成公式。

第三,它适合在缺少可靠标签时使用。实际交易系统很少拥有一份完整、准确、覆盖各种市场状态的异常标签。很多所谓异常,只有在几小时或几天之后,结合成交回放和风控结果才能确认。无监督方法可以先提供候选事件,再交由研究员或规则系统复核。

特征设计决定了模型看到什么

孤立森林并不会自动理解金融市场。它只能对输入特征的几何结构做切分。特征设计不合理,模型可能只是稳定地发现数据尺度差异,而不是发现异常。

一个较为实用的特征集合,通常包括以下几类:

  • 价格变化特征:对数收益率、短周期累计收益、跳跃幅度、相对基准资产的超额收益;
  • 波动特征:滚动标准差、绝对收益率均值、上下行波动差异、波动率变化速度;
  • 成交特征:成交量、成交额、成交笔数、单笔成交规模的分位数;
  • 订单簿特征:买卖盘深度、盘口价差、订单流不平衡、撤单与成交之间的比例;
  • 关联特征:跨资产价差、滚动相关性、期现基差、行业或指数暴露;
  • 数据质量特征:时间戳间隔、重复记录、缺失值、价格精度和撮合顺序。

这些特征不能全部用原始值表示。成交量往往具有明显的日内周期,直接比较开盘和午间的成交量没有意义;价格也存在不同资产之间的量纲差异。更稳妥的方式是进行时段标准化、滚动归一化,或者用相对于自身历史分布的位置来表示。

还要特别警惕未来信息泄露。对于时间点 \(t\) 的检测,标准化参数、滚动统计量和特征变换都只能使用 \(t\) 之前可获得的数据。若把全样本均值、未来波动率或事后修正后的成交记录用于训练,离线回测中的异常分数会显得非常漂亮,但上线后无法复现。

contamination不是一个可以随意调的按钮

孤立森林通常需要设定异常比例,也就是对异常样本占比的预估。这个参数在很多示例中被当成普通超参数处理,但金融市场里的真实异常比例往往无法直接观察。

如果把比例设得过高,模型会把大量正常的市场状态推入告警队列;如果设得过低,真正的异常可能只得到一个不够突出的分数。更麻烦的是,不同时间尺度的异常比例本来就不同:逐笔成交层面可能存在很多微小异常,分钟级聚合后却只剩少量事件;数据质量监控和交易风险监控所定义的异常,也不是同一类样本。

因此,contamination不应只通过一次网格搜索决定。实践中可以采用分层方法:

1. 先在一段相对稳定的历史数据上观察异常分数分布,而不是立即把分数转换为二元标签。

2. 将分数阈值与业务容量绑定,例如系统每个交易时段能够处理多少条人工复核告警。

3. 分别评估平稳期、剧烈波动期和流动性下降期,观察阈值是否出现明显漂移。

4. 对异常分数保留排名和原始特征,不要只保存“异常”或“正常”两个结果。

5. 当市场状态发生变化时,重新校准阈值,但不要在异常事件正在发生时盲目在线更新。

孤立森林的输出更适合被理解为“稀有程度”或“候选优先级”,而不是一张自动生成的真相清单。最终是否触发交易限制、暂停策略或人工升级,仍然需要结合损失函数和规则层。

序列预测的残差逻辑:ARIMA与LSTM的动态报警机制

统计阈值直接问观测值是否偏离历史分布,序列预测方法则换了一个问题:在已知过去信息的情况下,这个观测是否符合模型对当前时刻的预期?

设模型在时刻 \(t-1\) 对下一时刻做出预测 \(\hat{x}_t\),残差为:

\[

e_t=x_t-\hat{x}_t

\]

如果残差显著扩大,说明实际变化没有被模型解释。异常检测可以围绕残差的绝对值、标准化残差,或者残差在一段时间内的连续积累来设计。

这种方法的关键优势,是阈值可以随预测不确定性变化。市场平稳时,模型通常给出更窄的预测区间;波动上升时,预测区间自然变宽。与固定的全局阈值相比,它更接近金融时间序列的动态特征。

ARIMA:结构清晰,但不能替市场承担更多责任

ARIMA适合描述具有自相关、趋势或差分结构的单变量序列。它的优势不在于能够捕捉所有复杂市场行为,而在于模型结构透明、参数相对容易诊断,残差也比较容易进行后续检查。

用ARIMA进行异常检测时,至少要关注以下问题:

  • 序列是否需要差分,差分后是否引入了过强的噪声;
  • 残差是否仍然存在明显自相关;
  • 预测区间是否使用了合理的误差假设;
  • 参数是否在滚动窗口中稳定;
  • 模型更新频率是否跟得上市场状态变化。

不能简单地把“落在95%预测区间之外”当作统一标准。预测区间覆盖率与异常检测效果不是同一个目标。一个模型可能具有不错的平均预测表现,却在波动快速切换时严重低估风险;也可能为了覆盖极端波动而把区间设得过宽,导致异常几乎不再报警。

更实用的办法是检查标准化残差是否连续越界,或者使用连续若干个残差的累计偏离。单个大残差可能是一次正常的消息冲击,持续偏离则更可能意味着模型的状态假设已经失效。

LSTM:能够表达复杂模式,也更容易把噪声学进去

LSTM能够通过门控结构保留和更新历史信息,适合处理具有非线性、长短期依赖和状态变化的序列。它可以预测下一时刻的价格、收益率、成交量或多变量状态,再使用预测残差进行报警。

但“模型更深”并不等于“异常检测更可靠”。金融市场中的可预测结构通常很弱,而且会随制度、流动性和参与者行为变化。LSTM在训练集和验证集上的损失下降,不能证明它学到了稳定的市场规律,也可能只是记住了某一段历史中的波动形态。

使用LSTM残差报警时,工程上需要特别注意:

  • 训练集、验证集和测试集必须按时间切分,不能随机打乱;
  • 归一化参数只能用训练期数据估计;
  • 预测目标要与上线时可获得的信息严格一致;
  • 不能用未来窗口对当前残差进行事后平滑;
  • 模型更新要有冻结期,避免异常事件污染训练样本;
  • 需要监控输入分布漂移,而不只是监控预测误差。

如果模型在市场状态切换后持续产生大残差,不能马上把所有残差都当作异常。它可能是在提示模型失配,而不是提示每一个观测都存在数据错误。对此,可以将“观测异常”和“模型失配”分成两种不同的告警类型:前者交给数据或风控模块,后者触发模型复核、降级或重新训练。

报警机制不能只有一个阈值

序列残差通常具有连续性,单点阈值容易产生告警抖动。一个更稳健的报警机制可以同时使用:

  • 残差的标准化绝对值;
  • 连续超过阈值的次数;
  • 最近一段窗口内的越界比例;
  • 残差方向是否持续一致;
  • 波动率或流动性是否同步变化。

例如,第一次越界只记录候选事件,连续越界才提升为正式告警;告警解除则需要残差回到更低的恢复阈值,形成滞回区间。这样可以减少系统在边界附近反复开关,也更适合交易系统和风控平台。

残差不是异常的同义词。它首先说明模型没有解释好当前观测,至于原因是数据错误、结构突变还是正常的极端事件,还需要第二层判断。

极度样本不均衡下的评估陷阱:从准确率到PR-AUC的指标重构

异常检测最难评估的原因,不仅是异常少,还在于异常标签本身经常不完整。

市场数据中,真正需要关注的事件可能只占很小比例。一个模型即使把所有样本都判为正常,也能得到很高的准确率,但它没有完成异常检测的核心任务。准确率在这种场景下几乎无法体现模型是否捕获了关键事件。

更重要的是,金融异常通常存在时间聚集。一次市场冲击可能产生一串连续异常点,如果按逐条记录计算指标,模型晚几个时间点报警可能被算成大量错误;如果按事件合并,又需要先定义事件的开始、结束和容忍延迟。因此,评估单位本身就需要设计。

精确率、召回率和业务代价

精确率回答的是:模型报出的异常中,有多少经过复核后确实值得关注。精确率低,意味着告警噪声大,人工团队或自动化风控系统容易产生告警疲劳。

召回率回答的是:已知异常事件中,有多少被模型捕获。召回率低,说明系统漏掉了重要事件,但在某些场景下,高召回率也可能带来大量误报。

F1值将精确率和召回率合并为一个平衡指标,适合在需要单一比较标准时使用,但它并不能代表所有业务目标。交易策略的异常监控与清洗系统的异常检测,通常不会使用同样的权重。数据清洗可能更担心把正常记录删掉,风控系统则可能更愿意接受较多误报来降低漏报风险。

因此,阈值选择应该从损失函数出发。可以把一次漏报的潜在损失、一次误报的人工成本、延迟报警的额外损失分别估计,再观察不同阈值下的总成本变化。即使无法得到精确金额,也应该明确这些代价的相对顺序。

为什么PR-AUC通常比准确率更有信息

精确率—召回率曲线关注正类识别能力,更适合异常比例很低的场景。PR-AUC可以用于比较模型在不同阈值下的整体表现,避免只挑选一个有利阈值汇报结果。

但PR-AUC也不能被机械地视为最终答案。它受异常基准比例影响,不同时间段、不同资产和不同聚合频率下的数值不能直接横向比较。一个模型在平稳期表现很好,在剧烈波动期失效,整体PR-AUC仍然可能看起来不错。

因此,评估至少应拆分到以下维度:

  • 不同资产或资产类别;
  • 不同交易时段;
  • 不同波动状态;
  • 不同预测或报警提前量;
  • 不同异常类型;
  • 点级指标与事件级指标。

事件级评估尤其重要。可以将时间上相邻、原因相近的异常点合并成一个事件,重点观察模型是否在事件窗口内及时报警、报警持续了多久,以及是否出现重复报警。对于交易系统来说,提前几个时间点发现事件,可能比单纯提高点级召回率更有价值。

交叉验证不能破坏时间顺序

传统随机交叉验证不适合金融时间序列。随机拆分会让相邻时间点同时出现在训练集和测试集中,模型可能借助高度相关的邻近样本获得虚假的泛化能力。

更合理的方式包括滚动训练、扩展窗口验证和按时间区间进行的前向测试。每次训练只能使用过去数据,测试窗口位于未来。对于需要调节异常阈值的系统,阈值也必须在训练期或验证期确定,不能看完测试期结果后再回头调整。

如果异常标签来自后续一段时间的价格表现,还要把标签形成所需的观察窗口纳入时间隔离。例如,一个事件是否造成后续损失需要观察若干个周期,那么训练样本和测试样本之间就需要留出相应的间隔,避免标签信息发生重叠。

实战权衡:计算资源、实时性与可解释性的多维决策

算法选择不是模型排行榜,而是约束条件下的工程决策。下面的比较只能作为方向判断,具体性能仍然取决于特征、数据频率、实现方式和更新策略。

维度统计阈值(Z-Score/IQR)孤立森林序列残差模型(ARIMA/LSTM)
计算延迟很低,适合流式计算较低,适合批量或准实时处理从中等到较高,取决于模型和硬件
可解释性高,偏离基线的原因清楚中等,可结合特征和路径分析ARIMA较高,LSTM较低
多变量能力弱,通常需要分别设定规则较强,能够联合使用多种特征较强,但依赖训练稳定性
非线性关系很弱可以捕捉部分非线性边界LSTM等模型表达能力较强
对分布变化的适应依赖窗口和基线更新依赖重新训练或阈值校准依赖模型更新和漂移监控
工程复杂度中等ARIMA中等,LSTM较高
主要风险静态假设失效、误报或漏报参数敏感、解释有限、分数漂移过拟合、数据泄露、延迟和模型失配

高频微观结构:先保证系统活着

在逐笔成交、盘口变化和订单流监控中,延迟预算通常比模型表达能力更重要。一个复杂模型如果需要排队等待特征生成、批量推理或网络传输,即使离线指标更好,也未必适合进入交易链路。

这类场景可以先从稳健的局部统计开始:

  • 对订单流不平衡使用短窗口滚动基线;
  • 将不同价位的盘口深度进行标准化;
  • 对异常时间戳、重复成交和价格跳变设置独立的数据质量规则;
  • 用连续触发和恢复阈值降低边界抖动;
  • 把高成本模型放在旁路,用于复盘和归因,而不是直接阻塞撮合流程。

高频系统还需要区分硬实时和软实时。硬实时链路中的检测器必须有可预测的最坏延迟,不能只看平均耗时;软实时的风控和监控平台则可以容忍一定批处理延迟,但应保证告警不会因为队列积压而失去时效。

中低频监控:孤立森林更适合发现组合偏移

在分钟级、小时级或日级数据中,计算资源通常不再是最主要的瓶颈。此时可以把价格、波动率、成交和关联资产信息放在一起,检测多个变量同时偏离历史结构的情况。

孤立森林适合用作候选发现器,但要注意模型训练窗口。窗口太短,模型会把暂时的市场状态误认为异常;窗口太长,模型可能无法及时适应新的制度和流动性环境。实践中可以保留多个时间尺度的分数:短窗口反映局部稀有程度,长窗口反映相对于更稳定历史的偏离。两个分数同时升高时,告警通常比单独使用其中一个更有参考价值。

对于因子监控,还要关注横截面异常和时间序列异常的区别。某个股票的因子值在自身历史上并不极端,但在当天横截面中排名异常,可能说明数据映射或行业暴露发生变化;反过来,所有股票的因子都出现同方向偏移,可能是市场状态变化,而不是单只股票异常。

衍生品和跨市场关系:残差更接近问题本身

期货基差、期权隐含波动率、波动率曲面和跨市场价差通常具有更强的结构关系。检测这些数据时,单纯看某个价格是否超过历史分位数,信息量有限。更有意义的问题是:在当前期限、行权价、利率和标的价格条件下,这个观测是否符合模型所描述的关系。

可以先用简单模型建立基准,再观察残差是否持续扩大。复杂模型不一定要直接负责交易决策,也可以用于生成条件预测区间和异常排序。这样做的好处是,系统能够把“价格变化很大”和“相对于相关变量变化得不合理”区分开来。

但残差模型同样会受到市场状态切换影响。波动率曲面在重大事件前后可能出现整体重定价,模型的残差扩大未必代表错误定价,可能只是历史样本没有覆盖当前状态。此时,模型应该输出状态变化提示,而不是直接给出套利结论。

级联系统:让不同模型各自承担擅长的工作

实际系统中,最稳妥的方案往往不是在统计方法和机器学习之间二选一,而是采用分层检测。

第一层负责低成本筛查。它可以处理缺失值、重复记录、时间戳异常、价格跳跃和明显的成交量偏离。这一层的目标不是完成复杂判断,而是尽快过滤无关数据,确保明显问题不会进入后续流程。

第二层负责多变量候选发现。孤立森林或其他无监督模型可以对价格、成交、波动和关联特征进行联合判断,输出异常分数和贡献较大的特征。这里不宜直接把所有高分样本都升级为最高级别告警,而应保留分数、特征快照和对应时间窗口。

第三层负责动态确认和归因。序列预测模型可以检查异常是否打破了原有的时间结构,判断偏离是单点冲击还是持续状态变化。对于需要解释的系统,还可以将残差曲线、预测区间和相关资产行为一起展示给研究员或风控人员。

级联并不意味着每一层都必须使用最复杂的算法。相反,层次越靠近实时链路,越应该优先考虑确定性、稳定性和可降级性;越靠近研究和归因环节,才越有空间使用计算成本较高的模型。

一套可维护的异常检测系统,还应记录以下信息:

  • 触发时使用的特征值和基线参数;
  • 模型版本、训练窗口和阈值版本;
  • 告警产生与解除的时间;
  • 是否被人工确认、忽略或合并到其他事件;
  • 后续是否造成交易、数据质量或风控影响;
  • 模型在不同市场状态下的误报和漏报变化。

没有这些记录,系统上线后很难回答最基本的问题:为什么当时报警、为什么这次没有报警、阈值何时发生了变化,以及模型是否已经悄悄失效。

最后:先定义异常的代价,再选择检测器

金融时间序列异常检测没有一套放之四海而皆准的算法。Z-Score和IQR便宜、透明,适合做基线和实时粗筛;孤立森林能够处理多变量稀疏结构,适合发现未被规则覆盖的候选事件;ARIMA和LSTM通过预测残差建立动态边界,更适合检查时间结构是否被打破。

它们的差别不只是精度差别,更是责任边界不同。

统计阈值负责指出偏离,机器学习负责排序和组合判断,序列模型负责检验当前状态是否仍符合过去形成的规律。真正的工程问题,是把这些结果放回交易延迟、人工处理能力、风险损失和模型维护成本中一起评估。

如果一次误报只增加一条监控记录,而一次漏报可能让策略继续使用错误行情,那么系统应该偏向高召回;如果每条告警都需要人工逐笔复核,就必须控制告警密度和事件合并方式;如果模型无法在规定时间内稳定输出,再高的离线指标也没有上线价值。

异常检测的终点不是把所有“不寻常”的数据标成红色,而是让系统在真正需要关注的时刻给出足够早、足够稳定、能够解释的信号。最好的方案通常不追求模型最复杂,而是让检测速度、判断质量和业务代价处在一个可以长期运行的平衡点上。

相关阅读: 交易员决策疲劳应对策略:减少日内无效交易的系统化方案全职交易员的社交孤立:享受孤独还是走向心理失衡?.

常见问题

为什么金融数据中简单的Z-Score检测经常失效?
金融时间序列通常具有趋势性、尖峰厚尾、波动率聚集及日内周期性,这导致固定的均值和标准差无法准确描述当前数据分布,从而引发大量误报。
孤立森林在金融异常检测中有什么优势?
它无需预设明确规则,能够处理多变量间的非线性关系,并能通过样本在特征空间中的稀疏程度识别异常,非常适合在缺乏完整标签的场景下使用。
如何避免异常检测中的未来信息泄露?
在特征变换、标准化及滚动统计量计算时,必须严格仅使用当前时间点之前可获得的数据,严禁使用全样本均值或未来波动率等信息。
为什么不能直接把模型残差等同于异常?
残差仅代表模型未能解释当前观测,其原因可能是数据错误、市场结构突变或正常的极端事件,需要第二层判断来区分是数据质量问题还是模型失配。
在评估异常检测模型时,为什么准确率指标不可靠?
金融异常事件通常占比极低,模型即便将所有样本判为正常也能获得高准确率,因此应使用精确率、召回率及PR-AUC等指标,并结合业务代价进行评估。