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

基准与超额收益:不写清跟谁比的收益率,等于没说

最后更新 2026-08-18
R1 · 低风险

饭桌上有人说,他去年账户赚了四成,语气里带着一点「我可能确实有天赋」的意思。你在心里默算了下自己的,三成五,觉得也还行,就是差一口气。

这顿饭吃完,两个人都没问一句最要紧的话:那一年,市场整体涨了多少?

如果同期一只随便买了就放着不动的宽基指数基金涨了四成五,那桌上这两位其实都做了一件挺亏的事——不是亏钱,是花了一整年的精力、承担了个股的额外风险,最后跑输了一个什么都不用想的选择。可他们谁都不知道,因为收益率那个数字,孤零零地摆在那儿的时候,看起来实在是太像成绩了。

先说人话:你到底在跟谁比

想象你在一部正在上行的自动扶梯上往上走。你走了三十级台阶,气喘吁吁,觉得自己爬得挺快。可扶梯自己也在往上送,同一时间它送了你四十级。你真正靠腿力挣来的,是三十级里减掉扶梯那部分之后剩下的——如果扶梯送得比你走得还多,你甚至可以说,你越走越拖后腿。

再换个更熟的场景。孩子期末考了 90 分,你正准备夸,班主任说班级平均 95。这个 90 分的性质当场就变了。分数没变,变的是它旁边多了一个参照物。

投资里那个参照物叫基准(benchmark),说白了就是「如果我什么聪明事都不干,只用一种最省事、最公开的方式参与这个市场,我能拿到多少」。最常见的省事方式,是买一只覆盖面广、跨行业、不押单一赛道的宽基指数基金,然后不动。

而你的收益率减去基准收益率,剩下的那一截,才是这一年里真正属于你的部分——超额收益

这里要先立一个说法,后面整篇都建立在它上面:

一个不写清「跟谁比」的收益率,就像一句没写单位的话。「我这块地有 30」——30 什么?平方米还是亩?差着几百倍。

牛市里人人都是股神

现在把上面那个直觉往前推一步,你会得到一个挺让人不舒服的结论。

你账户里那份收益,可以粗略地拆成两块:一块是跟着市场一起涨来的,一块是你自己挣的

前一块在业内叫贝塔——你的持仓跟大盘同涨同跌的那部分敏感度。大盘涨你就涨,跟你选没选对没关系,跟你是不是熬夜看了三十份研报也没关系。后一块叫阿尔法——扣掉市场那份之后,靠你的选股、择时、组合结构真正多挣出来的东西。

大牛市的麻烦在于,第一块特别大,大到能把第二块完全盖住。市场涨四成的年份里,闭眼买一篮子股票的人也大概率赚了三四成。这时候几乎每个人的账户都是绿的(这里指赚钱,A 股的红绿跟国际市场是反的),而人对自己账户的解释永远倾向于「我判断对了」,不会倾向于「我恰好站在扶梯上」。

归因错了,代价不在当下,在下一次。 这一年你赚了三成五,你的大脑记住的结论是「我这套方法有效」。于是下一年你做三件事:仓位加重,标的更集中,甚至上点杠杆。等扶梯停下来或者开始往下走,你才发现前一年的成绩里几乎没有你的份,而你现在承担的风险,是按「我有本事」这个错误前提配的。

反过来的一面同样重要,而且更少有人讲:熊市里亏 10% 可能是个相当好的成绩。 如果同期宽基跌了 25%,那这 10% 意味着你少亏了 15 个点。可绝大多数人在那种时候只盯着账户上的负号自我怀疑,把一套正在发挥作用的方法在最低点扔掉。

基准这个东西真正的价值,不是让你在牛市里扫兴,而是让你在两个方向上都不至于把运气和能力搞混

基准该怎么选:三条判据

选基准这件事看着简单,实际上是整个评价体系里最容易做手脚的一环——因为基准是你自己挑的,而挑得低一点,你的超额收益就凭空变好看。所以判据得先立死。

第一,它得是你真能买到的东西。 一个不可投资的参照物没有意义。拿「所有上市公司的平均涨幅」当基准就属于这一类:现实中没有一个产品让你按那个口径买入并持有,用它比出来的差额是纸上的。可投资意味着这个基准背后有真实存在的、你随时能申购的低成本工具,它的收益里也已经扣掉了那份工具自身的费用。

第二,它必须是事前定的。 这条是红线。回测跑完再回头去挑一个「显得我最好看」的基准,本质上和先射箭再画靶子是同一件事。同一个策略,你拿它跟大盘指数比、跟行业指数比、跟无风险利率比,能得出三个完全不同的结论。这个选择权如果留到出结果之后,你得到的就不是评价,是自我安慰。

第三,它得跟你的仓位是同一个池子、同一种风格。 一个只买小市值股票的方法,拿大盘蓝筹指数当基准,比出来的差额里绝大部分是风格差而不是本事差——小盘股整体强的年份你怎么比都赢,整体弱的年份你怎么比都输,跟你选得准不准关系不大。同理,一个只在数字货币市场上跑的方法,拿股票指数当基准毫无意义;一个持仓里长期有一半是现金的方法,拿满仓指数比也不公平。

顺着这三条,几种典型的坏基准就很清楚了:

坏基准 为什么坏
拿 0 当基准(只要赚钱就算赢) 等于说「扶梯往上送我也算我走的」
拿无风险利率当唯一基准 忽略了你为了这份收益承担的市场风险,参见风险溢价
事后从几个指数里挑一个 先射箭后画靶,评价失去意义
跟自己不同市场、不同币种的指数 比的是汇率和市场,不是方法
跟一个别人的、口径不明的收益率 你不知道对方的仓位、杠杆、时间段

超额怎么算:三种口径,各自在回避一个问题

超额收益听着像一道减法题,但真做起来有好几种口径,差别不是精度问题,是它们各自想堵住哪个漏洞

口径一,直接相减。 你的收益减去基准收益,完事。最好懂,也最常用。它的漏洞是:如果你的持仓天然比大盘颠得厉害(比如你满仓的都是高波动品种,或者你上了杠杆),那么在上涨的年份里,你几乎必然跑赢基准——这多出来的部分不是本事,是你把扶梯的速度放大了。这个口径会把「胆子大」算成「本事大」。

口径二,先调整波动敏感度再相减。 也就是先估出你的组合相对基准的贝塔(你涨跌幅是大盘的几倍),把「基准收益 × 贝塔」这一份先扣掉,剩下的才算你的。这样一来,一个贝塔为 1.5 的组合,在大盘涨 10% 的年份里得先涨过 15% 才谈得上有超额。这个口径回避了上面那个漏洞,代价是贝塔本身是个估出来的数,估法一变,结论就会跟着变。

口径三,扣不扣交易成本,是两个完全不同的数。 这一条最容易被忽略,也最要命。你的收益扣掉基准之后还剩多少,和你的收益扣掉基准、再扣掉手续费与买卖冲击之后还剩多少,是两条差得很远的曲线,尤其在换手频繁的方法上。qlib 就把这两个数分开算、分开报,一个都不省(这块的坑很深,专门有一篇讲回测里的交易成本假设)。

还有一个跟基准配套的数字值得提一句:信息比率。它的意思是「你每承受一份『跟基准走不一样』带来的颠簸,换回多少超额收益」。分母那个颠簸程度有个名字叫跟踪误差——你的曲线和基准曲线之间偏离的剧烈程度。这两个数和夏普比率与索提诺比率是同一个家族的思路,只是把参照物从「无风险利率」换成了「基准」,那篇把风险调整收益的原理讲得更细,这里不重复。

系统层:三套系统,三种完全不同的「基准」

概念讲完了。接下来看三个真实系统各自怎么理解「基准」这两个字——有意思的地方在于,它们给出的答案完全不一样,而每一种不一样背后都有它要解决的现实问题。

系统 基准是什么 它在回避什么
qlib 一个显式配置的指数(或股票池、或你自己给的收益序列) 股票组合必须跟同市场指数比,否则风格全混进来
freqtrade 你回测的那批标的自身的等权平均涨幅 数字货币市场没有公认的可投资宽基指数
Vibe-Trading 按市场类型自动挑一个默认基准,挑不出就承认没有 一套系统同时跑股/币/期货,不能用同一把尺

qlib:基准是配置项,而且允许三种形态

qlib 把基准做成了回测的一等公民——它的回测报告里有一列就叫 bench,逐日记录基准的涨跌。配置基准的时候你可以给三种东西:一个指数代码(用它的日涨跌)、一个股票代码清单(用这批股票的日平均涨跌)、或者干脆自己塞一条现成的收益序列进去。默认值是沪深 300 的代码(这是快照里的默认值,可配置)。

真正值得看的是它出报告那一步,超额收益被拆成了两行:

analysis["excess_return_without_cost"] = risk_analysis(
    report_normal["return"] - report_normal["bench"], freq=_analysis_freq
)
analysis["excess_return_with_cost"] = risk_analysis(
    report_normal["return"] - report_normal["bench"] - report_normal["cost"], freq=_analysis_freq
)

两行的差别只有末尾那个 - report_normal["cost"]。第一行回答「我的选股逻辑本身比市场强吗」,第二行回答「把交易费用交完之后,我还剩多少」。很多方法在第一行漂亮、第二行归零,而只报第一行完全合规、完全诚实、也完全没用。 看任何一份带超额收益的报告,第一件该问的事就是:这个数扣成本了吗。

同一份代码里还能读到一个细节:如果你压根不配基准,它返回的是 None 而不是 0。这个区分很讲究——「没有基准」和「基准涨幅为零」是两回事,前者意味着这份报告里的超额收益无从谈起,后者是一个真实的判断。把没有测量到的东西填成 0,是数据分析里最常见的一种自欺。

它算年化和信息比率时会用一个「一年大约多少个交易周期」的换算系数,日频、周频、月频各有各的值。这类系数属于实现细节,看的时候以你手上那个版本为准,别背数字,要记住的是任何年化数字背后都有一个折算假设

freqtrade:它根本没有指数,只有「你自己选的那一篮子」

freqtrade 主要面向数字货币市场,而那个市场没有一个像宽基指数那样被广泛接受、又能低成本买到的东西。于是它给出了一个务实到有点狡猾的答案:把你这次回测的这批交易对,各自从头涨到尾的幅度取个平均,就是「市场变化」。 它在报告里叫 Market change。

核心逻辑短到不像一个指标:

start = df1[column].dropna().iloc[0]
end = df1[column].dropna().iloc[-1]
tmp_means.append((end - start) / start)

每个标的取第一个和最后一个有效收盘价,算涨跌幅,最后取所有标的的均值。就这些。

这个设计有两处很值得琢磨。

第一处,它显式排除了启动期。 计算时会传进来一个最早日期,早于这个日期的数据不参与。原因是回测的前一段时间通常在给指标预热,还没真正开始交易;如果基准把那段也算进去,两边比的就不是同一段时间了。这是个很容易被忽视的对齐问题——基准的时间窗和策略的实际交易窗必须严丝合缝,差一段就没法比。

第二处,也是更该警惕的:这个基准的高低,取决于你选了哪几个标的。 你在配置里挑了哪些交易对,就等于同时定义了你的基准。如果你挑标的的时候,无意中挑了一批「回头看确实涨得好」的,那么你的策略和你的基准会一起被抬高;如果你挑的是一批已经退市或者下架的,则两边一起被压低。换句话说,这个基准和策略共享同一份幸存者偏差。它不是缺陷——在没有公认指数的市场里这几乎是唯一务实的选择——但你必须知道你手上这把尺子是怎么造出来的。

它的官方文档对这个口径写得很直白:市场变化是回测期内所有交易对从第一根到最后一根 K 线涨跌幅的平均值。没有藏着掖着,也没有把它包装成什么高级指标。

Vibe-Trading:按市场猜一个基准,猜不出就老实说没有

第三种思路来自一个要同时应付股票、港股、A 股、数字货币、期货、外汇的系统。它的做法是维护一张「市场类型 → 默认基准」的映射表,跑回测时先根据你交易的标的推断这是哪个市场,再去取对应基准的收益序列。

这张表里最值得看的不是那些有基准的行,而是外汇那一行——它的值是 None,代码注释里写的理由是「没有普适基准」。

这是整篇里我最想让你记住的一个工程判断:承认「这里没有合适的尺子」,比硬塞一把不合适的尺子诚实得多。 外汇是两种货币的相对价格,你说它该跟什么比?跟美元指数?那只是换了个参照货币,不是市场整体。与其编一个,不如让下游拿到 None,明确知道这次没有超额收益可谈。

同一个模块还有一处细节同样是这个态度:当数据源被配置成「离线本地数据」时,即便运行时因为某些回退逻辑换上了一个能联网的加载器,它也会拒绝用那个加载器去取基准数据,宁可返回空。注释里的说法是「fail closed」——失败时关闭,而不是失败时放行。离线跑就该彻底离线,不能因为基准数据缺一块就偷偷联一次网,否则你的回测环境就不是你以为的那个环境了。

拿到基准之后,它算的东西前面都铺垫过了:

bench_return = float((1 + bench_ret).prod() - 1)
excess = total_ret - bench_return
aligned_bench = bench_ret.reindex(port_ret.index).fillna(0.0)
active_ret = port_ret - aligned_bench

注意第三行的对齐动作:基准的日期序列要先跟组合的日期序列对齐,缺的日子填 0。这不是形式主义——两条曲线的日期只要错开一天,后面所有的差值、信息比率、跟踪误差就全是错的。它接着用 active_ret(也就是每日的超额)算信息比率和跟踪误差,再用组合与基准的协方差除以基准方差算出贝塔,正好对应前面讲的口径二。

这个文件里还藏着一个特别好的教训。计算「买入持有能赚多少」这件事,最自然的写法是把每日涨跌幅连乘起来,数学上它应该正好等于「末价除以初价减一」。但注释里记了一个真实的复现案例:某个标的价格序列里出现了接近零的价格,连乘的结果报出了一个荒唐的正收益,而按末价除初价算出来其实是大幅亏损。两个数学上等价的写法,在真实脏数据面前给出了天壤之别的答案。

🚧 避坑

基准本身也是算出来的,也会算错。 大多数人会仔细检查策略那条曲线,却默认基准那条曲线天然正确。可基准同样要取数、同样要对齐日期、同样会遇到停牌和缺失、同样有除权除息要处理。基准算高了你的超额就凭空缩水,算低了就凭空变胖。一份超额收益报告里,基准那一半和策略那一半需要同等强度的怀疑

失效边界与常见误用

用超额收益掩盖绝对亏损。 「我今年跑赢基准 8 个点」在基准跌了 30% 的年份里,意味着你亏了 22%。这句话在基金经理的语境里是成绩(他的职责就是相对排名),在你自己的账户里则要看你能不能承受这 22%。相对收益和绝对收益是两套目标,混着说会骗到自己。

样本期太短,超额收益基本是噪音。 三个月跑赢五个点说明不了任何事情。收益的随机成分本来就大,短窗口下的差额里,运气占比高得离谱。这个问题跟回测到底在算什么那篇讲的样本量逻辑是同一件事——观测次数不够,任何结论都撑不住。

偷偷换基准。 前两年拿宽基比,今年方法风格漂移了,就换成一个行业指数比。基准一换,历史上所有的超额数字都失去了可比性。基准可以改,但改了就要说明,并且改之前的记录要保留原口径。

把基准当成必须打败的对手。 基准是尺子不是敌人。如果你长期打不过一个低成本宽基,那么理性的做法不是加倍努力去打败它,而是认真考虑「那我为什么不直接持有它」。这一层的道理,有效市场假说那篇讲得比这里透彻得多。

忘了基准也有成本。 你能买到的是指数基金,不是指数本身。指数基金有管理费、有跟踪偏差、有申赎摩擦。拿一个「零成本、完美复制」的理论指数当基准,对你自己的方法其实是不公平的——你扣了手续费,它没扣。

年化收益率做跨期比较时忘了基准也要年化。 一个跑了 8 个月的方法折算成年化,基准也必须用同一段时间、同样的折算方式。两边折算口径不一致,比出来的差额是假的。

小结

  • 一个不说明「跟谁比」的收益率,是一句没写单位的话;基准就是那个单位。
  • 你的收益能拆成两块:跟着市场涨的那块(贝塔)和自己挣的那块(阿尔法)。牛市里第一块特别大,大到会让人把运气记成本事——代价不在当年,在下一年加的杠杆上。
  • 选基准三条判据:真能买到事前定死同池子同风格。基准是自己挑的,所以最容易做手脚,判据必须先立。
  • 超额有三种口径:直接相减(会把胆子大算成本事大)、调整贝塔后相减(更公平但依赖估计)、扣不扣交易成本(差别常常大到能把超额归零)。看报告先问「扣成本了吗」。
  • 三套系统给出三种基准:qlib 用显式配置的指数并把超额拆成扣成本与不扣成本两行;freqtrade 用你自己选的那篮子标的的等权涨幅,因此基准和策略共享同一份幸存者偏差;Vibe-Trading 按市场类型自动匹配,外汇那一栏直接写「没有」。
  • 承认「这里没有合适的基准」,比硬塞一个不合适的诚实得多;同理,「没有基准」和「基准为零」必须区分开。

一句话记住这篇:光说你赚了多少没用,得说清楚同一段时间里,什么都不干的人赚了多少。

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

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

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