如何利用线性回归构建 Alpha 信号(量化框架)

@RohOnChain
АНГЛІЙСЬКА2 місяці тому · 08 черв. 2026 р.
475K
339
30
23
824

Коротко

本指南深入解析了交易中线性回归的机构级应用方法,详细阐述了如何从 Beta 中剥离 Alpha、利用 p 值验证信号有效性,以及通过样本外测试抵御市场噪音。

我将详细介绍如何利用线性回归赢得每一笔交易、构建真正的阿尔法信号,并分享完整的获胜代码。

我们直接进入正题。

收藏这篇文章

- 我是 Roan,一名后端开发者,专注于系统设计、高频交易执行和量化交易系统。我的工作主要研究预测市场在实际负载下的表现。如有任何建议、深度合作或伙伴关系,欢迎私信联系。

每个量化交易员都有过类似的经历。

你花了一周时间打磨模型。回测结果完美,净值曲线直线上扬,你觉得自己终于找到了宝藏。然后实盘上线。两周后开始亏损,你却完全搞不清原因。

我见过这个循环摧毁的量化交易员生涯比任何市场崩盘都多。模型从来就不真实。它只是伪装成信号的噪音。 在这个领域里,最宝贵的技能就是在你投入一分钱之前,学会区分两者。

这项技能始于量化金融中最被低估的工具。

线性回归。

我知道这听起来像什么。线性回归是每个人都觉得自己花了一个下午就学会然后抛之脑后的东西。但真正让我用多年和实际亏损才理解的是:顶级机构里管理数十亿资产的人,其核心信号大多不是用花哨的深度学习巨兽。他们用的是线性回归——理解得远比大多数人深入,应用得也比大多数人自律。

看看历史上最成功的交易机构。

Jim Simons 就是在这一基础上建立了文艺复兴科技公司。他的大奖章基金在 1988 年至 2018 年间平均年化总收益率约为 66%,这是有史以来最好的记录。而据其团队所述,该基金的正确率仅约为 50.75%。在数百万笔交易中,这微乎其微的优势累积成了超过 1000 亿美元的财富。他们并没有预测未来。他们只是从噪音的海洋中提取了一个微小、真实、可重复的信号——这正是回归分析的目标。

AQR 如今管理着约 1790 亿美元,其帝国建立在基于回归的因子模型之上。

PDT Partners 连续多年运行统计套利策略,从未出现过亏损年份。

这才是没人教过你的线性回归版本。

读完这篇文章,你将理解线性回归的真正含义、阿尔法到底是什么、如何用真实代码从零构建单因子和多因子信号、如何像机构研究员一样解读回归输出结果、判断真实信号与巧合的精确检验方法,以及为什么即便是真实信号最终也会消亡。

注意:这篇文章特意写得较长,每个部分都建立在前一部分基础上。如果你真的想要构建能在实盘市场中生存的信号,请逐字阅读。如果你只想找一个神奇指标,这篇文章不适合你。

第一部分:线性回归到底是什么

Roan - inline image

线性回归就是找到一条同时最接近所有数据点的直线。

暂时抛开金融。

线性回归只是在一堆散点中画出最佳直线的数学方法。

想象一下,把房子面积和房价画在图上。房子越大价格越高,所以点会向上漂移。线性回归找到一条直线,同时最接近所有这些点。输入一个新房子的面积,你就能读出它的预测价格。这就是全部思想。它是一个学习输入与输出之间关系的机器,然后用它来做预测。

吴恩达在他著名的斯坦福机器学习课程中正是用这个房价例子开场的,因为这是最简单的学习算法,也是所有后续内容的基石。

这条直线的公式你上学时就学过:

y = a + b x

这里 y 是你预测的值,x 是输入,b 是斜率(表示 y 随 x 上升的陡峭程度),a 是截距(当 x 为零时 y 的值)。找到最佳 a 和 b 的方法叫做普通最小二乘法(OLS)。在所有的直线中,OLS 选择的那条使得直线与实际数据点之间差距的平方和最小。因为是平方,所以上偏和下偏都会被计算,而且大的偏差受到的惩罚远大于小的偏差。

你可以在几行代码中看到整个过程:

python
1import numpy as np
2import statsmodels.api as sm
3
4x = np.array([1400, 1600, 1700, 1875, 2350, 2450]) # 房子面积
5y = np.array([245, 312, 279, 308, 405, 324]) # 价格(千美元)
6
7X = sm.add_constant(x) # 添加截距项 'a'
8model = sm.OLS(y, X).fit()
9print(model.params) # 输出 a 和 b

现在把它应用到市场中。在交易中,你的 y 变成资产的收益,x 变成你相信能预测该收益的因子。斜率变成你对这个因子的敏感度。而那个不起眼的截距 a,变成了量化金融中最重要的一个数字。原因如下。

第二部分:阿尔法到底是什么

Roan - inline image

总收益可以分为两部分:市场能解释的部分——贝塔,和市场无法解释的部分——阿尔法。

大多数交易员用“阿尔法”这个词来指代利润。这是错误的,而且这个错误代价高昂。

阿尔法是你的策略赚取且不能被已知风险因子解释的收益。如果你一年赚了 20%,但市场也涨了 20%,那么你的阿尔法是零。你只是持有了贝塔——承担市场风险所获得的收益。你因为乘上了浪潮而得到报酬,而非因为技巧。

这个区别是整个游戏的核心,而回归分析正是分离这两者的利器。基础模型是:你的策略在时间 t 的收益 rₜ,等于一个基准加上对因子 Xₜ 的暴露再加上噪音:

rₜ = α + β Xₜ + εₜ

慢慢读。β 是你对因子的敏感度。如果因子是市场,贝塔表明当市场变动时你的策略变动有多大。εₜ 是随机噪音,任何因子都无法解释的部分。而 α 这个截距,则是当因子贡献为零时你平均赚取的收益。

这个截距就是全部奖赏。如果在剔除所有已知风险因子后,你的策略仍然显示出正向且统计上显著的阿尔法,那么你找到了真正的东西。如果阿尔法在考虑因子后就消失了,那你从来没有过优势。你只是伪装成天才的伪贝塔。

1968 年,Michael Jensen 首次用这种方式界定技巧,他测试了共同基金经理是否真的能击败市场。他运行了这个精确的回归,然后问了一个问题:截距是否显著不为零?将近六十年后,这仍然是机构评估业绩的方法。它被称为 Jensen 阿尔法,是这个学科的基石。

**所以,当你构建信号时,你的目标从来不是最大化原始收益。

你的目标是产生一个在剔除已知因子后依然存在的正截距。记住这一点。其他一切都服务于它。**

第三部分:从零构建你的第一个信号

Roan - inline image

一个真正的信号只有在剔除每一个已知因子后才会衡量阿尔法。

我们先构建最简单的真实模型,然后把它提升到机构级别。假设你相信一个资产的收益部分可以通过某个因子来预测:相关资产的前期收益、动量指标、价值指标。单因子回归是:

rₜ = α + β Xₜ + εₜ

在 Python 里,只需要几行代码,而截距是你绝对不能跳过的部分:

python
1import statsmodels.api as sm
2
3# X 是你的因子序列,y 是你想解释的资产收益
4X = sm.add_constant(X) # 这一行创建了你的阿尔法截距
5model = sm.OLS(y, X).fit()
6print(model.summary())

那一行 add_constant 不是形式上的步骤。它是创建你阿尔法项的那一行。忘记它就会强制直线通过原点,从而丢弃整个输出中最重要的数字。

但现实世界从来不止一个因子。一个严肃的信号需要考虑多个影响。这就是多因子模型:

rₜ = α + β₁X₁ₜ + β₂X₂ₜ + ... + βₖXₖₜ + εₜ

每个贝塔现在衡量的是在保持其他所有因子不变时,该因子的单独效应。"保持其他所有因子不变"这句话是回归分析安静的超级力量。它孤立了每个因子的独特贡献,剥离了重叠部分。当你将策略收益回归到已建立的因子(市场、规模、价值、动量等)上时,截距中剩下的阿尔法就是你的优势中任何已知因子都无法解释的部分。

python
1import statsmodels.api as sm
2
3# factors 是一个 DataFrame,每列一个因子,与收益 y 对齐
4X = sm.add_constant(factors)
5model = sm.OLS(y, X).fit()
6
7alpha = model.params['const'] # 你的候选优势
8p_alpha = model.pvalues['const'] # 可信程度
9print("阿尔法:", round(alpha, 5))
10print("阿尔法 p 值:", round(p_alpha, 4))

这个残差截距就是你的候选信号。接下来的一切都是为了证明它是否真实。

这正是大多数公开教程停止的地方,也是机构工作的真正起点。因子构建、中性化、加权方案——这些将原始信号转化为可交易的投资组合。如果你想了解像 AQR 这样的公司如何精确地将这些回归转化为实盘因子组合,那部分分解我会讲得非常详细。

第四部分:像机构研究员一样解读输出结果

Roan - inline image

专业人士不会问收益有多大。他们问的是:对这个收益不是巧合的把握有多大?

当你运行那个 summary 时,大多数人会扫一眼一个数字就继续。训练有素的研究员会像阅读诊断报告一样阅读它。以下是真正重要的内容。

系数及其符号。 每个贝塔都给出方向和强度。在相信任何数字之前,先问这个符号在经济上是否合理。如果你的模型说某物越贵越该买,而你无法解释原因,那么你发现的是巧合,不是因子。

p 值。 这是一切的核心。它回答一个问题:如果这个因子真的没有影响,我仅凭随机性看到如此强的关系的可能性有多大?p 值为 0.62 意味着有 62% 的概率你看到的只是随机运气。低于 0.05 是认真对待结果的常规门槛。一个量化分析师看到 p 值为 0.62 的失败模型时,他看到的不是弱信号。他看到的纯粹是噪音。

R 平方。 你的模型解释的收益变动比例。这里有一个让初学者完全困惑的点:在收益预测中,高 R 平方通常是警告,而不是奖杯。真实的收益信号是微弱的。0.01 或 0.02 的 R 平方如果持续且真实,可能极其有利可图。如果你在收益预测中看到 0.9,那么你几乎肯定有前视偏差,或者不小心把某个东西对它自身做了回归。

t 统计量。 系数除以其标准误差。粗略规则是 t 统计量绝对值大于 2 对应 0.05 的阈值。严肃的研究员在一个全新的信号上要求 3 或更高,正是因为他们知道在这个信号之前他们已经悄悄测试过多少个信号。

你可以直接提取这些值,而不是阅读整个表格:

python
1print("t 统计量:\n", model.tvalues)
2print("p 值:\n", model.pvalues)
3print("R 平方:", round(model.rsquared, 4))

记住这个转变。初学者问的是收益有多大。专业人士问的是我对这个收益不是巧合的把握有多大。这一个问题的改变就是全部的区别。

第五部分:区分真实信号与噪音的检验方法,以及信号为何会消亡

Roan - inline image

让你的每个候选信号都经历同样的考验。几乎没有信号能存活下来,而这正是关键所在。

残酷的事实是:如果你测试足够多的随机信号,其中一些会纯粹靠运气显得有利可图。在 0.05 的显著性水平下测试 100 个无用的信号,大约有 5 个会仅凭运气通过。这就是多重比较问题,也是回测欺骗人的头号原因。以下是严肃的交易台如何防范它。

样本外测试。 永远不要在你用来构建信号的数据上评判它。分割你的历史数据。用第一部分构建模型,在模型从未见过的部分上测试。真正的信号会通过这个检验。拟合的幻想在遇到新数据时瞬间崩塌。这是不可协商的。

python
1split = int(len(y) * 0.8)
2X_train, X_test = X[:split], X[split:]
3y_train, y_test = y[:split], y[split:]
4
5model = sm.OLS(y_train, X_train).fit()
6oos_pred = model.predict(X_test) # 在未见过的数据上测试

信息系数(IC)。 机构因子研究员很少依赖单次回归。他们反复计算 IC——因子值与实际未来收益之间的相关性,跨越多个时期。一个平均 IC 高于约 0.03 到 0.05 并且跨多个时期保持稳定的因子,胜过一次漂亮的单一回测。跨不同市场状态的稳定性才是真正的指标。

Newey-West 标准误。 金融数据破坏了 OLS 的一个核心假设,因为收益和波动率在时间上聚集。原始的 p 值会撒谎,通常会美化你的信号。Newey-West 修正了你的标准误,以应对这种情况。使用它的人默默地表明他们知道自己在做什么。

python
1# Newey-West 修正后的显著性,机构默认做法
2model = sm.OLS(y, X).fit(cov_type='HAC', cov_kwds={'maxlags': 5})
3print(model.summary())

多重比较修正。 如果你尝试了 50 个信号,你不能用常规的标准来评判胜出者。简单的防御是 Bonferroni 修正:将你的阈值除以你测试的次数。尝试了 50 个信号?要求 p 值低于 0.001,而不是 0.05。这很残酷,但这就是重点。它迫使你诚实地面对你进行了多少次尝试。

让一个候选信号经过样本外验证、稳定的 IC、Newey-West 显著性检验和多重比较修正。如果它仍然屹立不倒,那么你拥有的是大多数散户交易员一生都无法产出的东西——一个你真的赢得了信任权利的信号。

但请理解最终的真相:即使是真实的信号也会衰减。阿尔法存在于市场无效性之中,而一旦信号被知晓并交易,交易本身就会把无效性推开。最近关于因子拥挤的研究显示,机械的、容易复制的信号(如简单的动量)随着资本涌入会沿着一条清晰可预测的曲线衰减,而且一旦通过 ETF 使因子投资变得廉价,这种拥挤会急剧加速。最简单的信号最拥挤,消亡得最快。持久的优势存在于那些需要真正努力才能构建的信号中,以及一个能比旧信号衰减更快地产生新信号的研究流程中。这就是为什么文艺复兴公司三十年来没有一天停止过研究。

作业: 选取一个你目前相信的信号。用你数据中最近 20% 的部分(假装你从未见过这部分数据)运行它。如果阿尔法消失了,你刚刚为自己省下了一笔真金白银。这是你将要运行的最有价值的测试。

第六部分:你刚刚构建了什么——端到端视图

Roan - inline image

每一个真实的信号都会随着拥挤而衰减。能够替换它们的研究引擎才是真正的优势。

退一步,看看你现在拥有的完整流程,因为各个部分连成了一条干净的流水线。

你从一个因子开始——任何你相信包含未来收益信息的变量。你用 OLS 将你的资产收益对该因子进行回归,始终包含截距项,这个截距就是你的候选阿尔法。你扩展为多因子回归,使得你的阿尔法只有在已知风险因子(市场、规模、价值、动量)被剔除后才被衡量。截距中剩余的部分就是纯粹、无法解释的优势。

然后你对其进行审问。你读取 p 值来判断它是否可能是运气。你检查符号的经济意义。你忽略诱人的高 R 平方,而是尊重微小但诚实的部分。你在模型从未接触过的数据上进行样本外验证。你跨多个时期计算信息系数,以确认它是稳定的,而不是一次性巧合。你用 Newey-West 修正标准误,这样市场的时序结构就不会欺骗你。你还应用多重比较修正,这样你尝试过的信号数量就不能制造出一个虚假的胜者。

最终输出的不是一个猜测。它是一个具有可衡量优势、已知置信水平、在未见过数据上存活证明的诚实信号,以及它是真实的可能性有多高。这就是那个模型两周就死掉的人与那个构建了持久模型的人之间的区别。

而实际赚钱的方式是这样的:一个虽然小但真实且稳定的优势,在众多独立机会上正确配置,会不断复利。文艺复兴公司的正确率勉强超过一半,却将其变成了市场历史上最大的财富——因为优势是真实的、可重复的,并且在巨额数量的赌注中得到了正确的规模配置。你现在正在使用同样的蓝图。构建信号,证明它是真实的,合理配置规模,并在其 IC 开始衰减时立即替换它。

这个替换循环就是整个职业生涯。一个信号是一笔交易。一个能够持续产生真实信号、且速度快于旧信号衰减速度的研究过程,才是一个可持续的事业。

总结

线性回归不是你跳过的那种无聊工具。它在你的数据中画出最佳直线,它定义了阿尔法的真正含义,它构建了你的第一个真实信号,它测试这个信号是真实的还是噪音,并且在信号开始消亡时提醒你。

阿尔法是在剔除所有已知风险因子后依然存在的截距。你用 OLS 构建一个候选——先是单因子,然后是多因子。你像研究员一样解读输出结果:p 值和稳定性比收益的大小更重要。你用样本外验证、稳定的信息系数、Newey-West 误差修正以及对你尝试过的信号数量进行修正来防御多重比较陷阱。你接受每一个真实信号都会衰减的事实,这意味着真正的优势是研究引擎本身,而不是任何一个单独的模型。正是同一个引擎造就了历史上最伟大的基金。

那个盯着夏普比率为 0.03、p 值为 0.62 的量化交易员并非运气不好。他跳过了本文中的这些纪律。不要成为他。

下面这个问题我希望你思考一下:

如果真实的阿尔法在广为人之时就开始衰减,那么发布信号会摧毁它,而隐藏信号意味着它仍会随着其他人独立发现而缓慢消亡。

那么,持久的优势究竟从何而来?是信号本身,还是替换它们的研发速度?

你的答案将揭示你是在像一个追逐一次大胜的交易员那样思考,还是像一个构建了能打印优势几十年的机器的量化分析师那样思考。

在评论区留下你的答案。没有错误答案。但有些答案很有启发性。

Збереження в один клік

Використовуйте YouMind для AI-глибокого читання віральних статей

Зберігайте джерела, ставте цілеспрямовані запитання, підсумовуйте аргументи та перетворюйте віральні статті на корисні нотатки в одному AI-робочому просторі.

Дослідити YouMind
Для авторів

Перетворіть свій Markdown на охайну статтю для 𝕏

Коли ви публікуєте власні лонгріди, зображення, таблиці та блоки коду роблять форматування в 𝕏 складним. YouMind перетворює повну чернетку в Markdown на чисту статтю для 𝕏, готову до публікації.

Спробувати Markdown для 𝕏

Більше патернів для аналізу

Останні віральні статті

Переглянути більше віральних статей