量化价值投资:格雷厄姆估值模型的现代应用
量化价值投资:格雷厄姆估值模型的现代应用
关键词:量化价值投资、格雷厄姆估值模型、安全边际、基本面分析、量化策略、Python实现、价值投资经典模型
摘要:带您跨越时空,在本杰明·格雷厄姆的经典著作《证券分析》中开启对"华尔街教父"经典估值模型的深入解析之旅。我们将以生活故事诠释复杂的金融概念,并深入解析其内在逻辑机制——安全边际理论、价值计算方法及选股标准。通过Python代码的成功转化,则将这些80年前的投资智慧成功转化为现代量化策略。无论是投资新手还是编程专家,在阅读本文后都能掌握:用数据与代码使传统价值投资在AI时代焕发生机;在市场波动中识别优质标的;以及利用量化方法克服人性 greed 与 fear 的困扰。
背景介绍
目的和范围
在这个信息时代与人工智能主导的时代,在这个背景下,在这个背景下,在这个背景下,在这个背景下,在这个背景下,在这个背景下
我们会覆盖三个核心问题:
- 格雷厄姆具体阐述了哪些内容(经典理论拆解)?
- 如何通过编码将他的理论具体化为实践(量化落地)?
- 在2024年时其理论是否仍然适用(现代应用验证)?
在范围内,在格雷厄姆的投资体系中,“烟蒂股”选股策略(适用于极端低估的情形)以及其提出的“防御型投资者”的选股标准(适用于稳健投资的情形)是最为关键的核心模型。这些模型不会涉及复杂的金融衍生工具或高频交易策略;我们专注于那些普通投资者能够理解的基本面分析方法。
预期读者
本文像一把"双向翻译器":
- 如果你是刚接触投资的人, 能用生活实例理解价值投资的本质, 避开发育中的错误;
- 如果你是金融从业者中的技术派, 学会利用Python分析财务数据, 构建量化模型, 将投资思路转化为可测试的代码逻辑;
- 如果你是资深投资者, 能识别传统理论与现代技术融合的优势点, 通过数据消除主观判断的影响。
无需具备复杂金融相关知识或编程技能——我们将从介绍什么是市盈率开始……全程手把手教学。
文档结构概述
本文就像一次"价值投资寻宝之旅",我们会分六站前进:
- 概念解密空间:通过故事阐述格雷厄姆的核心理念(如安全垫与内在价值);
- 理论拆解空间:深入解析两个经典估值模型的数学本质;
- 代码实践空间:分步骤实践Python量化模型开发流程(从数据采集到策略部署);
- 实战验证空间:评估策略在A股及美股市场的表现轨迹;
- 工具装备库:分享实用的量化工具与数据资源;
- 未来展望区:探讨人工智能时代下的价值投资新探索。
每个阶段都包含三个核心要素:一是针对"小学生能懂的例子";二是深入解析其"专业的理论基础";三是给出具体的"可操作的实施方法"。通过这一系列内容的学习与实践,确保学习者能够做到既听得了明白的内容又学得了扎实的知识,并且能够灵活运用所学知识。
术语表
核心术语定义
- 价值投资:以低于其内在价值的价格买入,并在市场重新评估其价值时卖出(类似于以低于品牌包折扣价格购买名牌包)。
- 格雷厄姆估值模型:本杰明·格雷厄姆提出的一种基于计算公司内在价值的方法(即所谓的"安全边际"理论)。
- 安全边际:也被称为余旋空间,在此期间投资者能够容忍的投资价格波动范围(即你认为某公司的实际价值为100元时市场价格仅为60元,则有40元的安全回旋空间)。即使你的分析出现偏差,在这种情况下也难以造成亏损。
- 内在价值:公司真正具有的市场评价(如同苹果的实际甜度),而股价则是由市场给出的价格标签(可能高于或低于实际值)。
- 量化投资:利用数学公式和代码来进行投资决策(类似于使用体重秤来衡量身体是否超重而不是目测法),更加客观和高效。
相关概念解释
- 市盈率(PE):股价除以每股收益等于回收本金所需的时间。例如,在PE=10的情况下,则表示预计需要10年才能收回投资本金。
- 市净率(PB):股价除以每股净资产等于投入资金购买公司账面上的价值。例如,在PB=0.8的情况下,则表示投入8元可购买价值1元的资产。
- 股息率:每年分红除以股价等于投资收益的比例。例如,在股息率为5%时,则表示投资者的投资收益占本金的5%。
- 回测:利用历史数据模仿策略在过去的表现效果如何就像借鉴游戏存档来测试新的策略效果一样
缩略词列表
- PE: P/E比率(P/E比值)
- PB: P/B比率(P/B比值)
- EPS: EPS值
- ROE: ROE数值
- A股: 内地股市
- 美股: 美国股市
核心概念与联系
故事引入:小明的"菜市场投资学"
小明第一次陪妈妈去菜市场,就发现了一个"投资规律":
- 妈妈通常会在下午五点之后采购蔬菜——此时菜贩因为即将收摊而降价出售("低估");
- 但是妈妈从不购买已经变质的蔬菜("安全边际")——即便如此降价购买的也是变质蔬菜;
- 她通常会对至少三家不同的供应商进行价格比较分析("基本面分析"),以确保选择新鲜度较高的蔬菜而非单纯关注价格因素。
回家后小明突然顿悟:这不就是格雷厄姆的价值投资吗?!
格雷厄姆于1934年撰写《证券分析》之际恰逢1929年大萧条的影响——当时股市如同一场"大规模抛售"的大 cleared market。许多优质企业此时的股价低于账面资产水平(类似于新鲜蔬菜以低于成本价格被处理)。他的核心理念非常直接:避免追逐正在上涨的投资标的,在市场无人问津时寻找那些基本面良好但当前价格较为低廉的对象。
但问题来了:如何评估"核心价值"?如何确定其合理估值?当年格雷厄姆仅凭手工计算财务报表……如今借助Python与大数据分析……这正是量化价值投资的核心任务。
核心概念解释(像给小学生讲故事一样)
核心概念一:安全边际——投资的"防弹衣"
设想你站在十楼的边缘(无需顾虑)。这个比喻非常贴切。
安全储备相当于你的缓冲层——若气垫越厚,则安全储备越高。
即便判断失误,则坠落风险也会降至最低。
格雷厄姆亲历了1929年的股市大萧条,并观察到许多人在看到"股票会上涨"后就全部投入其中,在最终却血本无归。他说:"投资的核心不在于预测收益如何多,而在于首先保证本金的安全 。"
举个例子:
你通过深入研究认为公司A具有内在价值属性;
目前市场报价仅为50元人民币,在这种情况下,
安全边际计算公式可表示为(100-50)/100=50%,
这等同于以气垫支撑的地面厚度约为5米;
若市场报价提升至90元人民币,
则安全边际缩减至(100-90)/10=1/9≈11.1%,
这类似于仅提供约相当于气垫厚度约一米的支持;
一旦出现计算偏差(例如误将公司内在价值估为8万元人民币),
这种差距可能导致严重后果。
生活类比:在购买手机时你会明白,在预算3000元的情况下你绝不会选择仅花2999元购买——通常会预留几百元左右的额外资金作为‘缓冲’资金以防出现任何意外情况需要更换设备这正是生活中所说的‘安全边际’
核心概念二:内在价值——给公司"称重"
内在价值类似于评估大象的体重:无法将大象放置于秤上以直接测量其重量;然而可以通过观察其脚印大小和身体长度等数据来估算其体重
格雷厄姆表示, 公司的内在价值无法直接量化, 但可以通过财务报表中的各项指标(如资产总额、净利润及派息金额等)来进行评估。他的主要衡量工具包括
资产法 类似于计算公司资产的过程——具体来说就是考虑公司在扣除负债后的现金储备、厂房设备等固定资产的价值是多少(这里就得到了市净率PB指标的计算依据)。这类指标主要用于评估企业资产价值与股东权益之间的关系。
在生活类比中, 假设你的住宅价值5, 万元人民币, 其中你提供了2, 万元人民币作为抵押贷款, 则"家庭净资产"即为3, 万元人民币. 在财务上这类似于公司的"账面净资产".
评估盈利的能力:类似地,在评估公司的盈利能力时, 计算企业每年能够稳定的实现多少利润, 并将其与投资理财的方式进行比较分析, 其现值相当于市盈率PE指标所反映的内容.
一家奶茶店每年净赚十万元
核心概念三:格雷厄姆选股标准——“菜市场挑菜指南”
格雷厄姆不仅向我们传授了"要找便宜货"的方法,并列举了具体的"选股标准"。如同家庭主妇在采购蔬菜时会考察的新鲜度、价格以及产地这三个方面,在他的投资选择中同样扮演着重要角色
- 低PE:回本周期短(如PE值低于15);
- 低PB:资产购买价格低廉(如PB值低于1.5);
- 高股息率:即使股价持平或小幅波动,则分红收益显著高于市场平均回报率(如股息率超过4%);
- 盈利稳定:公司至少连续十年实现盈利以维持持续发展(避免‘烂菜叶’现象);
- 负债少:公司负债不得超过其总资产的50%以降低财务风险。
这些标准在1930年代表现出显著效果,在当时由于市场动荡频繁以及许多优秀企业因市价低于内在价值而受到压倒性打击的机会较多。如今尽管市场环境更加稳定和完善了筛选机制但这些标准仍然是量化价值投资的关键基础
核心概念之间的关系(用小学生能理解的比喻)
如果把价值投资比作做蛋糕 ,那:
- 内在价值概念 是烘焙过程中的关键要素——它通过具体指标量化展示了所需的主要资源(资产)、核心利益所在(利润)以及长期回报机制(分红);
- 安全边际理论 则强调了在资源管理上的预留空间——即便出现资源偏差分配(水量超出预期),也能确保最终产品的质量不会受到影响;
- 投资筛选标准 实际上是构建筛选基准体系——投资者必须选择具有优质蛋白质来源(盈利稳定)、健康财务状况(低负债)的投资标的,并避免选择已过时原材料来源的产品线。
它们的合作流程是:
首先查看构成投资组合的关键材料清单(选股标准),并剔除不符合条件的原材料(垃圾股)。然后按照制定的投资策略计算出预期的投资回报率(内在价值)。最后比较当前市场价格与预期价格水平之间的差异是否显著,并根据这一结果决定进行投资操作。
核心概念原理和架构的文本示意图(专业定义)
格雷厄姆估值模型的核心架构可以总结为"筛选-估值-决策 "三步循环:
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 第一步:筛选 │────>│ 第二步:估值 │────>│ 第三步:决策 │
│ (选股标准过滤) │ │ (计算内在价值) │ │ (安全边际判断) │
└─────────────────┘ └─────────────────┘ └────────┬────────┘
│
▼
┌─────────────────────┐
│ 持仓监控与调整 │
│ (定期重新筛选估值) │
└─────────┬───────────┘
│
▼
┌─────────────────────┐
│ 重复循环流程 │
└─────────────────────┘

- 筛选层:基于PE、PB以及股息率等硬性指标对股票进行筛选工作后会剔除约90%,最终筛选出"潜在便宜货"类别的标的;
- 估值层:运用资产法或盈利法对初步筛选出来的标的进行价值评估;
- 决策层:只有当市场价低于内在价值乘以(1减去安全边际比率)时才会买入;
- 监控层:每隔一段时间就会重新审视并计算内在价值及安全边际值,在该比率达不到要求时会采取相应的处理措施。
Mermaid 流程图:格雷厄姆量化策略流程
是
否
是
否
确定选股指标
获取股票财务数据
计算PE PB 股息率等指标
应用筛选条件 保留符合标准的股票
计算内在价值 如资产法或盈利法
计算安全边际 内在价值-市场价/内在价值
安全边际是否>30%
买入股票 构建组合
放弃该股票
定期监控 每季度重新估值
股票是否仍符合条件
继续持有
卖出股票
核心算法原理 & 具体操作步骤
格雷厄姆经典估值模型的数学原理
格雷厄姆在其著作中曾提出多种估值计算方法,在其多部经典著作中涉及多个不同的定价模型。本文重点介绍其中两种最具代表性的模型:一种旨在为防御性投资者提供简便估值工具的方法;另一种则是专门针对那些寻求以合理价格获取优质资产的小散股投资者而设计的独特方案。
1. 防御型投资者估值公式(盈利法)
这个公式用于估算"稳定盈利公司"的内在价值,像给"现金奶牛"定价:
V=EPS×(8.5+2g) V = EPS \times (8.5 + 2g)
其中:
- ( V ):内值指标(每股市值);
- ( EPS ):净收益除以总股本(即每股市益率);
- ( g ):未来7至10年间的预期年增长率(%)。
公式解读 :
- "8.5被视为格雷厄姆所依据的假设下零增长公司的合理市盈率;
- “2g”代表了每增1个百分点会使市盈率提高一倍。
安全边际调整 :实际买入价应低于 ( V \times 0.7 )(即留出30%的安全边际)。
2. 烟蒂股模型(资产法)
该模型被设计用于识别"股价低于净资产"的极度低估股票。它的工作原理类似于拾取废品的过程——即便只剩下一点资源可用,在这种情况下依然能带来一定的收益。
筛选条件:
- 股价 < 每股净流动资产(NCAV);
- 其中,每股净流动资产 =(流动资产 - 总负债)÷ 总股本。
原理:流动资产包括现金、存货以及应收账款,这些资产具有立即变现能力。如果股价未能覆盖这些流动资产的价值,则这将等同于以低于市场价值收购公司的全部股东权益(包括厂房设备等实物资产),公司的安全边际度显著。
现代量化实现的操作步骤
将格雷厄姆模型转换为代码包含四步骤:数据获取、指标计算、筛选估值、策略输出。我们采用Python编程,并确保代码全程开源,并支持复现。
步骤1:明确量化目标
我们要构建一个"格雷厄姆防御型选股策略",目标是:
- 在每个月的第一个交易日后进行仓位调整;
- 筛选出PE值低于15且PB值低于1.5,并且同时满足股息率超过3%以及过去五年持续盈利的企业;
- 运用盈利法为筛选出的每只股票计算其内在价值,并仅选择安全边际超过30%的投资标的;
- 等权重投资组合策略(每只股票投入的资金量相同)。
步骤2:核心算法伪代码
# 伪代码:格雷厄姆量化策略
def graham_strategy():
# 1. 获取股票池数据(A股所有股票的财务数据)
data = get_financial_data(stock_pool="A股全市场")
# 2. 初步筛选(应用格雷厄姆选股标准)
filtered = data[
(data.PE < 15) & # PE<15
(data.PB < 1.5) & # PB<1.5
(data.dividend_rate > 3) & # 股息率>3%
(data.roe_5years > 0) # 连续5年ROE>0(盈利稳定)
]
# 3. 计算内在价值(盈利法公式)
filtered["growth_rate"] = calculate_5year_growth(filtered.EPS) # 计算5年EPS增长率
filtered["intrinsic_value"] = filtered.EPS * (8.5 + 2 * filtered.growth_rate)
# 4. 计算安全边际,保留安全边际>30%的股票
filtered["safety_margin"] = (filtered.intrinsic_value - filtered.price) / filtered.intrinsic_value
portfolio = filtered[filtered.safety_margin > 0.3].sort_values("safety_margin", ascending=False)
# 5. 输出最终持仓(取前20只股票,等权重)
return portfolio.head(20)[["code", "name", "price", "intrinsic_value", "safety_margin"]]
python

步骤3:关键指标计算详解
- 5年EPS增长率(g) :基于过去5年的EPS数据建立线性回归模型,回归模型的斜率即代表年均增长率。
例如:某公司的EPS变化情况如下:
- 第一年末:1元
- 第二年末:1.2元
- 第三年末:1.5元
- 第四年末:1.8元
- 第五年末:2.2元
累计增长约120%,平均年增长率约为17%。
- 安全比率 是衡量股票投资吸引力的重要指标;计算公式为(股票内在价值 - 当前股价)除以股票内在价值;当该比率超过30%时,则被认为是值得买入的。
- 均值投资策略 指将等量的资金分配给每只投资标的;此方法旨在分散投资风险。
数学模型和公式 & 详细讲解 & 举例说明
防御型估值公式的数学细节与例子
公式回顾:
V=EPS×(8.5+2g) V = EPS \times (8.5 + 2g)
参数选择逻辑:
- 为何将市盈率倍数定为8.5? 格雷厄姆时代的长期国债利率约为4.5%,其倒数约为22(即1/4.5%≈0.0001/ (年利率))。然而,在考虑到股票投资的风险较高这一前提下(折算后),这一数值被调整至约8.5。
- 为何将增长系数设定为2g? 实证分析表明,在1%的增长情况下(基于历史数据统计结果),市场通常会对市盈率给予额外的两倍溢价。
举例:用贵州茅台(2023年数据)验证
假设我们在2023年10月分析茅台:
以 EPS(截至 2022 年末)计算得出的最新财报显示,
过去五年间 EPS 增长显著,
从每股市盈率为 46 元增长至当前水平,
年均复合增长率约为 9%,显著高于行业平均水平。
根据以下公式计算得出:
V = (市盈率 × (市净率 + 倍现金流量比率 )) ≈ 某一数值。
截至本报告发布之日,
该股票当前市场价格约为某值。
基于上述计算结果,
该股票的安全边际比例约为某百分比,
已达到行业标准但略低于格雷厄姆的安全边际线,
因此不符合买入条件。
总结:茅台尽管品质优良,在2023年其安全边际显得较为薄弱,并未达到买入标准——这也正是量化策略所遵循的核心原则之一,在此情况下我们应当避免因个人偏好而做出冲动的投资行为
烟蒂股模型的计算与例子
净流动资产(NCAV)公式:
NCAV=流动资产−总负债总股本 NCAV = \frac{流动资产 - 总负债}{总股本}
筛选逻辑:
股价 < NCAV → 意味着"公司通过将所有流动资产变现来覆盖负债和股价"”,从另一个角度来看待这个问题的话,在这种情况下固定资产的价值实际上等于零。
举例:某制造业公司(虚构数据)
- 流动资产:现金为5亿元 + 存货为3亿元 + 应收账款为2亿元 = 总计金额为10亿元;
- 总负债:银行贷款及应付账款共计6亿元;
- 股份总额:股份总额为2亿股;
- 每股净资产价值(NCAV)= (流动资产总计 - 总负债) / 股份总额 = (10亿元 -6亿元) / 2亿股 = 每股净资产价值为2元;
- 当前股价目前处于1.5元/股水平;由于该水平低于每股净资产价值的2元,则判断其属于烟蒂股类别。
风险提示:通常情况下,“困境反转”的机会主要集中在"烟蒂股"身上。投资者在考虑投资时需谨慎评估公司的财务状况,并关注其是否具备持续盈利的能力。具体而言,在公司面临短期亏损的情况下, 若其拥有充足的现金流, 则具有一定的投资价值; 反之, 则可能成为"价值陷阱"的风险.
安全边际的数学本质与风险控制
The safety margin is equal to the difference between intrinsic value and market price.
它本质上是**“错误容忍度”**的量化指标:
- 安全边际30% → 即使你的内在价值算高了30%(比如实际值70元,你算成100元),买入价(70元)也不会亏损;
- 安全边际0% → 只要内在价值算错1分钱,就可能亏损;
- 安全边际为负 → 市场价已高于内在价值,属于"追高"。
生活类比
项目实战:代码实际案例和详细解释说明
开发环境搭建
我们需要以下工具:
- Python 3.8及以上版本被视为基础编程语言的基础工具;
- 数据来源模块中包含两种主要工具:yfinance模块专为美国股票市场设计, 能够高效提取历史股价数据; 而tushare模块则专注于中国大陆股市的A股市场数据接口, 在使用时需先完成账户注册并获取相应的访问令牌;
- 数据分析与操作的核心模块由pandas和numpy两个模块组成;
- 数据可视化主要依赖于matplotlib和seaborn两个模块, 其中matplotlib是一个功能强大的通用绘图接口, 而seaborn则提供了更为美观且功能丰富的图形展示接口, 在绘制策略收益曲线等复杂图表时尤为实用.
环境安装命令:
pip install pandas numpy yfinance tushare matplotlib
bash
Tushare注册(A股数据):
- 请前往https://tushare.pro进行账户注册。
- 请至‘个人中心’获取token;其中,请注意您需完成实名认证才能获得高级数据权限。
源代码详细实现和代码解读
举例来说,在介绍具体的实现过程时
代码1:导入库和初始化
import pandas as pd
import numpy as np
import tushare as ts
from datetime import datetime, timedelta
# 初始化tushare(替换为你的token)
ts.set_token("你的tushare token")
pro = ts.pro_api()
# 设置显示格式(避免科学计数法)
pd.set_option("display.float_format", lambda x: "%.2f" % x)
python

代码2:获取A股财务数据
为了收集全部A股的PE、PB、股息率及EPS等数据(使用tushare提供的fina_indicator接口)。
def get_a_stock_data():
"""获取A股所有股票的财务指标数据"""
# 获取所有A股代码(沪深京市场)
stock_basic = pro.stock_basic(exchange="", list_status="L", fields="ts_code,name")
codes = stock_basic["ts_code"].tolist()
print(f"共{len(codes)}只A股股票")
# 分批获取财务数据(tushare有接口限制,每次最多500只)
all_data = []
batch_size = 500
for i in range(0, len(codes), batch_size):
batch_codes = codes[i:i+batch_size]
# 获取最新财务指标(PE、PB、股息率等)
fina_indicator = pro.fina_indicator(
ts_code=",".join(batch_codes),
fields="ts_code,pe,pb,dividend_rate,eps,roe"
)
all_data.append(fina_indicator)
print(f"已获取{i+batch_size}只股票数据")
# 合并数据并去重
df = pd.concat(all_data).drop_duplicates("ts_code")
# 合并股票名称
df = df.merge(stock_basic, on="ts_code", how="left")
return df
# 执行获取数据
df = get_a_stock_data()
print("原始数据样例:\n", df.head())
python

代码3:数据清洗和指标计算
原始数据可能存在缺失值(例如新股的市盈率PE可能缺失),因此需要进行预处理;此外还需要评估企业过去五年连续经营中的盈利能力(ROE指标),以反映企业的盈利能力和财务健康状况。
def clean_and_calculate(df):
"""数据清洗+计算衍生指标"""
# 1. 剔除无效数据(PE/PB为负或缺失的,通常是亏损公司)
df = df[
(df.pe > 0) & # PE>0(盈利)
(df.pb > 0) & # PB>0
(df.dividend_rate >= 0) & # 股息率非负
(df.eps > 0) # EPS>0
].copy()
# 2. 计算5年平均ROE(需额外获取历史ROE数据,这里简化为最近1期ROE>10%)
# 注:完整实现需用pro.fina_indicator(ts_code=code, period="annually")获取多年数据
df = df[df.roe > 10] # 简化:只保留ROE>10%的公司(盈利质量较高)
# 3. 获取当前股价(从daily接口获取最新收盘价)
def get_latest_price(ts_code):
try:
# 获取最近1个交易日的收盘价
daily = pro.daily(ts_code=ts_code, end_date=datetime.now().strftime("%Y%m%d"), limit=1)
return daily["close"].values[0] if not daily.empty else np.nan
except:
return np.nan
# 对每个股票获取最新价(耗时较长,可优化为批量获取)
df["price"] = df["ts_code"].apply(get_latest_price)
df = df.dropna(subset=["price"]) # 剔除无价格数据的股票
return df
# 执行数据清洗
clean_df = clean_and_calculate(df)
print("清洗后数据样例:\n", clean_df[["ts_code", "name", "pe", "pb", "dividend_rate", "price"]].head())
python

代码4:应用格雷厄姆筛选条件
def graham_filter(clean_df):
"""应用格雷厄姆防御型投资者筛选标准"""
# 筛选条件:PE<15, PB<1.5, 股息率>3%
filtered = clean_df[
(clean_df.pe < 15) &
(clean_df.pb < 1.5) &
(clean_df.dividend_rate > 3)
].copy()
# 计算内在价值(简化版:假设增长率g=5%,实际应计算历史增长率)
# 注:完整实现需用过去5年EPS计算g,这里为简化设为5%
g = 5 # 假设年均增长率5%
filtered["intrinsic_value"] = filtered["eps"] * (8.5 + 2 * g)
# 计算安全边际
filtered["safety_margin"] = (filtered["intrinsic_value"] - filtered["price"]) / filtered["intrinsic_value"]
# 只保留安全边际>30%的股票
portfolio = filtered[filtered["safety_margin"] > 0.3].sort_values("safety_margin", ascending=False)
return portfolio
# 执行筛选
portfolio = graham_filter(clean_df)
print("最终选股结果:\n", portfolio[["ts_code", "name", "pe", "pb", "dividend_rate", "price", "intrinsic_value", "safety_margin"]])
python

代码5:策略输出和可视化(可选)
# 保存结果到Excel
portfolio.to_excel("graham_portfolio.xlsx", index=False)
print("选股结果已保存到graham_portfolio.xlsx")
# 简单可视化安全边际分布
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 6))
plt.hist(portfolio["safety_margin"], bins=10, color="green", alpha=0.7)
plt.axvline(x=0.3, color="red", linestyle="--", label="安全边际阈值(30%)")
plt.title("格雷厄姆策略选股安全边际分布")
plt.xlabel("安全边际")
plt.ylabel("股票数量")
plt.legend()
plt.show()
python

代码解读与分析
关键代码说明:
- 数据获取 :用tushare的
stock_basic获取全市场股票,fina_indicator获取财务指标,daily获取最新股价——解决了"去哪里找数据"的问题; - 数据清洗 :剔除PE/PB为负的公司(亏损),保留ROE>10%的(盈利质量)——避免"价值陷阱";
- 筛选条件 :严格按格雷厄姆标准过滤,PE<15、PB<1.5、股息率>3%——这是"经典配方";
- 内在价值计算 :简化版假设增长率g=5%(实际应用中,应通过过去5年EPS数据计算真实g,代码中已提示优化方向);
- 安全边际过滤 :只买安全边际>30%的股票——这是"风险控制的最后一道防线"。
结果预期:
在A股市场上常见地筛选出10至30只符合条件的股票(受估值水平影响,在熊市中较多,在牛市中较少),其安全边际通常在30%至50%之间。
实际应用场景
场景1:个人投资者的"傻瓜式"选股工具
小王是上班族,没时间每天看盘,但想做价值投资。他可以:
每隔一个月运行本文介绍的技术框架;
按照等比例投资于这些股票(例如选择20只股票,并为每一只分配5%的资金头寸);
定期进行季度调仓,在舍弃不再符合筛选标准的股票的同时买入符合筛选条件的新股票。
优点
场景2:机构投资者的"打底仓"策略
该基金公司的量化团队将格雷厄姆模型视为一种"价值因子"纳入其多因子模型体系中:
- 依据格雷厄姆标准选出价值 stocks 池;
- 进一步考虑动量因子指标(最近上涨幅度大的)与质量因子指标(ROE高的),优化组合结果;
- 最终采用机器学习模型预测未来收益水平,并构建稳健投资组合。
案例 :伯克希尔·哈撒韦前期(巴菲特受格雷厄姆影响阶段)就是采用烟蒂股策略进行投资,在后来逐步融入芒格所倡导的优质公司核心理念。
场景3:不同市场的适应性调整
格雷厄姆模型在不同市场需要"因地制宜":
- A股:由于散户数量较多且市场波动较为剧烈,在整体估值水平偏低的背景下(其中PE/PB比值较低的股票数量较多),投资者可将安全边际阈值设定为25%,建议略微低于30%。
- 美股:机构数量较多且具有较强的判断力与执行力,在投资效果上表现更为稳定的情况下(其中具有较高自由现金流指标的股票可提升PE上限至18倍),建议重点关注具备更强抗虚假业绩增长能力的投资标的。
- 港股:整体估值水平偏低需要特别留意汇率变动带来的风险以及流动性状况(其中个别低PB比值的股票交易稀少难以进行买卖操作),投资者需特别关注这些特殊情况。
真实案例:2008年金融危机中的应用
自20O8年美国股市大幅下挫后, 不少银行股的市净率低于一半(例如花旗集团的市净率降至15%以下), 这一特征符合格雷厄姆先生所提出的 Grahamund 标准。这些投资者在随后两年多的时间里实现了超预期回报——这正印证了 '市场恐慌时, 安全边际最大'这一理论。
工具和资源推荐
数据来源
-
零费用 / 低投入:
-
Tushare(A股股票市场中一个知名的数据源平台;访问地址为 https://tushare.pro ;需完成实名认证流程;其基础数据均为免费提供);
-
Yahoo Finance(美股主要金融市场资讯平台;支持通过 yfinance 库直接调用 API接口获取数据;访问地址为 https://finance.yahoo.com );
-
理杏仁(一个基于中国市场的第三方数据分析平台;访问地址为 https://www.lixinger.com ;该平台不仅提供丰富的财务数据分析与可视化展示功能;而且部分功能仅对付费用户开放);
-
专业订阅服务 :
-
Wind(万得金融平台:国内领先的金融信息平台,默认选择;年费偏高);
-
Bloomberg(彭博国际:全球知名的金融数据分析提供商;提供专业的投资分析服务)。
量化平台
- 本地量化回测:基于Python的Backtrader框架(一个开源的回测框架);
-
线上平台:
- 聚宽(JoinQuant:https://www.joinquant.com/ ,A股量化交易 ,支持Python开发);
- QuantConnect(https://www.quantconnect.com/ ,美国及全球市场 ,开放源代码社区活跃);
-
可视化工具 :Tableau(财务数据可视化)、Power BI(适合非程序员)。
-
学习资源
-
书籍:
- 《证券分析》(格雷厄姆,《价值投资圣经》);
- 《聪明的投资者》(格雷厄姆,《入门读物》);
- 《量化价值投资》(Wesley Gray,《现代量化视角解读价值投资》)
-
课程:
-
COURSERA《Quantitative Finance Specialization》(Yale University, Free Access);
-
Digger Quant《Introduction to Practical Python Quantitative Analysis》(适合零基础)。
-
社区 :
-
集思录(https://www.jisilu.cn/ 是一个低风险投资平台,在这里投资者会定期讨论价值股;该网站还提供丰富的教育资源以帮助新手掌握基础的投资技巧);
-
Reddit r/ValueInvesting(这是一个 subreddit 聚焦于分享深入分析和策略的在线网络,在此平台上投资者可以参与每日讨论并获取最新的市场动态分析)。
未来发展趋势与挑战
趋势1:AI+价值投资——让"称重"更精准
传统格雷厄姆模型依赖人工选择指标(PE、PB等),未来可通过AI优化:
- 自动化特征工程体系:通过机器学习算法,在财务报表数据的大量指标中识别出超越传统PE/PB比率的有效"价值型因子";
- 动态安全边际机制:运用LSTM神经网络模型对市场情绪进行预测,在市场恐慌时段将安全边际阈值设置为多 Buy水平,在市场贪婪时段则适当调降至较少 Buy标准;
- 智能风险预警系统:借助自然语言处理技术对财报文本进行深度分析与挖掘,在捕捉管理层潜在操作风险方面展现出显著优势(例如公司管理层频繁使用"可能""预计"等模糊表述暗示潜在经营问题)。
趋势2:ESG因子融入——不只看"便宜",还看"善良"
现代投资者日益重视公司的社会责任(即环境、社会与治理),在未来的格雷厄姆模型中应纳入ESG筛选标准。
- 排除环境污染严重且工人权益受到侵害的公司(即便价格低廉);
- 优先选择低估值但ESG评分高的公司(长期更具稳定性)。
挑战1:市场有效性提高——"烟蒂"越来越少
随着量化策略的推广应用,在金融市场中捕捉低PE/PB股票的套利机会进而使得市场中这类标的的数量逐渐减少。
- 解决方案:转向"深度价值"——放弃表层PE/PB指标,在更深层次挖掘隐藏资产的价值(包括专利权与品牌无形资产)。
这不仅关注显性财务数据的表面现象。 - 案例:对于巴菲特而言,在投资比亚迪时,并非仅凭财务数据判断;而是特别关注其在电动汽车领域的技术研发储备(潜在无形资产)。这种方法体现了对深层资源的关注。
挑战2:黑天鹅事件——安全边际也可能失效
在历史上著名的如雷曼兄弟崩溃与新冠疫情导致的市场剧烈下跌等"黑天鹅事件"发生时,在这些情况下
- 解决方案:元宇宙投资组合——避免过度集中配置风险
- 每季度对投资组合进行动态调整,并淘汰表现不佳的个股以维持稳定收益;
- 心理建设:重视安全边际作为长期稳健的基础保障
- 了解市场短期波动属正常现象
- 切勿因市场下跌而盲目抛售
总结:学到了什么?
核心概念回顾
- 价值型投资策略:选择"价格低于内在价值"的资产类别,在市场低迷时如同以折扣购买高质产品;
- 安全垫:在市场波动中提供保护的投资方式,在两种数值差异扩大时降低潜在风险;
- 格雷厄姆估值模型:通过市盈率(PE)、市净率(PB)及股息收益率等指标分析筛选出潜在低估股票,并采用资产法或盈利法计算其内在价值;
- 量化投资实践:利用Python编程将筛选标准转化为程序代码,在系统性分析中精准识别符合条件的投资标的。
概念关系回顾
- 安全边界是价值投资的关键屏障,价值基准是判断股票内在价值的重要尺度,在选股时所依据的标准则是用来筛癣过滤股票的一种重要方法——这三者缺一不可;
- 数据驱动的方法使传统价值投资从定性转向定量分析——借助数据消除主观偏差,在代码中实现操作的规范化。
关键收获
- 投资非投机行为:格雷厄姆指出, 投资的本质是基于数据的理性决策, 并非预测股价涨跌;
2. 简洁实用:80年前提出的模型至今仍具价值应用性, 在多数情况下经典策略优于复杂策略;
3. 易于复制实现:具备基本Python技能者即可运行本文策略并踏上个人价值投资之旅。
思考题:动动小脑筋
思考题一:如何调整格雷厄姆模型适应高增长行业(如科技股)?
提示:基于格雷厄姆模型的假设,在科技股中(特别是AI与新能源行业),其年均成长率可能达到或超过10%,对应的市盈率也可能显著提升。你认为应该如何调整这一计算模型?例如是否可以用PEG比率替代传统的PE比率?
思考题二:如果所有投资者都用格雷厄姆模型,会发生什么?
在所有投资者纷纷 pursuit of 低PE/PB stock 的情况下,在这种普遍现象下,其价格将被抬高直至安全边际消失。这是否预示着价值投资策略的有效性将受到质疑?(参考'有效市场假说'与'行为金融学'的争论)
思考题三:用本文的代码选出来的股票,你会直接买入吗?
提示信息:代码标识为工具而非直接提供解答。在进行实际投资之前,请问您还需要完成哪些准备工作?(如需进一步了解,请先分析公司的行业前景、管理层能力以及是否存在财务造假风险等问题)
附录:常见问题与解答
Q1:格雷厄姆模型在牛市中表现会很差吗?
A:听起来不错,在大部分牛熊市中的股票动量指标普遍偏高,满足条件的投资标的数量相对有限,并且该投资策略在市场整体表现上可能出现短期落后的情况。然而这恰恰是模型的核心优势——在牛市期间采取较为克制的投资态度,在熊市期间则采取积极布局的态度,并且能够有效避免在价格高位处进行过度投资。长期运行下来(以10年以上的跨度来看),通过持有更多优质资产,在市场低迷时逐步积累收益,在市场繁荣时则能有效规避较高的投资风险
Q2:为什么代码中用简化的增长率g=5%,而不是计算真实增长率?
以简化的代码实现。在实际应用场景中,可以通过tushare的fina_indicator接口获取过去五年的每股收益数据,并编写如下的代码段来计算g值:
# 计算5年EPS增长率(示例)
def calculate_growth_rate(eps_list):
"""根据EPS列表计算年均增长率"""
if len(eps_list) < 5:
return 0
# 线性回归拟合增长率
x = np.arange(5)
y = np.log(eps_list) # 取对数消除复利效应
slope, _ = np.polyfit(x, y, 1)
return (np.exp(slope) - 1) * 100 # 转换为百分比
python

Q3:A股的财务数据可靠吗?如何避免财务造假?
A:确实存在造假风险。可通过以下方法降低风险:
- 优先选择市值较大且抗风险能力较强的公司(小盘股可能存在较大的造假风险);
- 关注扣除一次性收益后的净利润指标(这一指标更能真实反映公司的经营业绩);
- 通过交叉验证的方式进行多维度分析(特别关注短期盈利与长期现金流的关系)。
扩展阅读 & 参考资料
本杰明·格雷厄姆,《证券分析》(第6版),人民邮电出版社出版于2013年;
本杰明·格雷厄姆,《Smart Investor》(第4版)于2016年由人民邮电出版社出版;
Wesley Gray与Tobias Carlisle合著的《Quantitative Value Investment》,机械工业出版社于2018年出版;
Tushare官方提供了详细的API文档 accessible at https://tushare.pro/document/2;
聚宽量化社区提供丰富的教育资源与讨论平台 accessible at https://www.joinquant.com/community;
Graham与Dodd合著的经典著作《Security Analysis》于1934年由麦格劳- hill公司出版。
希望这篇文章能让你明白
