3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
您好!您遇到的这个问题是因为通过 get_factor_values 获取到的风格因子值,并不是原始的计算比值,而是经过了去极值、标准化等数据处理后的“因子暴露度”(Z-score)。
根据 JoinQuant API 文档中关于**【风格因子数据处理说明】**的描述,平台对风格因子(如 book_to_price_ratio、size、momentum 等)进行了正规化处理,主要步骤包括:
x = (x - mean(x)) / std(x)。其中,均值的计算使用的是股票的市值加权均值。为什么宁德时代是负数?
book_to_price_ratio 的原始值确实是 1 / pb_ratio,对于宁德时代来说,这个原始值肯定是大于 0 的。mean(x) 时,结果就变成了负数。然后再除以标准差,最终得到的标准化因子值就是一个负数。如果您在策略中需要使用原始的账面市值比(即纯粹的 1 / pb_ratio),建议您不要直接从因子库获取风格因子,而是通过获取财务估值数据来自己计算:
from jqdata import *
# 获取宁德时代的 PB 数据
q = query(valuation.code, valuation.pb_ratio).filter(valuation.code == '300750.XSHE')
df = get_fundamentals(q, date='2023-06-01')
# 自己计算原始的 book_to_price_ratio
if not df.empty and df['pb_ratio'][0] > 0:
raw_book_to_price = 1.0 / df['pb_ratio'][0]
print(f"原始账面市值比: {raw_book_to_price}")
总结来说,因子库中的 book_to_price_ratio 是用于多因子模型(如 Barra 风险模型)的标准化暴露度,存在负数是正常的统计学处理结果。