3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
您好!您在聚宽(JoinQuant)平台上获取 book_to_price_ratio 因子时发现大量负值,这其实并不是因为原始的账面价值为负,而是因为您获取的是经过“标准化处理”后的风格因子暴露度(Z-score)。
下面为您详细解惑:
在聚宽的因子库中,book_to_price_ratio 属于风险模型中的风格因子。根据聚宽 API 文档的【风格因子数据处理说明】,平台为了让不同因子之间具有可比性,并消除量纲影响,会对风格因子进行去极值和标准化处理。
标准化的公式为:
$$ x_{new} = \frac{x - mean(x)}{std(x)} $$
(注:聚宽使用的是市值加权均值和标准差)
结论:经过标准化处理后,因子的均值会变为 0。如果某只股票的原始账面市值比低于全市场的平均水平,其标准化后的因子值就会变成负数。 这就是为什么您会看到大量负值的原因,它代表的是该股票的账面市值比在市场中的相对位置,而不是绝对的财务数值。
如果您想了解原始的 book_to_price_ratio 是如何计算的,聚宽文档中的定义如下:
pb_ratio 的倒数)。原始 book_to_price_ratio = 归属母公司所有者权益合计 / 总市值在真实的财务数据中,如果一家公司“资不抵债”,其归母净资产确实可能为负,从而导致原始的 PB 或账面市值比为负。但是,聚宽在处理这个风格因子时,已经考虑到了这一点。
根据文档说明:
账面市值比因子 book_to_price_ratio:最新一季财报的账面价值与当前市值的比值(pb_ratio的倒数)。其中小于0的值设置为 nan。
这意味着,在进行标准化之前,聚宽已经将原始计算中小于 0 的异常值剔除(设为 nan)了。因此,您最终看到的负值,100% 是标准化过程(减去均值)产生的。
如果您在策略中需要使用绝对的、未标准化的账面市值比(即市净率的倒数),建议您不要直接调用风格因子库中的 book_to_price_ratio,而是直接通过财务估值表(valuation)来获取并计算:
from jqdata import *
# 获取股票的市净率 (PB)
q = query(valuation.code, valuation.pb_ratio).filter(valuation.code.in_(['000001.XSHE', '000002.XSHE']))
df = get_fundamentals(q, date='2023-10-01')
# 自行计算原始的账面市值比 (1 / PB)
df['raw_book_to_price'] = 1 / df['pb_ratio']
print(df)
通过这种方式获取的数据,只要公司没有资不抵债,计算出的结果就都是正数。