← 返回博客列表

【Python量化实战全攻略 #09】估值因子手册:PE、PB、PS 怎么取、怎么用(附代码)

2026年10月13日 10:23 · 智兔数服 · Python量化实战全攻略

摘要:【Python量化实战全攻略 #09】估值因子手册:PE、PB、PS 怎么取、怎么用(附代码) 手册定位:模块二「选股因子实战」第 1 篇。估值因子是最经典的价值因子——PE/PB/PS。本篇讲因子怎么从接口数据算出

手册定位:模块二「选股因子实战」第 1 篇。估值因子是最经典的价值因子——PE/PB/PS。本篇讲因子怎么从接口数据算出来、怎么标准化、怎么用。
数据来源复用模块一:市值取实时行情(#01/#02),净利润/净资产/营收取财务三表(#04)。接口不重复罗列。

1. 你将得到什么

  • PE(市盈率)、PB(市净率)、PS(市销率)的计算公式与取数字段;
  • 把原始财务+行情整理成估值因子表的函数;
  • 用分位数对估值因子做标准化的雏形;
  • 估值因子的 4 个坑(负值、周期股、口径、极端值)。

2. 取数约定(复用)

因子 分子/分母 来源端点 见
PE 总市值 / 归母净利润 市值=实时行情;净利润=利润表 #01 #04
PB 总市值 / 归母净资产 市值=实时行情;净资产=资产负债表 #01 #04
PS 总市值 / 营业收入 市值=实时行情;营收=利润表 #01 #04

3. 数据来源(复用,不重复罗列端点)

  • 行情/市值:/hs/real/ssjy/{代码}、/hs/fin/capital/{代码}.{市场}(详见 #01、#04)
  • 财务:利润表 /hs/fin/income、资产负债表 /hs/fin/balance(详见 #04)

4. 核心模板函数(自包含可跑)

import pandas as pd

_MOCK = True


def build_valuation(df):
    out = df.copy()
    out["PE"] = out["总市值"] / out["归母净利润"].replace(0, pd.NA)
    out["PB"] = out["总市值"] / out["归母净资产"].replace(0, pd.NA)
    out["PS"] = out["总市值"] / out["营业收入"].replace(0, pd.NA)
    return out


def quantile_score(s, ascending=True):
    return s.rank(ascending=ascending, pct=True)


def run_check():
    universe = pd.DataFrame([
        {"代码": "600519", "总市值": 2.0e12, "归母净利润": 7.5e10, "归母净资产": 7.5e11, "营业收入": 1.5e11},
        {"代码": "000001", "总市值": 3.0e11, "归母净利润": 3.0e10, "归母净资产": 4.0e11, "营业收入": 1.3e11},
        {"代码": "600036", "总市值": 9.0e11, "归母净利润": 1.4e11, "归母净资产": 9.0e11, "营业收入": 3.0e11},
    ])
    v = build_valuation(universe)
    assert (v["PE"] > 0).all() and (v["PB"] > 0).all() and (v["PS"] > 0).all()
    v["PE_score"] = quantile_score(v["PE"], ascending=True)
    assert v["PE_score"].between(0, 1).all()
    print("校验通过 | 样本PE:", v["PE"].round(1).tolist())
    return v


if __name__ == "__main__":
    run_check()

5. 跑通示例

v = run_check()
cheap = v[v["PE_score"] <= 0.34].sort_values("PE")
print(cheap[["代码", "PE", "PB", "PS"]])

6. 坑与注意事项

  1. 负盈利:亏损股 PE 为负无意义,要单独剔除或换用 PB/PS。
  2. 周期股陷阱:周期股在盈利高点 PE 极低,估值因子要结合行业中性。
  3. 口径统一:市值、净利润口径全样本统一。
  4. 极端值:微利股 PE 会爆高,标准化前先 winsorize 再排名。

7. 小结与下一篇预告

估值因子就位。下一篇讲成长因子——用营收/利润增速刻画高成长,是价值+成长的经典互补。

下一篇预告:《【Python量化实战全攻略 #10】成长因子手册:营收、利润增速因子构建(附代码)》

8. 免责声明

本文为因子构建方法示例,演示数据为虚构,不构成投资建议。


关于数据来源:本文因子所需的财务与行情数据均来自智兔数服(www.zhituapi.com)官方文档接口(详见本系列 #01、#04),覆盖 200+ 已验证路径,注册可领免费 token 做研究测试。
更多实战手册见技术博客:zhituapi.com/blog.html。
本系列《Python量化实战全攻略》共 32 篇,下一篇讲成长因子。

想亲自试一下?免费获取证书