一、多空组合基础:因子套利概念、多空组合定义、市场中性原理
各位同学,今天我们来聊聊因子套利中最核心的一个概念——多空组合。说实话,这个知识点我当年刚入行时也绕了不少弯路。记得我第一次做量化策略,满脑子都是「找到好股票就买入」,结果市场一跌,回撤大得吓人。后来才明白,真正的量化对冲,靠的是多空组合这把双刃剑。
1.1 因子套利是什么?
因子套利,说白了就是利用某个因子(比如价值因子、动量因子)的预测能力,做多因子得分高的股票,同时做空因子得分低的股票。你想想看,如果这个因子真的有效,那么多头涨、空头跌,两头赚钱,多舒服?
但现实没那么简单。我在项目中遇到过这样的情况:某个因子在回测中表现极好,实盘一跑,多头涨了,空头也涨了——结果两头亏。为什么?因为市场整体在涨,空头那头亏得更多。这就是我们需要市场中性原理的原因。
1.2 多空组合的定义
多空组合,就是同时持有多头和空头头寸的投资组合。具体来说:
- 多头端:买入因子得分最高的股票(比如前10%的股票)
- 空头端:卖出(融券)因子得分最低的股票(比如后10%的股票)
- 组合收益 = 多头收益 - 空头收益
嗯,这里要注意:空头端不是「不买」,而是「卖出」。你借来股票卖掉,等跌了再买回来还掉。这个机制在国内做起来有点麻烦,融券成本高、标的少,但原理是一样的。
我个人习惯把多空组合想象成一个跷跷板。多头这边压下去,空头那边翘起来,中间的支点就是市场。如果市场整体波动,跷跷板两端一起上下,但相对位置不变——这就是市场中性。
1.3 市场中性原理
市场中性,就是让组合对市场整体的涨跌不敏感。怎么做到?让多头的市场暴露(Beta)等于空头的市场暴露。简单说,多头的Beta ≈ 空头的Beta,这样市场涨跌对组合的影响就抵消了。
举个例子:
| 头寸 | 市值 | Beta | 市场涨1%的影响 |
|---|---|---|---|
| 多头 | 100万 | 1.2 | +1.2万 |
| 空头 | 100万 | 1.2 | -1.2万 |
| 组合 | 0 | 0 | 0 |
你看,市场涨1%,多头赚1.2万,空头亏1.2万,组合净收益为0。这就是市场中性。但现实中很难做到完美中性,因为Beta会变,股票也会变。我曾经吃过这个亏:以为中性了,结果市场暴跌,空头那头Beta突然变大,组合亏得一塌糊涂。
1.4 多空组合的收益来源
多空组合的收益,来自因子本身的预测能力。如果因子有效,那么多头股票的平均收益 > 空头股票的平均收益。这个差值就是因子溢价。
但这里有个坑:因子溢价不是白拿的。你承担了因子风险——比如价值因子可能长期跑输成长因子,动量因子可能突然反转。我见过有人用动量因子做多空,结果遇到市场风格切换,一个月亏掉20%。
所以,做多空组合之前,先问自己三个问题:
- 这个因子真的有预测能力吗?(回测过吗?过拟合了吗?)
- 空头端能顺利做空吗?(融券成本、流动性够吗?)
- 组合真的中性了吗?(行业、市值、波动率都控制了吗?)
1.5 知识体系框架
下面这张图,是我自己总结的多空组合核心逻辑。你看一眼,基本就明白整个章节在讲什么了。
这张图把三个核心概念串起来了。因子套利是「为什么做」,多空组合是「怎么做」,市场中性是「怎么做好」。三者缺一不可。
1.6 一个简单的代码示例
最后,我给大家一个Python代码片段,演示如何构建一个最简单的多空组合。别嫌简单,核心逻辑都在里面了。
import pandas as pd
import numpy as np
# 假设我们有一个因子得分数据
# factor_scores: 每只股票的因子得分
# returns: 每只股票的收益率
def build_long_short_portfolio(factor_scores, returns, top_pct=0.1, bottom_pct=0.1):
"""
构建多空组合
"""
# 按因子得分排序
sorted_idx = np.argsort(factor_scores)
n = len(factor_scores)
# 选多头(得分最高的10%)
long_idx = sorted_idx[-int(n * top_pct):]
# 选空头(得分最低的10%)
short_idx = sorted_idx[:int(n * bottom_pct)]
# 等权重配置
long_return = returns[long_idx].mean()
short_return = returns[short_idx].mean()
# 多空组合收益
portfolio_return = long_return - short_return
return portfolio_return
# 使用示例
factor_scores = np.random.randn(100) # 100只股票的因子得分
returns = np.random.randn(100) * 0.02 # 日收益率
result = build_long_short_portfolio(factor_scores, returns)
print(f"多空组合收益: {result:.4f}")
这段代码虽然简单,但包含了多空组合的核心思想:选多头、选空头、计算差值。实际项目中,你还要考虑权重优化、风险控制、交易成本等等。但万丈高楼平地起,先把基础打牢。
公众号:蓝海数据掘金营,微信deep3321