← 返回量化与 AI 投研概念库

价值因子:便宜到底怎么定义

最后更新 2026-08-18
R2 · 注意风险

在行情软件里按市盈率从小到大排一遍,你大概见过那个画面:排在最前面的一屏,你一只都不敢买。不是没听说过「买便宜的」这条老道理,是这一屏里躺着的东西看着都不太对劲——有连年不涨的,有行业整体在收缩的,还有几只你压根没听说过。

于是问题就来了。「便宜」听起来是个人人都懂的词,可一旦你要让电脑去挑出「便宜的公司」,就必须先把它写成一个能算出数的式子。而写法一变,挑出来的公司就完全换了一批。

这篇要讲的就是这件事:把「便宜」量化,一共有几种写法,每一种偷偷塞进了什么假设,以及它们各自会在什么地方骗你。

先说人话:便宜必须有个分母

你去菜市场,看到一堆苹果标价 30 块。贵还是便宜?没法答。你得知道这是一斤还是一箱。

价格本身从来不含「贵贱」的信息,贵贱是价格和某样东西之比。股票也一样。一只股票 8 块钱,另一只 800 块钱,这两个数字之间没有任何可比性——它们只说明每一份被切得多大,不说明这家公司值不值。

所以所有「便宜」的度量,本质上都长成同一个形状:

你付出的钱 ÷ 你换回的某样东西

分子基本没有争议,就是市值(股价乘以总股数,也就是把整家公司买下来要花的钱)。全部的分歧都在分母上——你到底认为自己换回的是什么。

有人说换回的是这家公司每年赚的利润,那就是市盈率;有人说换回的是它账上的那堆家当,那就是市净率;有人说换回的是每年能拿到手的分红,那就是股息率。分母的选择不是技术细节,它是一次价值观表态:你认为一家公司的价值到底建立在什么之上。

而每一种表态,都会在某类公司身上撞墙。

四把尺子,四个不同的墙

市盈率:分母是利润,而利润是最容易变形的那个数

市盈率(PE)= 市值 ÷ 净利润,直觉意思是「按现在的赚钱速度,多少年能把买它的钱赚回来」。它是最流行的一把尺子,也是坑最多的一把。

第一层坑:利润有周期。 一家做大宗商品的公司,在行业景气顶点利润会暴增。利润暴增,分母变大,市盈率于是掉到很低的位置——它在最贵的时候,看起来最便宜。等周期转头,利润回落甚至转亏,市盈率反而飙上天。低市盈率在周期行业里经常是个反向信号,这类东西有个专门的名字叫「价值陷阱」:数字上便宜,逻辑上正在变贵。

第二层坑:利润里混着一次性的东西。 公司卖掉一栋楼、处置一笔资产、拿到一次性补贴,这些都会计入当期利润。它们是真钱,但明年不会再有。一个只认利润数字的程序分不出这个差别,它只会看到「今年利润高,很便宜」。

第三层坑:口径。 同一家公司同一时刻,你能算出好几个市盈率——用上一个完整年度的利润算叫静态,用最近连续四个季度的利润算叫 TTM(滚动十二个月),用市场对未来一年的预测利润算叫前瞻。三个数经常差得很远。前瞻市盈率还额外带一个麻烦:预测会被不断修正,而修正后的版本回填到历史上,就变成了偷看未来。

第四层坑,也是工程上最要命的:亏损怎么办。 一家亏钱的公司,净利润是负的,市盈率也就是负的。你要按市盈率从小到大排序选「最便宜」的,排在最前面的会是亏得最惨的那批——因为负得越多,数值越小。Vibe-Trading 的基本面筛选模块把这条写成了明文的第一道过滤条件:

1. PE < pe_max AND PE > 0 (exclude loss-making stocks)
2. PB < pb_max
3. ROE > roe_min

它的注意事项里也直接点名了这一条:负市盈率意味着亏损,永远要用 pe > 0 先滤一道。看着像个小小的工程细节,其实是「便宜」这个概念本身在数学上的漏洞——当分母可以是零或负数时,比值就不再是一把连续的尺子了。

市净率:分母是账面净资产,而账本正在跟不上现实

市净率(PB)= 市值 ÷ 净资产。净资产就是公司账上「全部家当减掉全部欠债」剩下的那部分,会计上叫股东权益。市净率的直觉是:这家公司清算掉,股东能分回多少,而你现在按几倍在买。

这把尺子曾经很硬气,因为过去大多数公司的价值确实躺在看得见的东西上——厂房、设备、土地、存货、库存的钢材。账本上记的那些数字,和公司真正的赚钱能力贴得比较近。

问题在于,会计准则对「什么算资产」的定义,和现代公司真正值钱的东西之间,裂开了一条越来越宽的缝。

一家软件公司最值钱的是它的代码、它的工程师、它的用户关系、它多年积累的品牌认知。这些东西在会计上大多不进资产负债表——研发投入和市场投入通常在发生的当期就作为费用扣掉了。于是出现一个非常反直觉的结构:

  • 一家公司在无形资产上投得越狠,当期费用越高,账面利润越低,净资产累积得越慢;
  • 净资产小,市净率就高;
  • 于是「低市净率」这把筛子,会系统性地把这类公司判为「贵」,把它们扔出候选池。

反过来,什么公司市净率天生就低?资产重、折旧多、需要不断投钱维护产能、回报率长期偏低的那些行业。低市净率筛出来的名单,往往不是「便宜的好公司」,而是**「资产重的行业」**——你以为你在选便宜,其实你在下一个巨大的行业赌注。

这就引出了价值因子在工程上一条几乎必做的处理:中性化,也就是在打分之前,把「这只票属于哪个行业」「这家公司多大」这些你并不想赌的暴露先剔掉,让剩下的分数只反映「在同行业同体量里,它相对便宜多少」。不做这一步,你的「价值策略」很可能只是一个伪装过的行业配置。这层机制单独讲在 中性化

股息率与市销率:另外两种妥协

股息率 = 每年分红 ÷ 市值,分母换成了「实际到你手里的现金」。它的优点是最难造假——分红是真金白银打出去的。缺点也很直接:分红可以说停就停,而且高股息率经常是股价跌出来的,不是分红涨出来的。当一家公司的股息率突然变得很扎眼,第一件该查的事是分子有没有变,还是只有分母在塌。

市销率(市值 ÷ 营业收入)把分母换成了收入。它最大的用处是对付「还没盈利」的公司——利润是负的,市盈率没法用,收入至少是正的。代价是它完全不管这门生意赚不赚钱:一家毛利极薄、靠贴钱做规模的公司,市销率可以很好看。

还有一族尺子会把公司的债务和现金也算进分子(企业价值类的倍数)。它想修的是这么个漏洞:两家公司市值一样,一家零负债,一家借了一屁股债,你把它们当成一样贵,显然不合理。

把这几把尺子放在一起,你会发现一件事:它们不是同一个东西的几种近似,它们是几个不同的东西。 有意思的是,它们全都可以看成同一个更根本问题的粗糙替身——这家公司未来能给股东产生多少现金,折回今天值多少钱。那套完整的算法叫现金流折现,讲在 DCF 现金流折现的数学。市盈率市净率这些倍数之所以流行,不是因为它们更准,而是因为它们只需要两个数字就能算,能在几千只股票上一次性算完。它们是为了可批量计算而做的妥协。

系统层:这些尺子在真实系统里长什么样

到这一步,你会开始好奇:一个真实的量化系统,是怎么把「便宜」这件事写进代码的。答案往往比想象中朴素,而朴素之处正好暴露了假设。

取倒数,而不是直接用比值

Vibe-Trading 的多因子模块在列出可用因子时,写的不是 PE 和 PB,而是:

pe_factor: 1/PE  (the larger, the cheaper)
pb_factor: 1/PB
roe_factor: ROE

为什么要倒过来写?两个原因,都很实在。

一是方向对齐。因子最终要做的是在同一个横截面上(也就是「同一天、所有股票」这一排数字里)打分排序,分高的买。市盈率是越小越便宜,方向和「分高的买」是反的;取倒数之后就顺了。这个模块的注意事项里也专门写了:不同因子方向不同,动量是正序、波动率是逆序,合成之前必须先把方向掰齐。

二是数值稳定。当一家公司利润趋近于零,市盈率会冲到几千几万,成为一个把整列数据的均值和标准差全部带偏的极端值。取倒数之后,这个爆炸点变成了平缓的趋零,整列数据老实多了。因子怎么打分、怎么合成,那套通用机制在 因子 那篇。

基本面数据必须按公告日贴,不能按报告期贴

这是价值因子和技术类因子最大的差别,也是最容易出事的地方。

价格数据是当天就存在的,而财报数据的「报告期」和「公布日」差着一两个月。你如果把三季度的净利润贴回九月三十号那一格,程序在九月三十号就用上了一个当时全市场都不知道的数字。

Vibe-Trading 处理这件事的办法是把合并规则写死在数据加载器里:财务报表的每一份快照,只在它的公告披露日之后才被合并进日线数据。它的注意事项里紧跟着一句警告——不要自己动手把报表数据往前填充,合并逻辑已经保证了时点可见性,你手动 fillna 就是在破坏它。

qlib 的做法更硬。它的时点数据库里,基本面字段必须经过一个专门的操作符才能取用,直接引用会被拦下来并给出提示:

Advices: you can't query PIT data directly(e.g. '$$roewa_q'),
you must use `P` operator to convert data to each day (e.g. 'P($$roewa_q)')

那个 P 干的事就是「把季度数据按公布日展开到每一天」——在新版本公布之前,每天查到的都还是旧版本的值。这套机制和它为什么非做不可,讲在 时点数据

顺带一提:财报数据不只有延迟,还会被修订。同一个报告期的同一个指标,先公布一版,过阵子改一版。市面上大多数数据库只留最新版。你今天下载的历史市盈率,分母是被后来所有修订擦洗过的干净版本,当年真正摆在投资者面前的是另一份。

缺失值:删掉它,就等于选择了一段历史

基本面字段天然会缺:新上市的公司没有足够长的报表历史,被特别处理的公司数据不全,个别字段某些季度就是没有。

代码里的处理通常只有一行——遇到缺值就跳过这只票:

if pd.isna(pe) or pd.isna(pb) or pd.isna(roe):
    continue

这一行完全合理,也几乎没有别的写法。但你要清楚它意味着什么:你的候选池被悄悄改成了「财务数据完整的那批公司」。在历史回看里,数据最不完整的往往正是后来出问题的那批。这一刀切下去,样本就朝好的方向偏了一点点,而且不会有任何报错。

还有个小到不像话、但真的会让整套结果作废的坑:同一个指标在不同数据源里单位不一样。上游文档明确记了一笔——净资产收益率在某些数据源里是百分数(15 表示 15%),在另一些里是小数(0.15 表示 15%)。你的筛选门槛写 8,前者能筛出一批公司,后者会把所有公司全筛掉,或者全放行。程序不会报错,你只会看到一条莫名其妙的曲线。

判断一把尺子还灵不灵

因子好不好用,量化系统里通常看它和「之后那段时间的涨跌」之间的相关程度,以及这个相关程度稳不稳定。Vibe-Trading 的因子研究模块给的解读标准里,有一行特别值得单独拎出来:相关系数如果高得反常,第一件事不是庆祝,是回去查有没有偷看未来。 这个思路的具体机制在 IC 与 IR 那篇。

🚧 避坑

「三重过滤都通过」不等于「这是好公司」。 市盈率低于某个数、市净率低于某个数、净资产收益率高于某个数——这套过滤在代码里只有几行,跑起来也很快,但它的每一个阈值都是人拍的,而且这三个数字都来自同一份可能已经过时一两个月的报表。它能做的事只有一件:把几千只票压缩成一份更短的名单。名单上的每一家,为什么便宜,它一个字都没说。

价值因子跑输的那些年,到底发生了什么

这是绕不过去的一段。过去十几年里,成熟市场上以低市净率为核心的经典价值因子,经历过一段长得离谱的相对跑输——长到足以让一整代人怀疑这套东西是不是根本就不成立了。具体是哪几年、幅度多大,公开研究里数字口径各不相同,本文不给数,但值得讲清楚的是几种互相不排斥的解释,因为它们指向完全不同的应对方式。

解释一:尺子坏了,不是道理坏了。 这就是前面说的会计缝隙——当公司的核心资产从厂房变成无形的东西,而会计准则仍把这类投入当期费用化,账面净资产就不再是「家当」的好代理变量了。按这个解释,「买便宜的」这条道理没错,错的是你还在用一把为重资产时代设计的尺子。相应的应对是换分母,或者调整会计口径把无形投入还原成资产。

解释二:赢家通吃改变了分布。 如果某些商业模式天然具备赢家越大越强的结构,那么「贵的公司继续贵,因为它真的越来越值钱」就不再是估值泡沫,而是基本面事实。价值因子隐含的假设是估值会向中枢回归,而这个假设在赢家通吃的结构里不成立。

解释三:拥挤。 一个被广泛验证、写进无数教科书、有大量产品追踪的因子,会有非常多的钱同时按同一个信号行动。信号本身的收益会被这些钱磨薄,而且一旦这批钱同时想撤,反向的踩踏会让跑输的那段格外难看。

解释四:定价环境。 一家公司的价值取决于未来现金流折回今天值多少,而折的那个比例和市场的资金成本相关。资金成本长期处于低位时,遥远未来的现金流在今天的折算值会更高,那些「利润在很远的将来」的公司相对更受益。这层机制在 DCF 现金流折现的数学 里能看清楚是怎么传导的。

这四种解释里,第一种和第三种是可以在系统里做点什么的(换分母、做中性化、看拥挤程度),第二种和第四种基本超出你的控制。真正危险的是把四种混成一句「价值失效了」或者「价值一定会回来」——两句话都不是判断,都是情绪。

一个更有用的态度是:任何因子都会有长到让你怀疑人生的跑输期,而在那段时间里,「它坏了」和「它只是还没轮到」这两种情况,在数据上长得一模一样。这不是靠更聪明的统计能分辨的事,只能靠你事先想清楚「我相信它的理由是什么,什么样的证据会推翻这个理由」。

失效边界与常见误用

把某一把尺子当成「便宜」本身。 市净率不是便宜,它是「按账面净资产算的便宜」。换一个分母,「便宜」这个词指的就是另一批公司。用哪把尺子,本质是你对价值来源的判断,不是技术选型。

只做筛选,不做中性化。 直接按低估值排序选股,你八成会得到一份行业高度集中的名单。你以为自己在做价值,实际上在赌某几个行业。

跨行业比倍数。 不同行业的资本结构、折旧强度、增长曲线完全不同,估值倍数天生不在一个量级上。跨行业比大小,比的是行业不是公司。

用最新数据回看历史。 财报有延迟、会修订,指数成分名单也会变。这三件事里任何一件没处理好,你算出来的历史「价值组合」都是一个当年不存在的组合。

指望它告诉你什么时候。 便宜不含时间信息。一样东西便宜,它可以继续便宜很多年,也可以在你放弃之后的第二个月开始重估。所有基于估值的方法都共享这个软肋,而它恰好是最消耗人的那种软肋。

小结

  • 「便宜」不是一个数,是一个比值;分歧全在分母上,选哪个分母就等于表态「我认为公司的价值来自什么」。
  • 市盈率的分母有周期、含一次性损益、口径多,而且亏损时会翻成负数把排序搞坏——所以系统里几乎都要先滤掉非正值。
  • 市净率的分母是账面净资产,它在无形资产密集的公司身上系统性失灵:投得越多,账面越小,越被判为「贵」;低市净率名单往往等于「重资产行业」名单。
  • 工程上真正决定成败的是几个不起眼的细节:财报按公告日贴而不是按报告期贴、缺失值一删就悄悄改变了样本、同一个指标在不同数据源里单位可能不同。
  • 价值因子的长期跑输至少有四种解释(尺子过时、赢家通吃、拥挤、定价环境),只有前两类里的一部分是你能动手处理的;把它们混成一句口号,就等于放弃了判断。

一句话记住这篇:说一样东西便宜之前,先说清楚你拿它跟什么在比——比的东西变了,便宜的那批公司就全换了。

本文所引源码与文档均来自上述快照版本,是阅读代码得出的机制说明,不是运行结果;具体行为请以你手上那个版本为准。回 量化与 AI 投研概念库 看其它概念各自在说什么;本站内容为投资教育,不构成任何投资建议,边界见 免责声明

内容有错、看不懂、或想看下一篇?告诉我们 →

本文为投资教育整理,不构成任何投资建议;不荐个股/基金、不预测点位、不承诺收益。关键数据与结论请结合权威来源自行验证,并见风险免责声明