Refactor code structure for improved readability and maintainability
This commit is contained in:
parent
9546279fcf
commit
6fa2761380
Binary file not shown.
|
After Width: | Height: | Size: 800 KiB |
|
|
@ -0,0 +1,647 @@
|
|||
# Alpha 因子研究详解
|
||||
## `quant_alpha_factor_demo.py` 学习文档
|
||||
|
||||
> **目标读者**:量化入门者,已完成前三篇学习
|
||||
> **配套文件**:`quant_alpha_factor_demo.py`
|
||||
> **前置知识**:建议先阅读前三篇文档
|
||||
> **系列位置**:第 4 篇 — Alpha 因子研究篇
|
||||
|
||||
---
|
||||
|
||||
## 目录
|
||||
|
||||
1. [什么是 Alpha 因子?](#1-什么是-alpha-因子)
|
||||
2. [因子动物园:主要因子流派](#2-因子动物园factor-zoo)
|
||||
3. [合成股票池:为什么需要多只股票?](#3-合成股票池)
|
||||
4. [五个经典因子详解](#4-五个经典因子详解)
|
||||
5. [因子预处理:三步标准化流程](#5-因子预处理三步标准化)
|
||||
6. [IC 分析:量化因子预测能力](#6-ic-分析information-coefficient)
|
||||
7. [分层回测:直观验证因子有效性](#7-分层回测quantile-analysis)
|
||||
8. [因子合成:1+1 > 2](#8-因子合成factor-combination)
|
||||
9. [多空组合:因子的实际落地](#9-多空组合long-short-portfolio)
|
||||
10. [因子衰减:信号会过时](#10-因子衰减factor-decay)
|
||||
11. [结果解读与局限性](#11-结果解读与局限性)
|
||||
12. [术语速查表](#12-术语速查表)
|
||||
|
||||
---
|
||||
|
||||
## 1. 什么是 Alpha 因子?
|
||||
|
||||
### 1.1 从一个比喻说起
|
||||
|
||||
想象你是一个选股顾问,每天从 3000 只 A 股中挑出最有潜力的 50 只。你会怎么做?
|
||||
|
||||
初学者可能说:"涨得多的买,跌得多的卖。"
|
||||
有经验的人可能说:"找低估值、高成长、低波动的股票。"
|
||||
|
||||
**Alpha 因子 (Alpha Factor)** 就是这些选股思路的**数学化表达**——用一个公式,对每只股票算出一个"分数",分数越高,预期未来收益越高。
|
||||
|
||||
### 1.2 Alpha 的准确含义
|
||||
|
||||
在金融学中,收益被分解为两部分:
|
||||
|
||||
```
|
||||
股票总收益 = Beta 收益 + Alpha 收益
|
||||
股票总收益 = (跟随大盘的那部分) + (超出大盘的那部分)
|
||||
```
|
||||
|
||||
| 术语 | 中文 | 含义 |
|
||||
|------|------|------|
|
||||
| **Beta (β)** | 市场贝塔 / 系统性风险 | 随市场涨跌的收益——"大盘涨了 10%,我的股票也涨了 8%" |
|
||||
| **Alpha (α)** | 超额收益 / 选股能力 | 超越市场的额外收益——"大盘涨了 5%,但我的策略赚了 20%" |
|
||||
|
||||
**Alpha 因子**的目标就是找到那些能预测"未来超额收益"的信号。
|
||||
|
||||
### 1.3 因子 vs. 策略
|
||||
|
||||
很多初学者会混淆"因子"和"策略"的概念:
|
||||
|
||||
| | 因子 (Factor) | 策略 (Strategy) |
|
||||
|--|--------------|----------------|
|
||||
| 本质 | 一个截面排名信号(谁更好?) | 一套完整的买卖规则 |
|
||||
| 例子 | MOM = 12月动量 | "当 MOM > 0 时买入,< 0 时卖出" |
|
||||
| 分析方法 | IC、分层回测 | 净值曲线、夏普比率 |
|
||||
| 应用范围 | **多只股票的横截面** | 单只或多只股票的时间序列 |
|
||||
|
||||
因子是选股的"原材料",策略是用因子构建的"成品"。
|
||||
|
||||
---
|
||||
|
||||
## 2. 因子动物园(Factor Zoo)
|
||||
|
||||
学术界发现的因子多达 300+ 个,被戏称为"因子动物园 (Factor Zoo)"。按经济学逻辑,主要分为以下几大类:
|
||||
|
||||
### 2.1 行为金融类因子(最常用)
|
||||
|
||||
| 因子 | 中文 | 核心逻辑 | 代表论文 |
|
||||
|------|------|----------|----------|
|
||||
| **Momentum** | 动量因子 | 赢家继续赢,输家继续输(追涨惯性)| Jegadeesh & Titman (1993) |
|
||||
| **Reversal** | 反转因子 | 短期过度涨跌会均值回归 | Jegadeesh (1990) |
|
||||
| **Post-Earnings Drift** | 盈利漂移 | 超预期财报后股价持续漂移 | Ball & Brown (1968) |
|
||||
|
||||
### 2.2 风险溢价类因子(有理论支撑)
|
||||
|
||||
| 因子 | 中文 | 核心逻辑 |
|
||||
|------|------|----------|
|
||||
| **Low Volatility** | 低波动因子 | 低波动股票的风险调整后收益更高(违反 CAPM)|
|
||||
| **Low Beta** | 低贝塔因子 | 低市场敏感性股票长期跑赢(BAB 效应)|
|
||||
| **Illiquidity** | 非流动性因子 | 流动性差的股票有额外的流动性溢价 |
|
||||
|
||||
### 2.3 基本面类因子(需要财报数据)
|
||||
|
||||
| 因子 | 中文 | 核心逻辑 |
|
||||
|------|------|----------|
|
||||
| **Value (B/P, E/P)** | 价值因子 | 低估值股票长期跑赢(价值投资量化版)|
|
||||
| **Profitability (ROE)** | 盈利能力 | 高盈利质量公司持续超额收益 |
|
||||
| **Growth** | 成长因子 | 营收/利润高速增长的公司 |
|
||||
|
||||
> 本 Demo 聚焦于**纯价格/成交量因子**(无需财报),这也是因子研究的起点。
|
||||
|
||||
---
|
||||
|
||||
## 3. 合成股票池
|
||||
|
||||
### 3.1 为什么需要多只股票?
|
||||
|
||||
前三篇 Demo 分析的都是**单只股票随时间**的变化(时间序列)。
|
||||
|
||||
Alpha 因子研究是一种完全不同的分析维度:
|
||||
|
||||
```
|
||||
时间序列分析: 分析同一只股票在不同时间的行为
|
||||
苹果公司 → 2020, 2021, 2022, ...
|
||||
|
||||
截面分析: 在同一个时间点,比较不同股票之间的差异
|
||||
2023-01-01 → 苹果, 谷歌, 微软, 亚马逊, ...
|
||||
```
|
||||
|
||||
因子的"截面预测能力"是指:**在某一天,因子值高的股票,是否在未来一段时间表现更好**?
|
||||
|
||||
这需要"同一天、多只股票"的数据——即**横截面数据 (Cross-Sectional Data)**。
|
||||
|
||||
### 3.2 隐藏因子生成模型
|
||||
|
||||
为了让演示中的因子真实有效,本 Demo 使用了一个**隐藏因子生成模型 (Hidden Factor Generative Model)**,向合成数据中注入"真实的 Alpha":
|
||||
|
||||
```
|
||||
每只股票每天的收益 = 市场风险 + 质量 Alpha + 动量 Alpha + 噪音
|
||||
= β × r_市场 + λ_q × Q_i,t + λ_m × M_i,t + ε_i,t
|
||||
```
|
||||
|
||||
| 成分 | 符号 | 变化速度 | 含义 |
|
||||
|------|------|----------|------|
|
||||
| 市场风险 | β × r_市场 | 每日变化 | 所有股票共同承担的市场涨跌 |
|
||||
| 质量 Alpha | λ_q × Q_i,t | 季度持续 | 该股票的"潜在质量分",缓慢变化 |
|
||||
| 动量 Alpha | λ_m × M_i,t | 月度持续 | 该股票的"当前动量状态",适度变化 |
|
||||
| 特质噪音 | ε_i,t | 每日随机 | 无法预测的随机波动 |
|
||||
|
||||
**关键点**:Q 和 M 是**不可直接观察的隐藏变量**。
|
||||
Alpha 因子的价值就在于:**用可观察的价格数据(动量、波动率等)来间接估计这些隐藏的质量/动量分数**。
|
||||
|
||||
---
|
||||
|
||||
## 4. 五个经典因子详解
|
||||
|
||||
### 4.1 动量因子(MOM)— 追涨惯性
|
||||
|
||||
**来源**:Jegadeesh & Titman (1993)
|
||||
**直觉**:股票市场存在"趋势延续"效应——过去 6-12 个月的赢家,未来 3-12 个月通常继续赢。
|
||||
|
||||
$$\text{MOM}_{i,t} = \frac{P_{i,t-21}}{P_{i,t-252}} - 1$$
|
||||
|
||||
| 参数 | 说明 |
|
||||
|------|------|
|
||||
| $P_{i,t-21}$ | 股票 i 在 t-21 日(约 1 个月前)的价格 |
|
||||
| $P_{i,t-252}$ | 股票 i 在 t-252 日(约 12 个月前)的价格 |
|
||||
| 计算窗口 | 从 12 个月前 到 1 个月前(跳过最近 1 个月)|
|
||||
|
||||
**为什么要跳过最近 1 个月?**
|
||||
|
||||
最近 1 个月的收益往往会**短期反转 (Short-Term Reversal)**,这是由于做市商 (Market Maker) 的库存调整和买卖价差摩擦导致的微观结构效应。如果不跳过最近 1 个月,反转效应会污染动量信号。
|
||||
|
||||
```python
|
||||
# 代码实现
|
||||
MOM_LONG = 252 # 12 个月
|
||||
MOM_SHORT = 21 # 跳过 1 个月
|
||||
|
||||
factor_mom = prices_df.shift(MOM_SHORT) / prices_df.shift(MOM_LONG) - 1.0
|
||||
# ↑ P[t-21] ↑ P[t-252]
|
||||
```
|
||||
|
||||
**本 Demo 实验结果**:
|
||||
- IC 均值 = **+0.065** ★ 有效
|
||||
- ICIR = **+0.452**(接近 0.5 的优良水平)
|
||||
- 这是因为隐藏质量/动量因子高的股票,自然同时有高 12M 动量 AND 高未来收益
|
||||
|
||||
### 4.2 短期反转因子(REV)— 均值回归
|
||||
|
||||
**来源**:Jegadeesh (1990)
|
||||
**直觉**:上个月涨太多的股票,下个月往往小幅回调;跌太多的往往反弹。
|
||||
|
||||
$$\text{REV}_{i,t} = -\left(\frac{P_{i,t}}{P_{i,t-21}} - 1\right)$$
|
||||
|
||||
取负号是为了保持"因子值越高 → 预期收益越高"的正方向约定:
|
||||
- 上个月大跌(负收益)→ REV 为正 → 预期反弹 → 因子值高 ✓
|
||||
|
||||
**本 Demo 实验结果**:
|
||||
- IC 均值 = **-0.050**(负!意料之中)
|
||||
- 为什么是负的?因为我们的数据中注入了"动量 Alpha"——动量强的股票上个月涨、下个月还要涨,REV 反而是负向预测。这是一个很好的教学点:**同一个市场中,因子之间可能互相矛盾**。
|
||||
|
||||
### 4.3 低波动因子(LVOL)— 低波动异象
|
||||
|
||||
**来源**:Baker, Bradley & Wurgler (2011)
|
||||
**直觉**:根据传统金融理论,高风险应获高回报。但实证研究发现,低波动股票的**原始收益**也更高,即"低波动异象 (Low-Volatility Anomaly)"。
|
||||
|
||||
$$\text{LVOL}_{i,t} = -\sigma_{i,t-60:t}$$
|
||||
|
||||
其中 $\sigma$ 是过去 60 交易日的日收益率标准差(年化波动率的代理指标)。
|
||||
|
||||
取负号:波动率越低 → LVOL 越高 → 预期收益越高。
|
||||
|
||||
**可能的解释**:
|
||||
- 机构投资者受"跑赢基准"的业绩压力,被迫偏爱高贝塔/高波动股票,导致这些股票被高估
|
||||
- 散户偏好"彩票式"高波动股票(类似买彩票),也导致高波动股票被高估
|
||||
- 低波动股票更少被卖空,保护其免遭过度高估后的暴跌
|
||||
|
||||
### 4.4 低贝塔因子(BAB)— 赌对低贝塔
|
||||
|
||||
**来源**:Frazzini & Pedersen (2014) "Betting Against Beta"
|
||||
**直觉**:CAPM 预测 β = 1.5 的股票比 β = 0.5 的股票多 50% 的期望收益。但实际上两者差距远小于理论值,甚至低贝塔股票反而更赚钱。
|
||||
|
||||
$$\text{BAB}_{i,t} = -\hat{\beta}_{i,t}^{(60D)}$$
|
||||
|
||||
$$\hat{\beta}_{i,t} = \frac{\text{Cov}(r_i, r_{\text{mkt}})_{60D}}{\text{Var}(r_{\text{mkt}})_{60D}}$$
|
||||
|
||||
**代码实现**(完全向量化,不用 Python 循环):
|
||||
```python
|
||||
# 利用 pandas rolling 方法批量计算所有股票的滚动贝塔
|
||||
rolling_var_mkt = market_series.rolling(60).var() # 市场方差
|
||||
rolling_cov = log_ret_df.apply(
|
||||
lambda col: col.rolling(60).cov(market_series) # 各股协方差
|
||||
)
|
||||
rolling_beta_df = rolling_cov.div(rolling_var_mkt, axis=0) # β = Cov/Var
|
||||
factor_bab = -rolling_beta_df # 取负值
|
||||
```
|
||||
|
||||
### 4.5 Amihud 非流动性因子(ILLIQ)— 流动性溢价
|
||||
|
||||
**来源**:Amihud (2002) "Illiquidity and Stock Returns"
|
||||
|
||||
$$\text{ILLIQ}_{i,t} = \frac{1}{D} \sum_{d=t-D}^{t} \frac{|r_{i,d}|}{V_{i,d}}$$
|
||||
|
||||
| 符号 | 含义 |
|
||||
|------|------|
|
||||
| $|r_{i,d}|$ | 第 d 日的绝对日收益率 |
|
||||
| $V_{i,d}$ | 第 d 日的成交量(元) |
|
||||
| D = 20 | 过去 20 个交易日 |
|
||||
|
||||
**含义**:"每元成交量能引起多大的价格波动?"
|
||||
|
||||
- ILLIQ 高 → 流动性差(小单也能推动价格)→ 投资者要求更高回报 → **流动性溢价 (Liquidity Premium)**
|
||||
|
||||
---
|
||||
|
||||
## 5. 因子预处理:三步标准化
|
||||
|
||||
原始因子值"脏"得没法直接用,必须经过以下三步清洗:
|
||||
|
||||
### Step 1:截面去极值(Winsorization)
|
||||
|
||||
**问题**:某天某股票的动量值是 +500%(因为遭遇了重组事件),这个极端值会完全主导本日截面的相关系数计算。
|
||||
|
||||
**解决**:在每个截面,将超出 $[\mu - 3\sigma, \mu + 3\sigma]$ 的值截断到边界。
|
||||
|
||||
```
|
||||
原始: [5%, 12%, 8%, 500%, -2%, 9%]
|
||||
↓
|
||||
去极值: [5%, 12%, 8%, 46%, -2%, 9%] ← 500% 被截断到 3σ 边界
|
||||
```
|
||||
|
||||
```python
|
||||
# 向量化实现(无 Python 循环)
|
||||
mu = factor_df.mean(axis=1) # 每日截面均值
|
||||
sig = factor_df.std(axis=1) # 每日截面标准差
|
||||
lower = (mu - 3 * sig).values[:, np.newaxis] # 广播到矩阵形状
|
||||
upper = (mu + 3 * sig).values[:, np.newaxis]
|
||||
clipped = np.clip(factor_df.values, lower, upper)
|
||||
```
|
||||
|
||||
### Step 2:截面 Z-score 标准化
|
||||
|
||||
**问题**:动量因子单位是%(典型值 ±30%),ILLIQ 单位是极小的小数(1e-10 量级),无法比较和相加。
|
||||
|
||||
**解决**:在每个截面,对因子进行 Z-score 标准化,使均值=0,标准差=1。
|
||||
|
||||
$$z_{i,t} = \frac{x_{i,t} - \bar{x}_t}{\sigma_t}$$
|
||||
|
||||
标准化后:
|
||||
- 不同因子量纲统一,可以直接相加(因子合成时需要)
|
||||
- Z-score > 0 → 该股票因子值高于同期平均
|
||||
- Z-score < 0 → 该股票因子值低于同期平均
|
||||
|
||||
### Step 3:市值中性化(Market Cap Neutralization)
|
||||
|
||||
**问题**:在 A 股市场,小市值股票往往同时具有高动量、高波动、低流动性。如果不剔除市值效应,动量因子可能只是在选小市值股票,并非真正的动量信号。
|
||||
|
||||
**解决**:对 log(市值) 做 OLS 回归,用**残差**替换原因子值:
|
||||
|
||||
$$\text{factor\_neutral}_i = \text{factor}_i - (\hat{\alpha} + \hat{\beta} \cdot \log(\text{mktcap}_i))$$
|
||||
|
||||
```python
|
||||
# 每个截面: y = alpha + beta * x + residual
|
||||
y_c = factor_values # (50,) 各股因子值
|
||||
x_c = log_mktcap_values # (50,) 各股对数市值
|
||||
|
||||
xm, ym = x_c.mean(), y_c.mean()
|
||||
slope = np.dot(x_c - xm, y_c - ym) / np.dot(x_c - xm, x_c - xm)
|
||||
residuals = y_c - (ym + slope * (x_c - xm)) # 市值中性化后的因子值
|
||||
```
|
||||
|
||||
**形象比喻**:
|
||||
这就像做标准化考试时,把"学生身高"这个干扰变量从"篮球成绩"中剔除——矮的学生篮球技术再好,也会因为身高被低估,剔除后才能真正比较技术水平。
|
||||
|
||||
---
|
||||
|
||||
## 6. IC 分析(Information Coefficient)
|
||||
|
||||
### 6.1 IC 的定义
|
||||
|
||||
$$\text{IC}_t = \text{SpearmanCorr}\left(\text{factor}_{t,\cdot},\ \text{return}_{t+H,\cdot}\right)$$
|
||||
|
||||
在日期 t,计算截面 **Spearman 秩相关系数**:
|
||||
- 左侧:50 只股票在 t 日的因子值(处理后)
|
||||
- 右侧:这 50 只股票在未来 H=21 日的收益率
|
||||
|
||||
**为什么用 Spearman 秩相关而不用 Pearson 线性相关?**
|
||||
|
||||
| | Pearson | Spearman |
|
||||
|--|---------|----------|
|
||||
| 计算 | $(X - \bar{X}) \cdot (Y - \bar{Y})$ 的相关 | $\text{rank}(X)$ 与 $\text{rank}(Y)$ 的相关 |
|
||||
| 假设 | 线性关系 | 只需单调关系 |
|
||||
| 对极端值 | 敏感 | 鲁棒 |
|
||||
| 量化研究常用 | ○ | ✓ 更常用 |
|
||||
|
||||
### 6.2 ICIR:IC 的信噪比
|
||||
|
||||
$$\text{ICIR} = \frac{\text{IC 均值}}{\text{IC 标准差}}$$
|
||||
|
||||
ICIR 就是"IC 序列的夏普比率"——衡量因子预测能力的**稳定性**:
|
||||
|
||||
| ICIR | 含义 |
|
||||
|------|------|
|
||||
| < 0.3 | 不稳定,可能只是偶然 |
|
||||
| 0.3 ~ 0.5 | 有一定稳定性 |
|
||||
| > 0.5 | 稳定的 Alpha 信号 |
|
||||
|
||||
### 6.3 IC 评价标准
|
||||
|
||||
| 指标 | 强因子 | 有效因子 | 弱因子 |
|
||||
|------|--------|----------|--------|
|
||||
| \|IC 均值\| | > 0.10 | 0.05~0.10 | < 0.05 |
|
||||
| ICIR | > 0.5 | 0.3~0.5 | < 0.3 |
|
||||
| IC > 0 比率 | > 60% | 55%~60% | < 55% |
|
||||
|
||||
### 6.4 本 Demo 的 IC 结果解读
|
||||
|
||||
| 因子 | IC 均值 | ICIR | 解读 |
|
||||
|------|---------|------|------|
|
||||
| MOM ★ | +0.065 | +0.452 | 动量有效!因为高质量/高动量股票有持续的正 Alpha |
|
||||
| REV | -0.050 | -0.273 | 反转因子在此模型中"反着来"——短期涨的股票继续涨(动量效应更强)|
|
||||
| LVOL | -0.010 | -0.028 | 近乎无效——数据中没有注入"低波动溢价"的 Alpha |
|
||||
| BAB | -0.010 | -0.027 | 近乎无效——原因同上 |
|
||||
| ILLIQ | +0.009 | +0.058 | 极弱——有轻微的流动性溢价信号 |
|
||||
|
||||
> **学习要点**:IC 近零不代表因子"写错了",而是反映了**数据生成机制**。本 Demo 的合成数据中,Alpha 主要来自质量和动量因子,所以 MOM 有效而 LVOL/BAB 无效。真实市场中,多个因子通常都有正 IC,但有时某种因子会在特定市场环境(regime)下失效。
|
||||
|
||||
---
|
||||
|
||||
## 7. 分层回测(Quantile Analysis)
|
||||
|
||||
### 7.1 方法步骤
|
||||
|
||||
分层回测是最直观的因子验证方式:
|
||||
|
||||
```
|
||||
① 在每个调仓日 T,按因子值对 50 只股票从小到大排序
|
||||
② 等分成 5 组(Q1=最低 20%,Q5=最高 20%)
|
||||
③ 各组各构建等权组合,持有 21 天
|
||||
④ 记录各组收益,持续到回测结束
|
||||
```
|
||||
|
||||
**期望的理想结果**:
|
||||
```
|
||||
累积收益: Q5 > Q4 > Q3 > Q2 > Q1 (单调递增)
|
||||
```
|
||||
|
||||
如果因子有效,Q5(因子分最高)应该持续跑赢 Q1(因子分最低)。
|
||||
|
||||
### 7.2 本 Demo 的 MOM 因子分层结果
|
||||
|
||||
| 分组 | 年化收益 | 含义 |
|
||||
|------|----------|------|
|
||||
| Q1(最低动量)| -8.9% | 过去一年最弱势的股票,未来继续弱 |
|
||||
| Q2 | -12.7% | 偏弱 |
|
||||
| Q3 | -5.0% | 中性 |
|
||||
| Q4 | +9.7% | 偏强 |
|
||||
| Q5(最高动量)| +27.9% | 过去一年最强势的股票,未来继续强 |
|
||||
| **L-S(Q5-Q1)**| **+40.1%** | 多空价差,几乎与市场涨跌无关 |
|
||||
|
||||
虽然 Q2 < Q1 有轻微异常(不完全单调),但整体趋势清晰:**高动量 → 高未来收益**。
|
||||
|
||||
### 7.3 分层回测的实现细节
|
||||
|
||||
```python
|
||||
for i in range(len(rebal_dates) - 1):
|
||||
t0, t1 = rebal_dates[i], rebal_dates[i + 1] # 建仓日 / 平仓日
|
||||
|
||||
# 按因子值分组
|
||||
labels = pd.qcut(
|
||||
factor_today.rank(method='first'), # 先取秩(避免重复值问题)
|
||||
n_quantiles, # 分成 5 组
|
||||
labels=["Q1", "Q2", "Q3", "Q4", "Q5"]
|
||||
)
|
||||
|
||||
# 计算等权持有收益
|
||||
hold_ret = price_df.loc[t1] / price_df.loc[t0] - 1.0
|
||||
for q in ["Q1", "Q2", "Q3", "Q4", "Q5"]:
|
||||
stocks_in_q = labels[labels == q].index
|
||||
bucket_returns[q].append(hold_ret[stocks_in_q].mean())
|
||||
```
|
||||
|
||||
**为什么先 `rank()` 再 `qcut()`?**
|
||||
`qcut` 按数值边界分割,如果因子值有重复(e.g., 好几只股票 LVOL 恰好相同),分组会不均匀。先 `rank(method='first')` 将重复值也区分开(先出现的秩更低),再 `qcut` 就能保证每组大小相同。
|
||||
|
||||
---
|
||||
|
||||
## 8. 因子合成(Factor Combination)
|
||||
|
||||
### 8.1 为什么要合成?
|
||||
|
||||
单个因子的 IC 通常只有 0.05~0.10,预测能力有限。多因子合成的优势:
|
||||
|
||||
1. **互补**:不同因子捕捉不同维度的 Alpha,合成后覆盖更多信息源
|
||||
2. **降噪**:单个因子可能在某些时期失效;多因子合成后整体更稳定
|
||||
3. **提升 ICIR**:若各因子 IC 不完全相关,合成后 ICIR > 单个因子的 ICIR
|
||||
|
||||
用统计语言表达:设因子 A 和 B 各自 IC 均值 = $\mu$,IC 相关系数 = $\rho$,则:
|
||||
|
||||
$$\text{ICIR}_{composite} = \frac{2\mu}{2\sigma\sqrt{(1+\rho)/2}} = \frac{\text{ICIR}}{\sqrt{(1+\rho)/2}}$$
|
||||
|
||||
当 $\rho < 1$ 时,合成 ICIR > 单个 ICIR。这就是**多元化的价值**。
|
||||
|
||||
### 8.2 两种合成方法
|
||||
|
||||
**方法1:等权合成 (Equal-Weight Composite)**
|
||||
|
||||
$$\text{Composite}_{EQ,i,t} = \frac{1}{N}\sum_{k=1}^{N} z_{k,i,t}$$
|
||||
|
||||
- 优点:简单、稳健,不依赖历史 IC 估计,不容易过拟合
|
||||
- 缺点:对强因子和弱因子一视同仁
|
||||
|
||||
**方法2:IC 加权合成 (IC-Weighted Composite)**
|
||||
|
||||
$$w_k = \frac{\max(\overline{IC}_k, 0)}{\sum_j \max(\overline{IC}_j, 0)}, \quad \text{Composite}_{ICW,i,t} = \sum_{k=1}^{N} w_k \cdot z_{k,i,t}$$
|
||||
|
||||
- 优点:给更强的因子更高权重,理论上 ICIR 更高
|
||||
- 缺点:历史 IC 可能不稳定(特别是样本期短时),有过拟合风险
|
||||
|
||||
**本 Demo 结果**:
|
||||
|
||||
| 方法 | IC 均值 | ICIR |
|
||||
|------|---------|------|
|
||||
| 等权合成 | +0.036 | +0.237 |
|
||||
| IC 加权 | +0.045 | +0.304 |
|
||||
|
||||
IC 加权略好,因为它把更多权重给了最强的 MOM 因子(权重 88.4%)。
|
||||
|
||||
---
|
||||
|
||||
## 9. 多空组合(Long-Short Portfolio)
|
||||
|
||||
### 9.1 构建逻辑
|
||||
|
||||
多空策略是因子策略的"利润提取机制":
|
||||
|
||||
```
|
||||
每个调仓日(每月):
|
||||
① 计算每只股票的合成因子分
|
||||
② 买入 Top 20%(因子分最高的 10 只)= 多头组合
|
||||
③ 做空 Bottom 20%(因子分最低的 10 只)= 空头组合
|
||||
④ 21 天后平仓,重复
|
||||
```
|
||||
|
||||
### 9.2 市场中性(Market Neutral)
|
||||
|
||||
多空组合最大的优点是**市场中性 (Market Neutral)**:
|
||||
|
||||
```
|
||||
多空收益 = 多头组合收益 - 空头组合收益
|
||||
= (Alpha_long + Beta_long × r_市场) - (Alpha_short + Beta_short × r_市场)
|
||||
≈ Alpha_long - Alpha_short (若 Beta_long ≈ Beta_short,市场影响相消)
|
||||
```
|
||||
|
||||
这意味着:**无论市场大涨大跌,多空组合只赚 Alpha,不受市场影响**。
|
||||
|
||||
### 9.3 本 Demo 结果解读
|
||||
|
||||
| 组合 | 年化收益 | 夏普比率 | 最大回撤 |
|
||||
|------|----------|----------|----------|
|
||||
| 多头 (Long) | +30.9% | 1.36 | -13.9% |
|
||||
| 空头 (Short) | -2.3% | -0.11 | -43.4% |
|
||||
| **多空 (L-S)** | **+33.9%** | **5.19** | **-0.4%** |
|
||||
|
||||
多空 Sharpe 达到 5.19 并最大回撤仅 -0.4%——这是**演示数据** 注入了较强 Alpha 信号的结果,真实市场中通常 Sharpe 1-3 就算非常优秀的多空策略。
|
||||
|
||||
### 9.4 A 股限制与现实考量
|
||||
|
||||
> ⚠️ **A 股重要提示**:
|
||||
> A 股融券做空受到严格限制,**普通投资者无法执行多空策略**。
|
||||
> 多空策略主要适用于:港股、美股市场,或通过股指期货进行市场对冲。
|
||||
> 在 A 股,因子策略通常只执行"多头"部分(买入高分股票),不做空低分股票。
|
||||
|
||||
---
|
||||
|
||||
## 10. 因子衰减(Factor Decay)
|
||||
|
||||
### 10.1 什么是因子衰减?
|
||||
|
||||
因子衰减曲线回答一个关键的实践问题:
|
||||
**"这个因子的信号,在多少天后就失效了?"**
|
||||
|
||||
我们对不同的持有期 H(1D, 5D, 10D, 21D, 42D, 63D)分别计算 IC:
|
||||
|
||||
$$\text{IC}(H)_t = \text{SpearmanCorr}\left(\text{factor}_{t,\cdot},\ \text{return}_{t+H,\cdot}\right)$$
|
||||
|
||||
如果 IC(H) 随 H 增大而快速降向 0,说明因子是"短期信号",需要高频换仓。
|
||||
如果 IC(H) 衰减缓慢,说明因子是"长期信号",低频换仓也有效。
|
||||
|
||||
### 10.2 本 Demo 的衰减结果
|
||||
|
||||
| 持有期 | MOM (IC) | REV (IC) |
|
||||
|--------|----------|----------|
|
||||
| 1D | +0.067 | -0.043 |
|
||||
| 5D | +0.066 | -0.045 |
|
||||
| 10D | +0.065 | -0.046 |
|
||||
| 21D | +0.065 | -0.050 |
|
||||
| 42D | +0.061 | -0.027 |
|
||||
| 63D | +0.054 | -0.033 |
|
||||
|
||||
**MOM(慢衰减)**:IC 从 1D 到 21D 几乎不变(+0.067 → +0.065),42D 以后才明显下降。
|
||||
→ 说明动量信号在 1-3 个月内保持有效,**月频换仓足够**,不需要高频交易
|
||||
|
||||
**REV(快变化)**:在 42D 处强度减弱(-0.027),62D 处轻微回升。
|
||||
→ 反转信号在短期更强,长期减弱,适合**周频换仓**
|
||||
|
||||
### 10.3 实践意义
|
||||
|
||||
```
|
||||
快速衰减因子:
|
||||
优点: 信号新鲜,短期预测准确
|
||||
缺点: 必须高频换仓 → 高换手率 (Turnover) → 高交易成本
|
||||
适合: 高频量化交易机构,有直连交易所的低手续费通道
|
||||
|
||||
慢速衰减因子:
|
||||
优点: 不需要频繁换仓,交易成本低
|
||||
缺点: 信号滞后,无法捕捉短期机会
|
||||
适合: 中低频量化(月频/季频)、散户量化尝试
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 11. 结果解读与局限性
|
||||
|
||||
### 11.1 为什么 LVOL 和 BAB 无效?
|
||||
|
||||
在本 Demo 中,LVOL 和 BAB 的 IC ≈ 0,原因在于数据生成机制:
|
||||
|
||||
我们只注入了**质量**和**动量** Alpha,没有注入"低波动溢价"或"低贝塔溢价"。因此,低波动率并不预示更高未来收益。
|
||||
|
||||
在**真实市场**中,低波动因子在许多市场(美股、港股、A 股)都有实证支撑。本 Demo 的结果不能说明低波动因子无效——只能说明它在**这个特定的合成数据**中无效。
|
||||
|
||||
### 11.2 合成数据的局限性
|
||||
|
||||
| 局限 | 真实市场中不存在 | 本 Demo 简化了 |
|
||||
|------|-----------------|---------------|
|
||||
| 市场冲击 | 大单买卖会推高/压低价格 | 假设无限流动性 |
|
||||
| 交易成本 | 买卖价差、印花税、佣金 | 未扣除交易成本 |
|
||||
| 因子拥挤 | 大家都用同一个因子时,超额收益消失 | 未模拟 |
|
||||
| 财报数据 | 基本面因子需要财报,有发布延迟 | 未涉及 |
|
||||
| 风险暴露限制 | 真实组合需控制行业、风格暴露 | 无约束 |
|
||||
|
||||
### 11.3 量化因子研究的注意事项
|
||||
|
||||
1. **样本外验证(Out-of-Sample Test)**:IC 是在同一数据集上计算的,存在过拟合风险。实践中需要用样本外数据验证。
|
||||
2. **因子衰减与换仓成本的权衡**:IC 高不等于策略盈利,必须考虑换手成本是否侵蚀了因子收益。
|
||||
3. **市场环境(Regime)的影响**:动量因子在趋势市中有效,在剧烈波动的市场(如2020年3月)可能大幅失效。
|
||||
4. **因子拥挤(Factor Crowding)**:当太多资金追同一个因子时,因子溢价会被套利消除。
|
||||
|
||||
---
|
||||
|
||||
## 12. 术语速查表
|
||||
|
||||
| 中文 | English | 简要说明 |
|
||||
|------|---------|----------|
|
||||
| Alpha 因子 | Alpha Factor | 能预测股票未来超额收益的数学信号 |
|
||||
| 超额收益 | Alpha | 超越市场基准的额外收益 |
|
||||
| 市场贝塔 | Market Beta (β) | 股票收益对市场收益的敏感度 |
|
||||
| 截面数据 | Cross-Sectional Data | 同一时间点多只股票的数据 |
|
||||
| 时间序列 | Time Series | 同一只股票随时间变化的数据 |
|
||||
| 因子动物园 | Factor Zoo | 学术界发现的 300+ 个因子的统称 |
|
||||
| 动量因子 | Momentum Factor | 基于过去 12-1 月累积收益的趋势延续信号 |
|
||||
| 动量效应 | Momentum Effect | 赢家继续赢、输家继续输的市场现象 |
|
||||
| 短期反转 | Short-Term Reversal | 短期内价格过度波动后的均值回归 |
|
||||
| 低波动异象 | Low Volatility Anomaly | 低波动股票收益反而更高,违反 CAPM |
|
||||
| 非流动性 | Illiquidity | 每单位成交量引起的价格波动幅度 |
|
||||
| 流动性溢价 | Liquidity Premium | 流动性差的资产额外要求的收益补偿 |
|
||||
| 低贝塔 | Low Beta (BAB) | 贝塔系数低的股票,与市场敏感性低 |
|
||||
| 赌对低贝塔 | Betting Against Beta | Frazzini & Pedersen 提出的低贝塔超额收益策略 |
|
||||
| Amihud 指标 | Amihud Illiquidity | \|r\|/成交量的均值,衡量流动性的经典指标 |
|
||||
| 去极值 | Winsorization | 将极端异常值截断到合理范围 |
|
||||
| 截面标准化 | Cross-Sectional Normalization | 在每个日期截面做 Z-score 标准化 |
|
||||
| Z-score | Z-score | (x - 均值) / 标准差,使均值=0,标准差=1 |
|
||||
| 市值中性化 | Market Cap Neutralization | 回归剔除市值因子对因子值的影响 |
|
||||
| 信息系数 | IC (Information Coefficient) | 因子值与未来收益的 Spearman 秩相关系数 |
|
||||
| IC 均值 | IC Mean | IC 时间序列的均值,衡量因子平均预测能力 |
|
||||
| IC 标准差 | IC Std | IC 时间序列的波动率,衡量因子稳定性 |
|
||||
| ICIR | ICIR (IC Information Ratio) | IC均值/IC标准差,类似因子的夏普比率 |
|
||||
| Spearman 秩相关 | Spearman Rank Correlation | 基于排名(秩)而非原始值的相关系数 |
|
||||
| Pearson 相关 | Pearson Correlation | 基于线性关系的相关系数 |
|
||||
| 持有期 | Holding Period (H) | 建仓到平仓的时间跨度 |
|
||||
| 分层回测 | Quantile Analysis / Bucket Test | 按因子值分组,对比各组未来收益 |
|
||||
| 五分位 | Quintile (Q1-Q5) | 将股票等分为 5 组 |
|
||||
| 等权组合 | Equal-Weight Portfolio | 每只股票持仓权重相同 |
|
||||
| 调仓日 | Rebalance Date | 重新计算因子并调整持仓的日期 |
|
||||
| 换手率 | Turnover | 每期组合发生变化的比例,越高交易成本越大 |
|
||||
| 因子合成 | Factor Combination | 将多个因子加权合成为一个综合因子 |
|
||||
| 等权合成 | Equal-Weight Composite | 所有因子等权相加的合成方法 |
|
||||
| IC 加权合成 | IC-Weighted Composite | 按各因子历史 IC 均值加权合成 |
|
||||
| 多因子模型 | Multi-Factor Model | 使用多个因子解释股票收益差异的模型 |
|
||||
| 多空组合 | Long-Short Portfolio | 做多高分股票、做空低分股票的中性化策略 |
|
||||
| 多头 | Long | 买入持有,期望价格上涨 |
|
||||
| 空头 | Short / Short Selling | 借入并卖出,期望价格下跌后回购获利 |
|
||||
| 多空价差 | Long-Short Spread | 多头组合收益 - 空头组合收益 |
|
||||
| 市场中性 | Market Neutral | 多空两侧的市场敝口相互对冲,净市场风险 ≈ 0 |
|
||||
| 因子衰减 | Factor Decay | 因子预测能力随持有期延长而减弱的现象 |
|
||||
| 市场环境 | Market Regime | 具有共同特征的特定市场状态(如牛市/熊市/震荡市)|
|
||||
| 因子拥挤 | Factor Crowding | 过多资金追逐同一因子导致溢价消失的现象 |
|
||||
| 样本外验证 | Out-of-Sample Test | 在训练数据之外的独立数据集上验证模型效果 |
|
||||
| 过拟合 | Overfitting | 模型过度适应训练数据,导致样本外表现差 |
|
||||
| 隐藏因子 | Hidden Factor / Latent Factor | 不可直接观察、只能间接估计的潜在驱动因子 |
|
||||
| 截面 | Cross-Section | 在同一时间点对多个实体的观察 |
|
||||
| OLS 回归 | OLS (Ordinary Least Squares) | 普通最小二乘法,用于因子中性化 |
|
||||
| 残差 | Residual | OLS 回归中因变量实际值与拟合值的差值 |
|
||||
|
||||
---
|
||||
|
||||
*上一篇:[事件驱动回测](doc_03_event_driven_backtest.md)*
|
||||
|
||||
---
|
||||
|
||||
## 附录:系列文档导航
|
||||
|
||||
| 篇 | 文件 | 文档 | 核心内容 |
|
||||
|----|------|------|----------|
|
||||
| 第 1 篇 | `quant_data_pipeline_demo.py` | `doc_01_data_pipeline.md` | 复权、收益率、缺失值、异常值、涨跌停 |
|
||||
| 第 2 篇 | `quant_strategy_backtest_demo.py` | `doc_02_strategy_backtest.md` | 技术指标、策略逻辑、向量化回测、绩效指标 |
|
||||
| 第 3 篇 | `quant_event_driven_backtest_demo.py` | `doc_03_event_driven_backtest.md` | 事件驱动架构、6大组件、成本模型、与向量化对比 |
|
||||
| **第 4 篇** | `quant_alpha_factor_demo.py` | `doc_04_alpha_factor.md` | 因子构建、IC/ICIR、分层回测、因子合成、多空组合 |
|
||||
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue