- Published on
Weighted percentile nearest rank
- Authors

- Name
- CoresightQuant
NOTE
本文为公开交易策略的技战术复盘,聚焦方法逻辑、交易场景与风险边界。
在量化交易研究领域,我们经常需要从一组样本中提取“位置特征”——例如价格分布的某一分位点,作为支撑阻力位、风险阈值或异常检测边界。普通百分位数算法容易实现,但当我们希望每个样本拥有不同“话语权”时,比如以成交量、持仓量、时间衰减因子作为权重,标准方法往往捉襟见肘。公开交易社区用户 gorx1 发布了一个针对“加权百分位数最近排名”算法的实现思路,虽然描述简短,却道出了许多生产级研发者的痛点。本文将以此为契机,从原理解读、交易应用、方法优缺点到历史渊源,全面拆解这一容易被忽视的量化基础工具。
策略解读
我们抛开原文的代码形式,用更规范的统计语言重新描述这个算法。
假设我们有一组观测值 x_1, x_2, dots, x_n,以及一组非负权重 w_1, w_2, dots, w_n,权重代表每个观测值的相对重要性。我们需要计算第 p(0到100之间)个加权百分位数。最近排名法(nearest rank)的核心是找到某个“位置”,使得该位置左边所有观测值的累计权重刚好达到或超过 p% 的总权重,该位置的观测值即为所求。
具体步骤可以拆解为:
-
将观测值按从小到大排序,同时把每个观测值对应的权重“绑定”在一起,随观测值移动。这样排序后,我们得到升序数组 x_(1) le x_(2) le dots le x_(n) 以及它们对应的权重 w_(1), w_(2), dots, w_(n)。
-
计算总权重 W = sum_i=1^n w_(i)。
-
设定目标累计权重 T = p100 W。
-
从最小的观测值开始,依次累加权重,直到累计权重 S ge T。此时所在的观测值 x_(k) 就是第 p 加权百分位数。
以原文例子来演示:原始数据为 22, 33, 11, 44, 55,权重为 5, 3, 2, 1, 4。排序后,数据变为 11, 22, 33, 44, 55,对应权重为 2, 5, 3, 1, 4。总权重 W = 2+5+3+1+4 = 15。
如果我们要计算第50百分位数(也即加权中位数),则 T = 0.5 15 = 7.5。从最小数据开始累加权重:位置1累计2 < 7.5;位置2累计2+5=7 < 7.5;位置3累计2+5+3=10 ≥ 7.5。因此,第三个数据33就是加权中位数。而普通中位数同样是33,这属于巧合,但权重差异通常会让结果产生移动。
如果计算第90百分位数,则 T = 0.9 15 = 13.5。累计到位置5时,累计权重达到15 ≥ 13.5,所以第90加权百分位数为55。如果权重分布不同,结果可能会落在不同的数据点上。
这个算法之所以被作者称为“生产级解决方案”,是因为它避免了某些库中用插值法导致的“不实际”结果。在交易场景中,我们往往需要明确的价位,而不是一个模糊的插值区间。
名词解释
-
百分位数(Percentile)
将一组数据从小到大排列,第 p 百分位数表示至少有 p% 的数据不大于该值,且至少有 (100-p)% 的数据不小于该值。它是描述数据分布位置的重要统计量。 -
最近排名法(Nearest Rank)
计算百分位数的一种早期定义:将样本量记为 n,第 p 百分位数的位置为 lceil p100 n rceil,取该位置对应的排序后数据作为结果。该方法结果一定是原始样本中的某个值,不做插值。 -
加权数据(Weighted Data)
每个观测值附带一个反映其重要性的数值,该数值称为权重。权重可以是频数、成交量、置信度或时间衰减系数等。加权统计可以更真实地反映总体结构。 -
累计权重(Cumulative Weight)
在排序后依次累加权重所得的序列。累计权重达到目标权重的位置,用于确定加权百分位数。 -
排序稳定性(Stability of Sorting)
当两个数据值相等时,稳定排序会保留它们原始顺序。在同步排序数据与权重时,稳定性至关重要,否则权重可能错配。 -
分位数(Quantile)
百分位数在0与1之间的连续形式,用于描述分布中某个概率水平对应的取值。常用分位数有下四分位数(25%)、中位数(50%)、上四分位数(75%)等。 -
时间衰减因子(Time Decay Factor)
一种常用权重设计,给近期数据赋予更高权重,使统计指标更灵敏地反映当前市场状态,通常采用指数衰减形式。
策略思路讲解
在量化交易中,加权百分位数最近排名算法可以被用作一种“动态分位数通道”的核心计算模块。由于它允许不同样本拥有不同权重,我们可以构造出比简单滚动分位数更贴合市场微观结构的指标。
一个典型应用是设计动态支撑阻力通道:
- 数据准备:选取过去 N 个交易周期(如60根K线)的最低价或收盘价作为数据源。
- 权重设定:每个价格点以该周期的成交量或成交额作为权重。高成交量代表市场参与者对该价格的认可度更高,因此该价格对分位数位置的贡献应更大。
- 计算上下轨:分别求第25加权百分位数与第75加权百分位数,作为通道的下轨与上轨。当价格突破上轨,视为强势信号;跌破下轨,视为弱势信号。
- 信号应用:在震荡市中,通道边界可被视为支撑与阻力;在趋势市中,突破边界可用来启动或加仓趋势跟踪策略。
另一个重要场景是风险度量。例如,计算资产组合的历史收益率加权分位数:将最近100个交易日的日收益率作为数据,权重设为“距离当前时间的倒数”或“指数衰减权重”,然后求得95%加权分位数(即最差情况下仍能覆盖95%的损失),作为类似VaR(风险价值)的指标。相比简单VaR,它更重视近期市场行为,并给予极端但老旧的样本更低权重,从而更及时地反映风险变化。
该算法还可以用于异常检测:为价格变动幅度赋予流动性权重,如果当前变动幅度超过加权第99百分位数,则判定为异常事件,触发风控或警报。
总之,加权百分位数最近排名法提供了一种将“重要性”融入位置统计的方法,使交易决策更贴近实际市场博弈。
优点
- 反映真实影响力:权重可以代表成交量、持仓量或时间衰减等多种因素,使分位数结果不再被均匀分布假设束缚,更接近市场真实结构。
- 实现简洁直观:算法核心只有“排序+累计权重+查阈值”三步,逻辑清晰,容易编码和验证,也方便后续维护和调试。
- 结果具有实际交易意义:最近排名法返回原始数据中的真实观测值,而非插值结果。对交易者而言,一个真实存在的价位可以直接作为挂单、止损或止盈参考,避免“不存在的价格”带来的尴尬。
- 稳健性强:与均值类指标相比,分位数对极端值的敏感度较低。加权后,即使个别极端数据权重较大,也不会出现均值式“被拉扯”的过度反应。
- 灵活性高:权重函数可以根据市场状态自由设计,例如在趋势行情中提高动量因子的权重,在震荡行情中提高均值回归因子的权重,实现自适应统计。
缺点
- 权重选择主观:权重类型与参数(如时间衰减速率)没有统一标准,不同权重设定会导致结果差异巨大。若权重设计不合理,反而可能引入噪声,劣于简单等权分位数。
- 排序同步容易出错:数据与权重必须“成对”排序,任何编码失误都会导致权重错配。尤其在实时流式数据中,增量排序或维护两个数组的同步需要额外开销。
- 最近排名法的离散性:结果只能从原始样本中选取,当样本数较少时,分位数的取值会跳跃,缺乏平滑性。例如第90百分位数和第91百分位数可能落到同一个值,影响敏感性。
- 计算复杂度较高:每次新增数据,若从零开始排序,时间复杂度为 O(n log n)。在逐秒更新的高频交易场景下,频繁排序可能造成延迟;若使用滑动窗口,还需处理旧数据的删除。
- 对极端权重敏感:如果某个样本权重异常大(如单笔巨量成交),累计权重可能瞬间跨过目标阈值,导致该样本直接成为分位数结果,即使其数据本身并不具备代表性。
起源年份考证
需要说明的是,以下时间线是针对“加权百分位数”这一类方法在统计学与金融应用中的公认发展过程,而非对社区用户 gorx1 发布的特定脚本的发布日期考证,后者我们无法确认。
- 19世纪后半叶:英国科学家弗朗西斯·高尔顿(Francis Galton)在研究人类特征分布时引入了百分位数与分位数的概念,奠定了位置统计的基础。
- 1920年代至1930年代:抽样调查统计学正式发展,为了解决不等概率抽样问题,统计学家开始使用加权数据计算样本分位数,这是加权分位数方法最早的系统性应用。
- 1940年代至1950年代:非参数统计兴起,加权秩、加权中位数等概念在假设检验与稳健估计中被广泛研究,例如 Hodges-Lehmann 估计量与加权秩和检验。
- 1990年代至2000年代:随着计算机普及,各种编程语言的标准库开始内置分位数算法,但多数只支持等权重。生产环境中的大量实际需求,促使开发者在社区中讨论并分享非标准但更实用的加权分位数实现。
- 2010年代至今:量化交易盛行,动态分位数通道、加权VaR等策略在公开交易社区中流行,各类“生产级”加权百分位数算法逐渐被整理和传播。
可以看出,加权百分位数的统计理论历史悠久,但“最近排名”这种具体而微的实现风格更多是在现代编程与交易社区中逐渐成形的。对原作者的具体发布年份,无法准确考证。
改进建议
-
采用稳定排序并附加校验:在同步排序数据与权重前,可以先把原始索引记录为一个辅助数组。排序后检查每个数据点对应的权重是否与原始映射一致,避免因不稳定性导致的隐性错误。
-
针对流式数据引入增量数据结构:若需要实时更新分位数,可以用二叉搜索树(如红黑树)维护有序样本与相应权重,或使用分位数草图算法(如Greenwald-Khanna)来近似计算加权分位数,大幅降低重复排序的开销。
-
平滑化处理:结合插值与邻近排名:如果交易系统需要连续的分位数数值,可以在确定最近排名位置后,对相邻两个排名位置的数据进行线性插值,并使用累计权重比例作为插值系数。这既能保留加权思想,又能平滑边界跳变。
-
动态权重归一化:对权重进行归一化处理,并为每个权重设置上限。例如,当某个成交量的权重超过总权重的20%时,将其截断或压缩,防止极端巨量垄断分位数结果。
-
构建自适重权重模型:引入市场状态识别机制,在趋势行情与震荡行情中切换不同的权重函数(如价格变化率、波动率倒数等),并通过历史回测选择最优参数。这能让指标在不同市况下保持稳健。
-
使用滑动窗口与权重衰减配合:为了兼顾近期数据敏感度与长期稳定,可以设计一个固定窗口长度,并在窗口内使用时间指数衰减权重。这样既控制了计算范围,又使得旧数据的作用逐渐减弱,符合市场记忆有限的特征。
-
进行敏感性验证:在实盘使用前,应对权重参数进行网格敏感性测试。观察调整参数后分位数曲线是否发生剧烈抖动,若过于敏感,则应采用更平滑的权重形式或增大样本量。
总结
加权百分位数最近排名算法并不是一个高深的新发明,但它却在量化决策中扮演着“从数据到行动”的关键桥梁。原作者 gorx1 的这段分享提醒我们,很多教科书中看似简单的概念,一旦面对真实场景中的权重绑定、实时计算和鲁棒性要求,就会暴露出大量细节问题。通过正确理解算法原理,合理设计权重,并针对生产环境进行改进,这一方法可以稳定地服务支撑阻力识别、风险度量与异常检测等多元化策略。建议读者在自研指标时,不仅关注算法本身,更要重视数据清洗、权重辩证与回测验证,如此才能让一个朴素工具发挥出专业级威力。