基于安东尼·波顿,《逆向投资》(2009年)
《逆向投资》是安东尼·波顿对1979-2007年管理富达特殊 situations基金的28年经验提炼,期间他实现了约19.5%的年化复合回报,而富时全股指数约13.5%。波顿通常被称为"英国的巴菲特",他在成立时投入的1000英镑到退休时变成了超过147,000英镑——这一记录使他成为英国历史上最伟大的基金经理之一。
本书不是公式化系统,而是实践者手册,揭示波顿如何实际发现、评估、买入、持有和卖出股票。涵盖了他的逆向投资哲学、对管理质量的执着、多重估值方法的使用,以及120-150个仓位的纪律组合构建方法。
波顿的方法独特,因为它桥接了多种投资风格:
他并不僵化地附属于任何单一学派。他称自己为"实用投资者",使用任何有效的工具。
| 时期 | 富达特殊situations | 富时全股指数 | 超额表现 |
|---|---|---|---|
| 1979-2007(28年) | ~19.5%年化 | ~13.5%年化 | ~6%每年 |
| 累计 | ~147倍 | ~36倍 | ~4倍相对 |
| 最差回撤期 | 参与但更快恢复 | — | — |
| 一致性 | 大多数年份跑赢基准 | — | — |
波顿的核心论点是,共识意见错误时产生最佳投资机会。市场由人类情绪驱动——恐惧和贪婪——这创造了系统性的错误定价。逆向投资者通过识别群体在任一方向过度反应的状況来获利。
逆向不是为不同而不同。当你自己分析告诉你共识错误时,有信念与共识背道而驰才是逆向。
波顿识别了与群体对抗产生超额回报的几个结构性原因:
波顿区分了逆向主义的程度:
| 程度 | 描述 | 示例 |
|---|---|---|
| 温和 | 略微超配失宠板块 | 在轻微低迷期间增持银行 |
| 适度 | 买入大多数分析师评级"卖出"的股票 | 在盈利预警后购买零售商 |
| 强劲 | 在广泛被厌恶的名称上持有大仓位 | 在监管危机中买入面临困境的公司 |
| 极端 | 在每个人都在卖出的市场恐慌中买入 | 在2008年10月全面增持 |
波顿主要在适度至强劲水平操作。他不是深度价值的"雪茄屁股"投资者——他需要看到可信的恢复路径,而不仅仅是统计便宜。
波顿仅在以下情况下与群体对抗:
波顿明确警告,逆向主义不是普遍策略。共识对的时候多于错的时候。关键技能是区分:
波顿的选股建立在三个类别上,每个都有独特特征:
经历了盈利或股价显著下跌的公司,波顿认为最坏情况已过,改善即将到来。
特征:
波顿寻找:
以比市场预期更快的速度增长的公司,但增长或其持续时间被低估。
特征:
波顿寻找:
创造独立于市场方向的价值的公司事件或结构性变化。
类型:
波顿的想法生成是系统性的多来源:
从数百个潜在想法中,波顿应用连续过滤:
第1阶段:初步筛选(量化)
→ 每季度约200-300个候选
第2阶段:快速定性检查
→ 业务可理解吗?
→ 有可信的错误定价原因吗?
→ 约80-120个候选存活
第3阶段:深度定性研究
→ 公司会议、竞争对手分析、财务建模
→ 约30-50个候选存活
第4阶段:估值和催化剂检查
→ 上行空间是否足够(至公允价值30%+)?
→ 有可识别的催化剂在12-18个月内吗?
→ 每季度15-25个新仓位
第5阶段:组合适配
→ 它改善多元化吗?
→ 有能力添加而不超过板块限制吗?
→ 最终添加
波顿从不依赖单一估值指标。他使用多种方法,寻找收敛——当几种方法指向相同结论时,他的信心增加。
波顿同样专注于避免高估:
波顿要求在买入前与他的公允价值估计有意义的折扣。他不严格量化这个,但操作这些一般准则:
波顿认为管理层质量是选股中最重要的单一因素。廉价股票加糟糕管理层是价值陷阱。合理价格加出色管理层可以是好投资。
我宁愿买平庸业务加出色管理层,也不愿买出色业务加平庸管理层。
波顿的公司会议方法独特:
波顿最有利可图的模式之一是在新任强大CEO被任命用于挣扎公司时买入。顺序:
股票可以便宜多年而不上涨。波顿坚持识别具体催化剂,将在合理时间范围(12-24个月)内缩小价格和价值之间的差距。
便宜不够。你需要一个市场苏醒的理由。
| 催化剂类型 | 描述 | 典型时间线 |
|---|---|---|
| 盈利拐点 | 下游后第一个盈利增长季度 | 1-3个季度 |
| 新管理层 | 具有turnaround记录的CEO任命 | 策略3-12个月,结果12-24个月 |
| 战略审查 | 宣布投资组合重组或专注 | 6-18个月 |
| 分拆/分拆上市 | 分离业务以解除企业集团折扣 | 从公告起6-12个月 |
| 并购活动 | 收购方法,无论是为公司还是由公司进行 | 变动 |
| 股票回购 | 公司以 depressed 价格回购股票 | 立即至12个月 |
| 监管解决方案 | 移除笼罩的调查或法律程序的结论 | 变动 |
| 行业整合 | 重新评级剩余独立玩家的部门并购浪潮 | 6-24个月 |
| 周期拐点 | 宏观或行业周期从低谷移动到恢复 | 6-18个月 |
| 内部人士买入 | 董事在公开市场价格大量买入 | 立即信号,6-12个月回报 |
波顿隐含地将催化剂按概率和影响分级:
更高的信念催化剂允许波顿更积极地配置仓位。
波顿运行高度多元化的组合120-150只股票,这将他与集中价值投资者区分开来。他的理由:
波顿使用分层仓位配置框架:
| 层级 | 仓位大小 | 持仓数量 | 标准 |
|---|---|---|---|
| 核心信念 | 基金的2-4% | 10-15只 | 最高信念,多催化剂,强管理层 |
| 重要持仓 | 基金的1-2% | 30-40只 | 好信念,清除催化剂,坚实估值 |
| 标准持仓 | 基金的0.5-1% | 40-50只 | 中等信念,发展论点 |
| 起始/监控 | 基金的0.1-0.5% | 30-50只 | 早期想法,建立理解 |
配置原则:
波顿有相对较高的换手率对于基本面投资者:
高换手率的原因:
波顿不做大板块赌注,但允许由自下而上选股驱动的有意义的超/欠配:
波顿的优势最强在中小盘:
中小盘超配是故意的——这些股票分析师覆盖较少、信息不对称更大、重估空间更大。
波顿将风险视为波动性而非永久资本损失的概率。他的风险管理是结构性的而非公式驱动的。
在每个主要持仓前,波顿问:
波顿在1987年崩盘、1990年衰退、2000-2003年熊市和2007-2008年金融危机期间经历重大回撤。他的方法:
波顿将空头仓位作为他有工具包的有限但有价值的部分,特别是在基金获得使用衍生品能力的后期年份。
波顿会在识别以下情况时卖空:
波顿学到了几个艰难教训:
波顿主要是自下而上选股员但保持可能影响持仓的宏观条件意识。
虽然不是宏观交易者,波顿注意到经济周期中板块轮动往往遵循可预测模式:
波顿使用这个意识来将他的恢复导向选股倾斜到最有可能从下一周期阶段受益的板块。
波顿将情绪控制识别为区分好的分析师和伟大投资者的差异化因素。他的规则:
| 偏见 | 描述 | 波顿对策 |
|---|---|---|
| 确认偏见 | 寻找支持你观点的信息 | 故意寻找每个持仓的空头情况 |
| 锚定 | 执着于购买价格或历史高点 | 基于当前基本面而非历史估值股票 |
| 损失厌恶 | 持有输家太久以避免实现损失 | 买入前设定明确的卖出标准 |
| 过度自信 | 基于虚假确定性配置过大仓位 | 广泛多元化;上限最大仓位大小 |
| 近因偏见 | 高估近期事件 | 研究长期周期;记住均值回归在年而非周内运作 |
| 从众 | 跟随其他基金经理进入热门名称 | 保持独立研究过程;对共识持怀疑态度 |
| 沉没成本谬误 | 仅因为价格更低而非论点加强而向下摊平 | 从头重新评估——你会今天以这个价格买这只股票吗? |
波顿定期对每个持仓执行"干净纸"审查:
波顿承认犯了很多错误并将它们视为不可避免。他的方法:
波顿对自己的错误异常坦诚:
波顿开发了一个非正式检查清单以避免价值陷阱:
如果三个或更多框被勾选,无论股票看起来多便宜,都可能是价值陷阱。
以下示例综合了波顿描述的方法到一个单一说明性案例:
第1阶段:识别(第0月)
一只中型英国工业公司("IndustrialCo")出现在波顿的筛选中:
第2阶段:初步研究(第0-1月)
波顿阅读年报并注意到:
第3阶段:公司会议(第1-2月)
波顿会见新CEO并发现:
第4阶段:估值(第2月)
波顿构建估值范围:
第5阶段:初步购买(第2月)
波顿买入0.5%仓位(起始仓位)——足够小以在价格进一步下跌时增持。
第6阶段:催化剂发展(第4-8月)
波顿增持仓位,增加至1.5%。
第7阶段:重估开始(第8-16月)
第8阶段:获利了结(第16-20月)
第9阶段:退出(第20-24月)
class BoltonContrarianScreener:
"""
使用安东尼·波顿的多因素方法筛选潜在逆向投资机会。
"""
# 可配置阈值
PRICE_DECLINE_MIN = -0.30 # 至少离高点30%
PE_NORMALIZED_MAX = 12.0 # 低正常化P/E
EV_EBITDA_MAX = 8.0 # 低EV/EBITDA
FCF_YIELD_MIN = 0.06 # 最低6%自由现金流收益率
DIVIDEND_YIELD_MIN = 0.03 # 最低3%股息收益率
NET_DEBT_EBITDA_MAX = 3.5 # 最大杠杆
ANALYST_DOWNGRADE_MIN = 2 # 至少2次近期下调(逆向信号)
INSIDER_BUY_LOOKBACK_DAYS = 90 # 检查过去90天内部人士买入
def screen_universe(self, stocks):
"""
第一轮定量筛选。
返回按综合逆向分数排序的候选列表。
"""
candidates = []
for stock in stocks:
score = 0
flags = []
# --- 价格下跌过滤器 ---
price_decline = stock.price_change_from_52w_high()
if price_decline < self.PRICE_DECLINE_MIN:
score += 2
flags.append("PRICE_DECLINE")
# --- 估值过滤器 ---
pe_norm = stock.normalized_pe()
if pe_norm is not None and 0 < pe_norm < self.PE_NORMALIZED_MAX:
score += 2
flags.append("LOW_PE")
ev_ebitda = stock.ev_to_ebitda()
if ev_ebitda is not None and 0 < ev_ebitda < self.EV_EBITDA_MAX:
score += 2
flags.append("LOW_EV_EBITDA")
fcf_yield = stock.free_cash_flow_yield()
if fcf_yield is not None and fcf_yield > self.FCF_YIELD_MIN:
score += 1
flags.append("HIGH_FCF_YIELD")
div_yield = stock.dividend_yield()
if div_yield is not None and div_yield > self.DIVIDEND_YIELD_MIN:
score += 1
flags.append("HIGH_DIVIDEND")
# --- 资产负债表安全检查 ---
net_debt_ebitda = stock.net_debt_to_ebitda()
if net_debt_ebitda is not None and net_debt_ebitda > self.NET_DEBT_EBITDA_MAX:
score -= 3 # 惩罚过度杠杆
flags.append("HIGH_LEVERAGE_WARNING")
# --- 逆向情绪信号 ---
recent_downgrades = stock.analyst_downgrades_last_90_days()
if recent_downgrades >= self.ANALYST_DOWNGRADE_MIN:
score += 2 # 逆向:更多下调 = 更有趣
flags.append("ANALYST_CAPITULATION")
insider_buys = stock.insider_purchases_last_n_days(
self.INSIDER_BUY_LOOKBACK_DAYS
)
if insider_buys > 0:
score += 3 # 强信号
flags.append("INSIDER_BUYING")
# --- 忽视溢价 ---
analyst_coverage = stock.number_of_analysts()
if analyst_coverage is not None and analyst_coverage <= 3:
score += 1
flags.append("LOW_COVERAGE")
# 需要最低分数才能通过筛选
if score >= 5:
candidates.append({
"ticker": stock.ticker,
"name": stock.name,
"market_cap": stock.market_cap,
"score": score,
"flags": flags,
"price_decline": price_decline,
"pe_normalized": pe_norm,
"ev_ebitda": ev_ebitda,
"fcf_yield": fcf_yield,
"net_debt_ebitda": net_debt_ebitda,
})
# 按综合分数降序排序
candidates.sort(key=lambda x: x["score"], reverse=True)
return candidates
def classify_opportunity(self, candidate):
"""
分类到波顿的三大支柱。
"""
flags = candidate["flags"]
if "PRICE_DECLINE" in flags and candidate["price_decline"] < -0.40:
return "RECOVERY_SITUATION"
elif "LOW_PE" in flags and candidate.get("earnings_growth_3yr", 0) > 0.15:
return "UNDERVALUED_GROWTH"
elif self._has_special_situation_trigger(candidate):
return "SPECIAL_SITUATION"
else:
return "GENERAL_VALUE"
def _has_special_situation_trigger(self, candidate):
"""
检查特殊情况催化剂。
"""
triggers = [
candidate.get("pending_demerger", False),
candidate.get("new_ceo_last_6_months", False),
candidate.get("strategic_review_announced", False),
candidate.get("activist_involved", False),
candidate.get("takeover_rumor", False),
]
return any(triggers)
class CatalystTracker:
"""
跟踪和监控持仓催化剂。
在催化剂实现或论点恶化时警报。
"""
CATALYST_TYPES = [
"EARNINGS_INFLECTION",
"NEW_MANAGEMENT",
"STRATEGIC_REVIEW",
"DEMERGER_SPINOFF",
"MA_ACTIVITY",
"SHARE_BUYBACK",
"REGULATORY_RESOLUTION",
"INDUSTRY_CONSOLIDATION",
"CYCLE_TURN",
"INSIDER_BUYING",
]
def __init__(self):
self.holdings = {} # ticker -> HoldingRecord
def add_holding(self, ticker, entry_price, position_size_pct,
thesis, catalysts, fair_value_bear, fair_value_base,
fair_value_bull, max_loss_tolerance):
"""
记录新持仓及其投资论点和催化剂。
"""
self.holdings[ticker] = {
"entry_price": entry_price,
"entry_date": today(),
"position_size_pct": position_size_pct,
"thesis": thesis,
"catalysts": catalysts, # {type, description, expected_date, status}列表
"fair_value_bear": fair_value_bear,
"fair_value_base": fair_value_base,
"fair_value_bull": fair_value_bull,
"max_loss_tolerance": max_loss_tolerance,
"status": "ACTIVE",
"notes": [],
}
def daily_review(self, market_data):
"""
每日检查所有持仓的催化剂触发和风险警报。
"""
alerts = []
for ticker, holding in self.holdings.items():
current_price = market_data.get_price(ticker)
pnl_pct = (current_price - holding["entry_price"]) / holding["entry_price"]
# --- 检查是否达到公允价值(卖出信号) ---
if current_price >= holding["fair_value_base"]:
alerts.append({
"ticker": ticker,
"type": "FAIR_VALUE_REACHED",
"message": f"{ticker}处于基准情况公允价值。考虑削减。",
"priority": "HIGH",
})
# --- 检查是否超出容忍的损失 ---
if pnl_pct < -holding["max_loss_tolerance"]:
alerts.append({
"ticker": ticker,
"type": "LOSS_LIMIT_BREACH",
"message": f"{ticker}下跌{pnl_pct:.1%}。需要审查论点。",
"priority": "CRITICAL",
})
# --- 检查催化剂时间线 ---
for catalyst in holding["catalysts"]:
if catalyst["status"] == "PENDING":
if catalyst["expected_date"] < today():
alerts.append({
"ticker": ticker,
"type": "CATALYST_OVERDUE",
"message": f"{ticker}:'{catalyst['description']}'逾期。",
"priority": "MEDIUM",
})
# --- 干净纸测试(每季度) ---
days_held = (today() - holding["entry_date"]).days
if days_held > 0 and days_held % 90 == 0:
alerts.append({
"ticker": ticker,
"type": "CLEAN_SHEET_REVIEW",
"message": f"{ticker}:季度审查——你今天会买吗?",
"priority": "MEDIUM",
})
return sorted(alerts, key=lambda a: {"CRITICAL": 0, "HIGH": 1, "MEDIUM": 2}[a["priority"]])
def update_catalyst_status(self, ticker, catalyst_index, new_status, note=""):
"""
更新催化剂状态:PENDING, MATERIALIZED, FAILED, DELAYED。
"""
holding = self.holdings[ticker]
holding["catalysts"][catalyst_index]["status"] = new_status
if note:
holding["notes"].append({
"date": today(),
"note": note,
})
# 如果所有催化剂失败,标记审查
active_catalysts = [c for c in holding["catalysts"] if c["status"] == "PENDING"]
materialized = [c for c in holding["catalysts"] if c["status"] == "MATERIALIZED"]
if len(active_catalysts) == 0 and len(materialized) == 0:
holding["status"] = "REVIEW_FOR_EXIT"
def position_sizer(self, conviction_score, opportunity_type):
"""
基于信念和机会类型确定仓位大小。
conviction_score: 1-10等级
opportunity_type: RECOVERY | UNDERVALUED_GROWTH | SPECIAL_SITUATION
"""
# 基于信念的基本大小
if conviction_score >= 8:
base_pct = 2.5 # 核心信念:2-4%
elif conviction_score >= 6:
base_pct = 1.25 # 重要:1-2%
elif conviction_score >= 4:
base_pct = 0.75 # 标准:0.5-1%
else:
base_pct = 0.3 # 起始:0.1-0.5%
# 按机会类型调整
type_multiplier = {
"RECOVERY_SITUATION": 0.85, # 稍小(更高风险)
"UNDERVALUED_GROWTH": 1.0, # 标准
"SPECIAL_SITUATION": 1.1, # 稍大(催化剂驱动)
}
multiplier = type_multiplier.get(opportunity_type, 1.0)
final_pct = base_pct * multiplier
# 硬性上限
final_pct = min(final_pct, 4.0) # 永不超过4%
final_pct = max(final_pct, 0.1) # 最低有意义仓位
return round(final_pct, 2)
class BoltonPortfolioMonitor:
"""
监控符合波顿方法的组合级约束。
"""
MAX_POSITIONS = 150
MIN_POSITIONS = 100
MAX_SINGLE_POSITION = 0.05 # 5%
MAX_TOP_10_WEIGHT = 0.35 # 35%
MAX_SECTOR_OVERWEIGHT = 2.0 # 基准的2倍
MAX_NET_DEBT_EBITDA_AVG = 2.5 # 组合平均杠杆
MIN_SECTORS = 8
def check_constraints(self, portfolio, benchmark):
"""
验证符合波顿风格约束的组合。
返回违规列表。
"""
violations = []
# 持仓数量
n_positions = len(portfolio.positions)
if n_positions > self.MAX_POSITIONS:
violations.append(f"持仓过多:{n_positions} > {self.MAX_POSITIONS}")
if n_positions < self.MIN_POSITIONS:
violations.append(f"持仓过少:{n_positions} < {self.MIN_POSITIONS}")
# 单一持仓限制
for pos in portfolio.positions:
if pos.weight > self.MAX_SINGLE_POSITION:
violations.append(
f"{pos.ticker}权重{pos.weight:.1%}超过{self.MAX_SINGLE_POSITION:.0%}"
)
# 前10集中度
top_10_weight = sum(
p.weight for p in sorted(portfolio.positions,
key=lambda x: x.weight, reverse=True)[:10]
)
if top_10_weight > self.MAX_TOP_10_WEIGHT:
violations.append(
f"前10集中度{top_10_weight:.1%}超过{self.MAX_TOP_10_WEIGHT:.0%}"
)
# 板块超配
for sector in portfolio.sector_weights():
bm_weight = benchmark.sector_weight(sector)
if bm_weight > 0:
ratio = portfolio.sector_weight(sector) / bm_weight
if ratio > self.MAX_SECTOR_OVERWEIGHT:
violations.append(
f"板块{sector}:{ratio:.1f}倍基准(最大{self.MAX_SECTOR_OVERWEIGHT}倍)"
)
# 板块多元化
active_sectors = len([s for s in portfolio.sector_weights() if portfolio.sector_weight(s) > 0.01])
if active_sectors < self.MIN_SECTORS:
violations.append(f"仅{active_sectors}个板块(最少{self.MIN_SECTORS})")
return violations
"最佳投资机会出现在共识错误时。但逆向不是为不同而不同——它是有做工作以知道共识何时错误的信念。"
"如果买一只股票感觉舒服,你可能已经太晚了。最好的买入是让你稍微紧张的。"
"我始终相信,公司管理层是决定投资是否成功的最重要因素。"
"会见管理层,但不要只听他们说的。看他们做的——特别是他们自己的钱。"
"没有单一正确的方法来估值公司。我使用多种方法,寻找重复出现的答案。当几种不同方法指向相同结论时,我有更多信心。"
"便宜不等于好价值。股票仅在有理由被重估时才成为好价值。"
"投资的长期成功关键不是避免错误——而是快速识别它们并采取行动。"
"多元化是投资者的好朋友。我始终更喜欢在大量股票上分散赌注而非集中于少数。"
"每个投资者都会经历表现不佳的时期。重要的是你是否坚持你的过程还是在最坏时机放弃它。"
"卖出决策至少与买入决策一样重要,但大多数投资者在上面花费太少时间。"
"当股票达到我估计的公允价值时,我卖出。我不会试图挤出最后几个百分比的回报。"
"投资者最大的敌人不是市场——而是他自己。恐惧和贪婪比任何基本面因素驱动更多糟糕决策。"
"我记录我做出的每一个投资决策。回顾我的错误是痛苦的,但至关重要。"
"投资是一门随着实践提高的手艺。28年后,我仍在学习。"
"我认识的最好的投资者好奇、谦逊、愿意在事实改变时改变主意。"
用于评估任何潜在博尔顿风格投资的可综合检查清单:
机会识别
基本面质量
管理层
催化剂
估值
风险
实施规范结束