在计算因子时候经常会使用到 rank排序,既将序列转换为顺序:
s1 = pd.Series([0.1,5,0.6,0.8,0.2,9])
s2 = s1.rank()
print(s1)
print(s2)output:
0 0.1
1 5.0
2 0.6
3 0.8
4 0.2
5 9.0
dtype: float64
0 1.0
1 5.0
2 3.0
3 4.0
4 2.0
5 6.0
dtype: float64
可以看到转换后的数据值域为 [1,len(data)],既 [1.n]
使用公式 data / n *2 -1 ;
data / n :将排名指标缩放到0到1之间的范围。这样得到的结果是一个在0到1之间的序列,
*2:将结果乘以2,将数值范围扩展到0到2之间
-1
:将结果减去1,将数值范围平移至-1到1之间。这样就实现了将排名指标映射到区间[-1, 1]的标准化。
通过这个标准化过程,排名指标的最小值将映射为-1,最大值将映射为1,而中间的值将线性地映射到这个范围内。这样可以使得不同时间窗口下的排名指标具有可比性。
举个例子:
def ap_rank(depth, trade, n=100):## 卖方价格在一定时间窗口内的排名指标return ((depth.ap1.rolling(n).rank())/n*2 - 1).fillna(0)def bp_rank(depth, trade, n=100):## 买方价格在一定时间窗口内的排名指标 ps:/n*2 -1 标准化到 【-1,1】return ((depth.bp1.rolling(n).rank())/n*2 - 1).fillna(0)