🚀 AI 一键生成 joinquant 策略代码
立即体验
👉 AI 生成代码 👈

JoinQuant量化策略中 df.T.apply() 是什么意思?如何优化打分代码?

joinquant | 发布时间: 2026/5/29
以下内容由 EasyQuant 生成。

问题描述

请问T.apply(xxx)是什么意思?

各位大佬好,

请问下面这段代码中的T.apply(f_sum)是什么意思?
在API里搜过,也百度过,但是没有找到结果

#获取综合得分
df['point'] = df[['pb_ratio','1/roe']].rank().T.apply(f_sum)

#打分工具
def f_sum(x):
return sum(x)
code
多谢

解决方案

你好!这段代码是量化交易多因子选股策略中非常常见的**“等权打分法”**。为了让你彻底明白,我们把这段代码拆解开来看。

代码拆解分析

整句代码 df[['pb_ratio','1/roe']].rank().T.apply(f_sum) 可以分为四个步骤:

1. df[['pb_ratio','1/roe']]

这是从你的数据表(DataFrame)中提取出两列数据:市净率(pb_ratio)和 ROE的倒数(1/roe)。

2. .rank()

这是 Pandas 的排序函数。它会对提取出来的这两列数据分别进行排名。比如,把所有股票的 pb_ratio 从小到大排个名次(1, 2, 3...),再把 1/roe 也排个名次。此时,你得到的是一个包含两列排名数据的 DataFrame,每一行代表一只股票,每一列代表一个因子的排名

3. .T (转置)

T 是 Transpose(转置)的缩写。它的作用是把表格的行和列对调

  • 转置前:行是“股票”,列是“因子排名”。
  • 转置后:行变成了“因子排名”,列变成了“股票”。

4. .apply(f_sum)

apply() 是 Pandas 中用来对数据应用某个函数的工具。默认情况下,apply()按列(axis=0)逐列执行的。
因为你在第3步做了转置(.T),现在的“列”实际上代表的是
某一只股票
。所以,.apply(f_sum) 的意思就是:把每一只股票的 pb_ratio 排名和 1/roe 排名传给 f_sum 函数进行求和

最终,df['point'] 得到的就是每只股票在这两个因子上的排名总和(综合得分)。


💡 强烈建议的优化方案(Pandas进阶)

虽然原作者的代码能实现功能,但先转置再 apply 自定义函数,在 Pandas 中是非常低效的写法,尤其是在股票数量很多的时候,运行速度会很慢。

其实,Pandas 已经内置了按行求和的功能,你完全可以去掉 .T.apply(f_sum),直接使用 .sum(axis=1) 来代替。这不仅代码更短,而且底层是 C 语言实现的,运行速度快得多!

优化后的代码如下:

# 获取综合得分(按行求和,axis=1表示跨列按行计算)
df['point'] = df[['pb_ratio', '1/roe']].rank().sum(axis=1)

这样写,你甚至连那个 def f_sum(x): 的自定义函数都可以直接删掉了,代码更加优雅和高效!

在 JoinQuant 中的应用场景

在 JoinQuant (聚宽) 编写多因子策略时,我们经常需要综合多个指标来选股。比如你想选出“估值低(PB低)”且“盈利能力强(ROE高,即1/ROE低)”的股票。通过 .rank().sum(axis=1) 计算出综合排名得分后,你就可以使用 .sort_values('point') 对得分进行排序,从而选出得分最低(排名最靠前)的 N 只股票进行买入操作了。