问题描述
学习聚宽因子的时候看到book_to_price_ratio因子,尝试获取后发现很多为负数,如图Img
查看文档,解释该因子为pb_ratio的倒数,但实际pb也没有那么多负的呀,Img
猜想关键问题应该是账面价值的计算,有谁能解惑下账面价值的计算公式吗?
解决方案
您好!您在聚宽(JoinQuant)平台上获取 book_to_price_ratio 因子时发现大量负值,这其实并不是因为原始的账面价值为负,而是因为您获取的是经过“标准化处理”后的风格因子暴露度(Z-score)。
下面为您详细解惑:
1. 为什么会出现大量负值?(核心原因:标准化处理)
在聚宽的因子库中,book_to_price_ratio 属于风险模型中的风格因子。根据聚宽 API 文档的【风格因子数据处理说明】,平台为了让不同因子之间具有可比性,并消除量纲影响,会对风格因子进行去极值和标准化处理。
标准化的公式为:
$$ x_{new} = \frac{x - mean(x)}{std(x)} $$
(注:聚宽使用的是市值加权均值和标准差)
结论:经过标准化处理后,因子的均值会变为 0。如果某只股票的原始账面市值比低于全市场的平均水平,其标准化后的因子值就会变成负数。 这就是为什么您会看到大量负值的原因,它代表的是该股票的账面市值比在市场中的相对位置,而不是绝对的财务数值。
2. 原始账面价值的计算公式是什么?
如果您想了解原始的 book_to_price_ratio 是如何计算的,聚宽文档中的定义如下:
- 定义:最新一季财报的账面价值与当前市值的比值(即
pb_ratio的倒数)。 - 账面价值(Book Value):通常指的是财务报表中的归属于母公司所有者权益合计(即净资产)。
- 原始公式:
原始 book_to_price_ratio = 归属母公司所有者权益合计 / 总市值
3. 原始数据中真的有负值吗?
在真实的财务数据中,如果一家公司“资不抵债”,其归母净资产确实可能为负,从而导致原始的 PB 或账面市值比为负。但是,聚宽在处理这个风格因子时,已经考虑到了这一点。
根据文档说明:
账面市值比因子 book_to_price_ratio:最新一季财报的账面价值与当前市值的比值(pb_ratio的倒数)。其中小于0的值设置为 nan。
这意味着,在进行标准化之前,聚宽已经将原始计算中小于 0 的异常值剔除(设为 nan)了。因此,您最终看到的负值,100% 是标准化过程(减去均值)产生的。
4. 如何获取原始的账面市值比(不带负值)?
如果您在策略中需要使用绝对的、未标准化的账面市值比(即市净率的倒数),建议您不要直接调用风格因子库中的 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)
通过这种方式获取的数据,只要公司没有资不抵债,计算出的结果就都是正数。