# <center>量化投资分析课程报告</center>
<p align="right">姚为 2022214051</p>
<p align="right">邓逸涛 2022214049</p>
<p align="right">冯大纬 2022214053</p>
<div style="page-break-after: always;"></div>
[TOC]
<div style="page-break-after: always;"></div>
## 一. 摘要
因子在量化投资中扮演着重要的角色,它们是构建交易策略和评估资产表现的关键组成部分。在金融领域,因子代表了一系列经过精心选择和测试的市场变量,用于解释资产回报的差异。这些因子可以是基本面数据、技术指标、市场特征或其他衡量资产特征的指标。
量化投资者广泛应用因子模型来寻找市场中的投资机会,并建立相应的投资策略。因子模型通过将资产的回报与一系列因子的表现相关联,帮助揭示市场中隐藏的规律和价值。通过分析和挖掘这些因子,投资者可以更好地理解市场动态,识别出潜在的超额收益机会,并优化投资组合的风险与回报。
因子在量化投资中的作用可以分为两个方面。首先,它们用于解释资产回报的差异。通过分析大量历史数据,研究人员可以确定与资产表现密切相关的因子。这些因子可以涉及公司财务状况、行业趋势、市场情绪等方面。通过将这些因子纳入模型,投资者可以更准确地预测资产的未来表现,并据此做出投资决策。
其次,因子在构建投资组合和风险管理中起到至关重要的作用。通过综合多个因子,投资者可以构建一个多维度的投资组合,以达到分散风险和提高回报的目标。因子模型可以帮助投资者识别出低相关性的因子,并将它们组合在一起,从而降低投资组合的整体风险。此外,因子模型还可以用于评估投资组合的回报和风险特征,并进行风险控制和资产配置的决策。
因子在量化投资中的重要性不仅在于其提供了对市场的深入理解,还在于其能够为投资者提供可量化的方法和工具来指导投资决策。通过对因子进行有效的测试、选择和组合,投资者可以建立稳健的投资策略,并在动态的市场环境中寻找持续的超额收益。因此,对因子的研究和应用成为了量化投资领域中的一个重要研究方向,其对投资绩效和资产管理具有重要影响。
我们从技术面和财务方面入手研究,构建了以下$8$个因子
1. 衰减价值比率
2. 动态成交-价格背离比率
3. 分形自适应均线(FRAMA)
4. 考夫曼自适应均线(KAMA)
5. 超额现金流选股因子
6. 日内高频化高阶矩因子
7. 格雷厄姆成长股内在价值因子
8. 新聪明钱因子
对这些因子合成之后,我们的策略样本内最好夏普值为$2.683$ ,年化收益为$10.5\%$,样本外最好夏普值为$1.424$ ,年化收益为$8.8\%$,
当综合这十个因子时,我们能够更全面地理解市场中存在的交易机会和价格趋势。这些因子代表了从价格、成交量、财务和技术指标等方面提取的关键信息,用于识别市场的买入和卖出信号。
例如,衰减价值比率可以评估资产的长期趋势和价值变化的速度,动态成交-价格背离比率揭示成交量和价格之间的背离情况。分形自适应均线和考夫曼自适应均线是基于市场波动性调整的均线指标,用于捕捉趋势和过滤噪音信号。超额现金流选股因子帮助筛选具有良好现金流表现的股票。日内高频化高阶矩因子通过分析高频数据,揭示市场价格的波动特点和非线性关系。这些因子提供了投资者在价值评估、趋势识别、风险控制和选股方面的参考依据,帮助他们做出更明智的投资决策。
通过综合这些因子,我们的策略能够捕捉到市场中存在的价格趋势和交易机会。通过分析这些因子之间的相互关系和权重,我们能够更准确地预测资产的未来走势,并据此做出买入或卖出的决策。这种基于技术面因子的量化交易策略提供了一种系统化的方法来识别市场动态和利用价格波动进行交易,为投资者带来了潜在的超额收益机会。
## 二. 策略前提
### 2.1 行为金融学
从行为金融学的角度来看,在选股市场上,量化投资根本上交易的是投资者的行为偏差和市场情绪。行为金融学认为,投资者在做出决策时,常常受到认知和情绪方面的偏差影响,导致市场价格出现偏离其内在价值的情况。量化投资利用这些认知偏差和情绪效应来寻找股票定价的失误和市场的非理性行为,从而获得超额收益。
量化投资通过建立模型和使用统计方法来识别和利用投资者行为偏差。例如,投资者可能对未来的收益或风险存在过度反应或不足反应,导致股票的低估或高估。量化策略可以利用这种反应不足或过度来进行买入或卖空,以期获取超额收益。
此外,行为金融学还研究了投资者对股票内在价值的误判或忽视。投资者可能会过度关注短期业绩表现,而忽视长期价值,或者被情绪因素所影响,导致对股票的价值进行错误的评估。量化投资可以利用这些误判和忽视来识别被低估或高估的股票,并进行相应的交易。
另外,行为金融学还关注投资者对交易活跃程度的偏好或厌恶。有些投资者可能喜欢频繁交易和追逐短期涨跌,而有些投资者则更倾向于稳定的投资策略。量化投资可以利用这些偏好或厌恶来捕捉市场中的交易机会。
综合来看,量化投资从行为金融学的角度来交易,本质上是利用投资者的认知偏差、情绪效应和行为偏好来获取超额收益。通过构建模型、利用统计方法和量化技术,量化投资能够系统地识别和利用市场中存在的各种行为偏差,从而实现更理性、更有效的选股和交易。
### 3.2 如何开发因子
在选股市场上,因子的应用价值是为了帮助投资者识别潜在的优质股票和获得超额收益。因子模型通过对市场数据进行分析和挖掘,提供了一种系统化的方法来评估和选择投资标的。然而,在使用因子之前,有几个关键的前提需要考虑。
首先,数据的可靠性和准确性是因子应用的基础。确保所使用的市场数据是经过验证和校准的,以减少数据误差和偏差对因子分析的影响。同时,对数据进行合理的处理和调整,例如调整股票价格和成交量,可以提高因子分析的可信度和可比性。
其次,因子的选择和构建需要基于充分的研究和理论支持。在选择因子时,投资者应该考虑相关的金融理论、经济学原理和市场现象,并结合自身的投资策略和目标来确定最具价值的因子。经过深入的研究和验证,确保因子能够在不同市场环境下产生一致和可靠的信号。
第三,因子的有效性和稳定性需要进行严格的测试和验证。通过历史回测和实时模拟交易等手段,评估因子在过去和当前市场上的表现,并进行风险和回报的分析。确保因子能够在多样化的市场条件下产生稳定的信号,并且在实际交易中能够保持可靠的效果。
## 三. 单因子开发
### 3.1 衰减价值比率
#### 3.1.1 策略前提
这个因子构建的策略旨在捕捉价值与成交价之间的动态关系。该策略的前提可以总结如下:
1. 动态关系假设:假设价值(Value)和成交均价(VWAP)之间存在一定的相关性和动态关系,即价值的变化可能对成交价产生影响。
2. 衰减加权计算:基于衰减加权均值计算,对价值和成交均价进行衡量,以反映近期市场变化。这种计算方式使得较新的数据更加权重,较旧的数据权重逐渐减小。
3. 衰减比率观察:通过观察价值与成交价之间的衰减比率,可以捕捉到市场中价值与成交价之间的相对变化。这可以提供一种衡量价值高估或低估的指标,帮助判断市场的短期趋势或价值回归的可能性。
也就是说基于动态关系假设,这个策略关注价值与成交价之间的相关性和相对变化。通过衰减加权计算使得较新的数据更具权重,较旧的数据权重逐渐减小,这样可以通过观察价值与成交价的衰减比率,判断市场中价值的相对高估或低估情况。我们认为该因子可以作为判断市场短期趋势和价值回归的指标,为策略提供交易信号。
#### 3.1.2 因子构建
首先构建衰减公式:
$$
{ts\_Decay}(dfCleaned, num) = \frac{{\sum_{{v=0}}^{{num-1}} (num - v) \cdot {ts\_Delay}(dfCleaned, v)}}{{\sum_{{v=0}}^{{num-1}} (num - v)}}
$$
然后构建VWAP公式:
$$
\text{VWAP} = \frac{\sum_{i=1}^{n} \text{Price}_i \times \text{Volume}_i}{\sum_{i=1}^{n} \text{Volume}_i}
$$
最后根据衰减公式及VWAP构建衰减价值比率因子
$$
{VWAP Ratio} = -\frac{ts\_Decay(Value, 64)}{ts\_Decay(VWAP, 128)}
$$
因子在样本内(2017-04-28 ~ 2019-12-31)的表现:



#### 3.1.3 样本外表现
因子在样本外(2020-01-01 ~ 2022-12-31)的表现:



### 3.2 动态成交-价格背离比率
#### 3.2.1 策略前提
动态成交-价格背离比率因子的策略前提是基于成交量与价格之间的动态背离关系。通过计算衰减加权均值比率,该因子旨在捕捉市场中价格和成交量的背离情况。当该因子值高于某一阈值时,表明成交量与价格之间存在背离,可能暗示着市场趋势的变化或价格反转的潜在机会。基于这一前提,可以采取相应的交易策略,如建立多空头寸、制定入场和出场规则等,以利用这种背离关系来进行交易决策。
#### 3.2.2 因子构建
$$
\text{Factor} = \frac{ts\_Decay(Open \times \lvert Value \rvert, 64)}{ts\_Decay(VWAP, 128)}
$$
其中:
- $ts\_Decay(Open \times \lvert Value \rvert, 64)$ 表示对开盘价与价值的绝对值相乘进行衰减加权均值计算,衰减窗口大小为64。
- $ts\_Decay(VWAP, 128)$ 表示对成交均价进行衰减加权均值计算,衰减窗口大小为128。
因子在样本内(2017-04-28 ~ 2019-12-31)的表现:



#### 3.2.3 样本外表现
因子在样本外(2020-01-01 ~ 2022-12-31)的表现:



### 3.3 分形自适应均线(FRAMA)
#### 3.3.1 因子介绍
分形自适应均线(FRAMA)是一种技术分析指标,旨在提供平滑且适应市场波动的移动平均线。FRAMA由Ehlers在1994年开发,并且经过多年的实践和改进,已经成为许多交易者和分析师使用的有力工具。
FRAMA的独特之处在于它使用了分形理论和自适应滤波器的概念。它通过将分形维度应用于价格数据来计算移动平均线,以适应市场的不同波动性。FRAMA的目标是保持对价格趋势的敏感性,同时减少噪声和虚假信号。
FRAMA的应用可以帮助交易者识别趋势和市场的波动性,并且过滤掉一些噪声和虚假信号。它可以用于制定交易策略、确定入场和出场点位,以及进行市场分析和预测。
#### 3.3.2 策略前提
FRAMA可以用于确定市场的趋势方向。当FRAMA线呈上升趋势时,表明市场处于上涨趋势;当FRAMA线呈下降趋势时,表明市场处于下跌趋势。交易者可以根据趋势方向进行头寸的选择,例如只开多头头寸或只开空头头寸。其次FRAMA可以用于过滤交易信号,帮助交易者避免市场噪声和虚假信号。只有当价格与FRAMA趋势一致时,才考虑交易。例如,如果市场处于上升趋势,只关注价格向上穿越FRAMA线时的买入信号,忽略其他时机。
此外,FRAMA还可以用于确定止损和止盈水平,帮助控制风险和保护利润。例如,交易者可以设置止损订单在价格跌破FRAMA线时触发,或者设置止盈订单在价格达到一定程度的盈利时触发。
#### 3.3.3 因子构建
(1)定义分形曲线变量$N_x$
$$
\left\{\begin{array}{c}
N_{1}=\frac{\operatorname{Max}\left(\operatorname{High}_{t-N: t}\right)-\operatorname{Min}\left(\operatorname{Low}_{t-N: t}\right)}{N} \\
N_{2}=\frac{\operatorname{Max}\left(\operatorname{High}_{t-2 N: t-N}\right)-\operatorname{Min}\left(\operatorname{Low}_{t-2 N: t-N}\right)}{N} \\
N_{3}=\frac{\operatorname{Max}\left(\operatorname{High}_{t-2 N: t}\right)-\operatorname{Min}\left(\operatorname{Low}_{t-2 N: t}\right)}{2 N}
\end{array}\right.
$$
(2)定义分形维度$D$
$$
D=\frac{\ln \left(N_{1}+N_{2}\right)-\ln N_{3}}{\ln 2}
$$
(3)计算自适应均线$FRAMA$
$$
\left\{\begin{array}{c}
\alpha=\exp [-4.6(D-1)] \\
F R A M A_{t}=\alpha \times \text { Close }_{t-1}+(1-\alpha) \times F R A M A_{t-1}
\end{array}\right.
$$
关键实现代码如下:
```python
for j in range(col_):
for t in range(2,row_):
idx_1=t-n_
idx_2=t-2*n_
N1_=(High.iloc[idx_1:t,j].max()-Low.iloc[idx_1:t,j].min())/n_
N2_=(High.iloc[idx_2:idx_1,j].max()-Low.iloc[idx_2:idx_1,j].min())/n_
N3_=(High.iloc[idx_2:t,j].max()-Low.iloc[idx_2:t,j].min())/(2*n_)
D_=np.log(N1_+N2_)-np.log(N3_)
D_/=np.log(2)
alpha_=np.exp(-4.6*(D_-1))
FRAMA_fac1=alpha_*Close.iloc[t-1,j]
FRAMA_fac2=(1-alpha_)*FRAMA.iloc[t-1,j]
FRAMA_val=FRAMA_fac1+FRAMA_fac2
if np.isnan(FRAMA_val):
continue
FRAMA.iloc[t,j]=FRAMA_val
```
我们选取常量$N=50$,挑选出000001号股票测试,FRAMA的拟合结果如下:

#### 3.3.4 样本外表现
因子在样本外(2020-01-01 ~ 2022-12-31)的表现:



### 3.4 考夫曼自适应均线(KAMA)
#### 3.4.1 因子介绍
考夫曼自适应均线(KAMA)是一种技术指标,由美国分析师佛雷德里克·考夫曼(Frederick Kaufman)开发。KAMA旨在提供一种相对于价格波动的自适应平均值,以帮助确定趋势的方向和市场的交易机会。
KAMA的计算基于指数移动平均线(EMA),但它使用了一个动态的效应因子,可以根据市场的波动性自动调整。这使得KAMA能够更好地适应不同市场环境下的价格变动。KAMA在计算中结合了价格的波动性因子,从而使其更快地对较大的价格波动做出反应,同时对较小的价格波动保持较平滑的响应。
KAMA的计算公式如下:
KAMA = 前一周期的KAMA + 效应因子 * (价格 - 前一周期的KAMA)
其中,效应因子根据价格的波动性进行动态调整。在计算中,波动性通常使用真实波幅(ATR)进行衡量。较高的波动性将导致效应因子的值增加,使KAMA更快地对价格变动做出反应。相反,较低的波动性将导致效应因子的值减小,使KAMA保持较平滑的变化。
#### 3.4.2 策略前提
KAMA的策略前提是要确认市场的趋势方向。当KAMA线向上运动并且价格位于KAMA之上时,这可能表明市场处于上升趋势。相反,当KAMA线向下运动并且价格位于KAMA之下时,这可能表明市场处于下降趋势。确认趋势方向是使用KAMA的重要前提之一。
除此之外,KAMA的策略前提还包括均线交叉。当KAMA线从下方穿过价格时,这可能是一个买入信号。当KAMA线从上方穿过价格时,这可能是一个卖出信号。均线交叉可用作进一步确认趋势变化和产生交易信号的指标。
KAMA的另一个策略前提是其动态适应性。KAMA能够根据市场的波动性自动调整其响应速度,对较大的价格波动更敏感,对较小的价格波动保持较平滑的响应。这使得KAMA能够更好地适应不同市场环境下的价格变动。
#### 3.4.3 因子构建
(1)刻画趋势强度$ER_t$
$$
E R_{t}=\frac{\left|p_{t}-p_{t-N}\right|}{\sum_{i=t-N+1}^{t}\left|p_{i}-p_{i-1}\right|} \in[0,1]
$$
(2)定义效应因子$sc$
$$
s c=\left[E R_{t} \times(\text { fast }-s l o w)+s l o w\right]^{2}
$$
(3)计算$KAMA$
$$
KAMA_t=sc\times Close_{t-1}+(1-sc)\times KAMA_{t-1}
$$
关键实现代码如下:
```python
# 考夫曼自适应均线KAMA
n_=10
fast_=2/(2+1)
slow_=30/(30+1)
def ER_diff_func(x):
x_=x.to_numpy()
return np.abs(x_[-1]-x_[0])
KAMA_fac1=Close.rolling(window=n_).apply(ER_diff_func)
KAMA_fac2=Close.diff()
KAMA_fac2=KAMA_fac2.abs()
KAMA_fac2=KAMA_fac2.rolling(window=n_).sum()
ER_=KAMA_fac1/KAMA_fac2
KAMA=Close.copy()
for j in tqdm(range(col_)):
for t in range(1,row_):
sc_=(ER_.iloc[t,j]*(fast_-slow_)+slow_)**2
KAMA_fac3=sc_*Close.iloc[t-1,j]
KAMA_fac4=(1-sc_)*KAMA.iloc[t-1,j]
KAMA_val=KAMA_fac3+KAMA_fac4
if np.isnan(KAMA_val):
continue
KAMA.iloc[t,j]=KAMA_val
```
我们选取常量$N=10$,按照论文中的推荐,快慢因子分别为2和30对应的数值,挑选出000001号股票测试,KAMA的拟合结果如下:

#### 3.4.4 样本外表现
因子在样本外(2020-01-01 ~ 2022-12-31)的表现:



### 3.5 超额现金流选股因子
#### 3.5.1 因子介绍
超额现金流选股因子以公司自由现金流为选股指标的投资策略,并且提出股价/自由现金流作为评价投资标的风险的重要指标。该投资策略学习了华尔街著名的资本大鳄罗伯·瑞克的价值投资理念,从三个角度对股票提出要求:
1. 股票具备合理的估值
2. 股票具备一定的分红收益
3. 公司的财务状况要求健康
以这三个角度出发选择五个指标,分别是市净率P/B Ratio (Price-to-Book Ratio)、市盈率P/E Ratio (Price-to-Earnings Ratio)、股息收益率Dividend Yield、市现率P/CF Ratio (Price-to-Cash Flow Ratio)、借款总额占总资本比例Debt-to-Capital Ratio,共同构建了选股准则。
#### 3.5.2 因子的构建
原始超额现金流选股法则的原始如下:

结合中国投资市场的实际情况之后,超额现金流选股因子对部分原始标准进行了调整:
1. 市净率低于3(衡量估值水平)
2. 股息收益率高于市场平均值(衡量分红水平)
3. 市盈率低于市场平均值(衡量估值水平)
4. 总借款额/总资本低于33%(衡量财务状况)
5. 股价/自由现金流低于7.5(衡量估值水平)
该因子考虑以上因素的原因:
1. 用市盈率、市净率、股价/超额现金流来衡量股票的估值,要求买入的投资标的足够“便宜”,具有合理的估值。其中罗伯·瑞克格外强调股价/超额现金流的作用。这里的超额现金流可认为是自由现金流。
2. 用总借款/总资本来衡量公司的偿债能力和财务结构,保证买入的投资标的具备足够强大的资产负债表。
3. 用股息收益率来衡量股票的分红水平,保证价值投资者能够获得一定的分红收益。
#### 3.5.3 因子的表现
超额现金流选股因子年化收益率率9.1%,夏普比率1.812。因子在2020-01-01 ~ 2022-5-12的具体表现如下:



### 3.6 日内高频高阶矩因子
#### 3.6.1 因子介绍
#### (1) 高阶矩
在数学和统计学中,矩是一种用于描述概率分布的统计量。一阶矩是均值,二阶矩是方差,三阶矩是偏度,四阶矩是峰度。
三阶矩偏度描述了数据分布的偏斜程度。在量化投资中,三阶矩被用来衡量资产收益率分布的非对称性。正偏斜表示分布右侧较重,负偏斜表示分布左侧较重。偏度可以帮助投资者识别资产收益率分布的特点,例如尖峰和尾部厚度。
四阶矩峰度衡量了数据分布的峰态或尖峰程度,通常用于评估资产收益率分布的尖峰性。正峰度表示分布比正态分布更尖峭,负峰度表示分布比正态分布更平坦。峰度可以提供关于资产价格或收益率分布形态的信息,对于投资组合风险管理和模型构建具有一定的指导意义。
我们根据这些概念的基础,构建了日频下的高阶矩指标,并进行了相关测试。具体的构造逻辑如下:
- -ts_Skewness(Data, MovingWindow):计算数据在移动窗口期内的偏度。
- -ts_Kurtosis(Data, MovingWindow):计算数据在移动窗口期内的峰度。
MovingWindow是在计算偏度和峰度时所采用的时间窗口长度。移动窗口期是指在时间序列数据中,以固定长度的窗口逐步滑动,每次计算窗口内数据的偏度和峰度。这样可以得到一系列随时间变化的高阶矩指标值,用于分析和研究资产的风险特征。
日频下的偏度因子测试结果如下:

从长期来看,简单地选择日频下的高阶矩指标作为因子并不能获得很好的效果,所以我们对于该因子进行了高频化优化,选取分钟频率的数据取代日频数据
#### (2) 高频化
波动因子通常是基于一定时间范围内的价格波动情况计算得出的。然而,由于价格波动的非线性性质和高频信息的重要性,使用传统的计算方法在高频数据上可能无法准确地反映最新的波动情况。
已实现波动率是一种测量资产价格在一定时间内的实际波动程度的指标。它通过计算价格的历史波动来衡量资产的风险水平。传统的计算方法通常使用对数收益率序列,并将其标准差作为波动率的估计值。已实现波动率可以更好地反映过去价格的波动情况。高频化处理是指将低频数据转化为高频数据的过程。对于波动因子,高频化处理可以将其从较长时间间隔的数据计算转换为更短时间间隔的数据计算。通过使用已实现波动率的方法,可以在较短的时间间隔内计算价格的波动情况,从而捕捉更多的高频价格波动信息。
#### 3.6.2 因子构建
我们通过研报的阅读,最终选择了基于日内分钟收益率平方和的已实现波动率作为中心距指标
1. 由于给出的分钟数据中没有分钟收益率信息,我们通过$Return = Close/Open -1$的公式首先计算得到所需要的初始数据
2. 计算日内分钟收益率平方和$Return2$,日内分钟收益率立方和$Return3$
3. 通过如下公式,计算出来最终的因子值
$$
factor = -ts\_Mean( \frac{N*Return3}{Return2^\frac{3}{2}}, M )
$$
4. 根据优化程序搜索得到的最佳N=20,M=20
因子在样本内(2017-07-01 ~ 2019-12-31)的表现:



##### 3.6.3 样本外表现
因子在样本外(2020-01-01 ~ 2022-04-31)的表现:



### 3.7 格雷厄姆成长股内在价值因子
#### 3.7.1 因子介绍
“价值投资之父”格雷厄姆在其著名著作《聪明的投资者》(The Intelligent Investor: A Book of Practical Counsel)一书中,格雷厄姆提出了成长股内在价值的计算公式。。这个公式简洁明了,基本的投资逻辑是以每股收益为基准,根据预期的收益增长率来确定合理的市盈率水平,从而得出合理的估值。
原始的格雷厄姆成长股内在价值公式可以表示为:
$$
Value=E∗(8.5+2∗R)
$$
其中,
E代表每股收益(EPS),决定了公司内在价值的基准;
R代表预期收益增长率,反映了公司未来的盈利能力;
数值8.5被格雷厄姆认为是一个合理的市盈率,适用于没有盈利的公司;
因此,(8.5 + 2 * R)可以被视为预期收益增长率为R的公司的合理市盈率。
最初格雷厄姆提出的成长股内在价值公式旨在为美国股市的个人投资者在选择成长股时提供指导,并体现了格雷厄姆对成长股内在价值估值的基本逻辑。回测结果显示该投资策略在中国市场也具有较强的适用性。
通过引入简单而直观的安全因子和利率调整因子,我们对格雷厄姆的成长股内在价值公式进行了改进,显著提高了策略的收益和夏普比率。
#### 3.7.2 因子构建
下图为格雷厄姆成长股内在价值公式的原始描述:

原始的格雷厄姆成长股内在价值公式可表述为:
$$
Value=E∗(8.5+2∗R)
$$
在该公式中,每股收益(EPS)代表公司内在价值的基准,预期收益增长率(R)则反映了公司未来的盈利能力。格雷厄姆认为数值8.5适用于预期收益增长率为0的公司的合理市盈率,因此(8.5+2*R)可以被视为预期收益增长率为R的公司的合理市盈率。将每股收益与合理市盈率相乘,可以直观地得出合理的估值水平。需要说明的是,根据历史数据来看,8.5倍的市盈率在A股市场普遍具有较低的水平。我们通过网格搜索对公式中的市盈率和预期收益增长率R的系数进行了优化,以确定在中国股票市场上最优的市盈率参数和预期收益增长率R的系数。
原始的格雷厄姆成长股内在价值投资策略年化收益率率6.6%,夏普比率1.134。因子在2020-01-01 ~ 2022-5-12的具体表现如下:



#### 3.7.3 因子改进
我们在原始公式的基础上引入了两个改进因子。首先是考虑到格雷厄姆著名的"安全边际"原则,我们引入了一个称为安全因子(SF)的因子;其次是考虑到利率对股价的影响,我们引入了一个称为利率调整因子(IF)的因子。改进后的公式如下:
$$Value = E *(8.5 + 2 * R)*SF*IF
$$安全因子(SF)是介于0和1之间的数值,表示对股票内在价值的折扣。格雷厄姆指出,"安全边际就是价格针对价值大打折扣"。利率调整因子(IF)的计算公式为:IF = 历史平均AAA债券收益率 / 当期AAA债券收益率。利率调整因子所表达的投资思想非常直观:低利率对股市有利,股票的内在价值会溢价;高利率对股市不利,股票的内在价值会折价。在量化选股时,我们将股票的内在价值与股价进行比较,并选择Value/Price在1到1.2之间的股票进入投资组合。我们设置1.2作为上限阈值的目的有两个方面:一是为了控制筛选出的股票数量,以便进行不同策略的比较;二是考虑到公式的有效性——当股票的内在价值与股价相差非常大时,必然存在公式以外的因素起作用,此时仅仅依靠公式进行选股就没有意义。
我们将该因子使用的量化指标列举如下:

改进的格雷厄姆成长股内在价值投资策略年化收益率率8.5%,夏普比率1.361。改进后因子在2020-01-01 ~ 2022-5-12的具体表现如下:



2020年至2022年回测结果如下:
原始的格雷厄姆成长股内在价值投资策略年化收益率率6.6%,夏普比率1.134。
改进的格雷厄姆成长股内在价值投资策略年化收益率率8.5%,夏普比率1.361。
对比测试结果可以看到,原始的格雷厄姆成长股内在价值投资策略已经表现出对 A 股市场良好的适用性。而通过引入安全因子和利率改进因子策略,显著提高了年化收益、夏普比率。
### 3.8 新聪明钱因子
#### 3.8.1 因子介绍
聪明钱量化投资因子是一种基于分钟行情数据的价量信息来识别聪明钱交易的量化因子。它旨在从数据中提取出机构参与交易的多寡,从而构造出一个跟踪聪明钱的选股因子。
聪明钱因子模型的核心问题是如何识别聪明钱的交易。聪明钱在交易过程中往往呈现出“单笔订单数量更大、订单报价更为激进”的基本特征。基于这个考虑,聪明钱因子模型构造了用于度量交易聪明度的指标S,用以筛选聪明钱的交易。不同的S指标的构造方式,将产生不同的聪明钱划分结果,最终影响聪明钱因子的选股效果。因此,聪明度指标S是聪明钱因子模型的核心部件。
#### 3.8.2 因子构建
我们构造聪明钱因子的过程如下:
1. 对于分钟数据中的每一个股票,回溯获得过去10个交易日的分钟行情数据
2. 构造指标$S_t$,在原始的聪明钱因子中是通过 $ S_t = \frac{|R_t|}{\sqrt{V_T}}$ 来计算指标S,我们通过阅读更多的研报,选择了表现更好的分钟涨跌幅绝对值除以分钟成交量对数作为聪明钱指标
$$
S_t = \frac{|R_t|}{ln(V)}
$$
取股票000060的数据作为示例,计算得到的一部分St表的值如图所示:

3. 将回溯数据按照指标从大到小排序,取到成交量累计占比为20%的分钟,视为聪明钱交易
4. 计算聪明钱交易的$VWAP_{smart}$和所有交易的$VWAP_{all}$,聪明钱因子$Q=\frac{VWAP_smart}{VWAP_all}$
下面是我们的计算聪明钱因子的核心代码部分
```python
def get_10day_subdf(df,date1,lastday):
preday = lastday
date1 = datetime.date(date1)
previous = date1 - timedelta(days=1)
while preday != 0:
while len(df[df.index.date == previous]) == 0:
previous = previous - timedelta(days=1)
preday = preday - 1
previous = previous - timedelta(days=1)
df11 = df.loc[(df.index.date >= previous) & (df.index.date <= date1) ].dropna()
return df11.sort_values(ascending=False)
def calculate_smart_money_factor(St, Volume, Amount, lastday, Day, StartDate, EndDate):
smart_money_factor = pd.DataFrame(index=Day.index, columns=Day.columns)
for stock in tqdm_notebook(St.columns, desc='因子计算中'):
amount_data = Amount[stock]
for date1 in pd.date_range(start=StartDate, end=EndDate):
if date1 not in smart_money_factor[stock].index:
continue
past_10_days_St = get_10day_subdf(St[stock],date1,lastday)
total_volume = Volume[stock].sum()
accumulated_volume = 0
VWAPsmart, VWAPall = 0, 0
for minutes in past_10_days_St.index:
cnt_volume = Volume[stock][minutes]
if accumulated_volume < 0.2 * total_volume:
#Smart
accumulated_volume += cnt_volume
VWAPsmart += cnt_volume * amount_data[minutes]
else:
#Dumb
VWAPall += cnt_volume * amount_data[minutes]
if VWAPall == 0:
smart_money_factor[stock][date1] = 0
else:
VWAPsmart = VWAPsmart / accumulated_volume
VWAPall = VWAPall / total_volume
smart_money_factor[stock][date1] = VWAPsmart / VWAPall
return smart_money_factor
```
因子在样本内(2017-10-01 ~ 2019-12-31)的表现:



##### 3.8.3 样本外表现
因子在样本外(2020-01-01 ~ 2022-04-31)的表现:



## 四. 单因子分析与总结
### 4.1. 各因子结果
我们设置以下参数:
```python
SDate,EDate = 61,654
start = SDate
delayNum = 2 # Get imformation day:t0; Trading day: t1; Day get the total Close(t)/Close(t-1) return: t2
cost = 0.002 # single side: commission 0.02 pct, tax: 0.05 pct, impact cost: 0.1 pct,so cost of both buy and sell: 0.17pct *2 = 0.34pct
```
表示在样本内(2017-04-28 ~ 2019-12-31)使用因子$X$进行测试,测试结果如下:
| | Sharp Ratio | Annual Return | Turnover |
| -------------------------- | ----------- | ------------- | -------- |
| 衰减价值比率 | 2.128 | 0.069 | 0.018 |
| 动态成交-价格背离比率 | 1.833 | 0.071 | 0.02 |
| 分形自适应均线(FRAMA) | 1.972 | 0.068 | 0.025 |
| 考夫曼自适应均线(KAMA) | 1.969 | 0.068 | 0.025 |
| 日内高频高阶矩因子 | 2.043 | 0.087 | 0.07 |
| 超额现金流选股因子 | 1.812 | 0.091 | 0.049 |
| 新聪明钱因子 | 1.849 | 0.078 | 0.057 |
| 格雷厄姆成长股内在价值因子 | 1.361 | 0.085 | 0.028 |
从数据上看,我们选出的各个单因子无论是夏普系数还是年化收益都具有良好的效果,接下来我们会对因子进行相关性分析,确保我们的因子之间不线性相关,并且对我们的因子和老师给出的大型因子库进行查重。
然后我们会使用多因子组合的手段对各个因子进行不同的组合尝试,希望在此基础上获得更好的夏普系数和年化收益。
## 五. 因子相关性检测
#### 5.1 因子间相关性
下面是我们计算得到的上述8个因子间的相关性统计表,可见因子间相关不大,表示本策略多因子组合具有多样性,即它们代表了不同的市场因素或投资特征,可以能够提供更全面和多维度的市场视角,帮助降低投资组合的风险,并在不同市场环境下表现良好。

#### 5.2 与原因子库相关性
我们接着对比了上述8个因子与原因子库(return_of_old_factor.csv)中的因子相关性,下图是因子相关性的总表:

最后我们取8个因子与原106个因子相关的最大值,可见本策略因子的最大相关性为0.65

## 六. 多因子组合模型
### 6.1. 多因子合成介绍
多因子合成是一种量化投资策略,通过将多个单因子模型组合成一个综合因子模型,旨在提高因子模型的有效性和稳定性。它的目标是综合多个单因子的优点,减少单因子的局限性和不确定性。
在多因子合成中,每个单因子通常代表一个特定的市场信号或投资因素,如估值、动量、质量、成长等。这些单因子可以基于不同的数据来源和计算方法,例如财务报表、价格数据、市场指标等。
多因子合成的方法有多种,其中一种常见的方法是加权平均法。在加权平均法中,给定每个单因子一个权重,然后将单因子的得分加权相加,得到综合因子的值。权重的分配可以根据因子的重要性、历史表现、统计分析等进行确定。
另一种常见的方法是因子组合模型,如线性回归、因子评分法、因子加权法等。这些模型通过使用历史数据进行回归分析或评分计算,将单因子组合成一个综合因子。
多因子合成的优点在于它能够弥补单因子模型的不足,通过综合多个因子,可以更全面地捕捉市场的特征和动态变化。它可以减少单因子的噪声和误差,提高因子模型的稳定性和预测能力。此外,多因子合成还可以提供更丰富的投资信号和更准确的投资决策依据。
### 6.2 多因子合成策略
#### 6.2.1 基于夏普系数的组合
基于夏普系数(Sharpe Ratio)的多因子加权合成方法是一种常见的多因子合成策略。夏普系数是一种衡量资产风险调整后收益的指标,它表示每单位风险所获得的超额收益。
在基于夏普系数的多因子加权合成方法中,首先选择一组具有预测能力的因子作为模型的输入。这些因子可以包括估值因子、动量因子、质量因子等,根据投资者的偏好和研究发现进行选择。
然后,针对每个选定的因子,计算其夏普系数。夏普系数的计算通常涉及对历史数据进行回归分析,衡量因子的风险调整后收益表现。夏普系数越高,表示该因子在提供风险调整后的超额收益方面效果越好。
接下来,对各个因子的夏普系数进行加权,构建综合因子。加权可以根据因子的重要性、历史表现等因素进行确定。常见的加权方法包括等权重加权、根据因子方差进行加权等。
最后,使用综合因子进行投资组合构建和交易决策。综合因子可以用作投资组合的权重分配依据,高夏普系数的因子将获得更高的权重。根据投资者的风险偏好和目标,可以根据综合因子进行资产配置、持仓调整等操作。
基于夏普系数的多因子加权合成方法的优点在于它将风险和收益因素同时考虑,可以在提供超额收益的同时控制风险。它可以帮助投资者构建更有效的投资组合,提高资产配置的效果和风险管理能力。
但是夏普系数本身具有一定的局限性,它假设资产收益呈正态分布,且风险偏好为标准差的线性函数。这些假设在实际市场中可能不成立。其次,因子的选择和权重分配需要进行谨慎研究和验证,以避免过度拟合和数据偏差的问题。
实现代码如下:
```python
# SR Weighted
# Inner calc
factors=[
'-1*ts_Decay(Value, 64) / ts_Decay(VWAP, 128)',
'ts_Decay(Open * Value.abs(), 64) / ts_Decay(VWAP, 128)',
'...',
]
SDate,EDate = 61,654
start = SDate
delayNum = 2 # Get imformation day:t0; Trading day: t1; Day get the total Close(t)/Close(t-1) return: t2
cost = 0.002 # single side: commission 0.02 pct, tax: 0.05 pct, impact cost: 0.1 pct,so cost of both buy and sell: 0.17pct *2 = 0.34pct
fig = 1
fac_dict={}
sr_total=0.0
for fac_formula in tqdm(factors):
fac_func=eval(fac_formula)
[sr1 , ret1 , StraRetLine,dire] = PerformanceWithCost(fac_func,TotalRet,delayNum,cost,fig,SDate,EDate)
fac_dict.update({fac_formula:(fac_func,sr1)})
sr_total+=sr1
f_with_sr=[]
for fac_formula,(fac_func,sr1) in fac_dict.items():
ratio=round(sr1/sr_total,3)
print("{}: {}".format(fac_formula,ratio))
f_with_sr.append("{}*({})".format(ratio,fac_formula))
sr_weighted_f="+".join(f_with_sr)
print(sr_weighted_f)
print("------Inner Test------")
# Inner test
SDate,EDate = 61,654
num = 100
cost= 0.0008
Q = 5
f2=eval(sr_weighted_f)
# f1 = pn_TransNorm(f1)
[sr1 , ret1 , StraRetLine_CF_lgb,dire] = PerformanceWithCost(f2,TotalRet,delayNum,cost,1,SDate,EDate)
plt.show()
quantiles1 = GetQuantileRet(f2,Q,SDate,EDate,delayNum,1)
plt.show()
plt.plot(quantiles1)
print("------Outer Test------")
# Outer test
SDate,EDate = 654,len(Close)
num = 100
cost= 0.0008
Q = 5
f2=eval(sr_weighted_f)
# f1 = pn_TransNorm(f1)
[sr1 , ret1 , StraRetLine_CF_lgb,dire] = PerformanceWithCost(f2,TotalRet,delayNum,cost,1,SDate,EDate)
plt.show()
quantiles1 = GetQuantileRet(f2,Q,SDate,EDate,delayNum,1)
plt.show()
plt.plot(quantiles1)
```
**运行结果:**

组合后的因子效果如下:

可以看到,基于夏普系数组合后的因子SR超过2.6,年化收益也超过10%。
即使在样本外,我们的组合策略夏普系数也超过1.4,年化收益接近9%。

#### 6.2.2 基于年化收益的组合
基于年化收益(Annual Return)的多因子加权合成方法是一种常见的多因子合成策略。该方法旨在通过加权组合多个因子模型,以获得相对较高的年化收益。
针对每个选定的因子,计算其对应的年化收益。年化收益通常通过对历史数据进行回溯和分析得出,以衡量因子在多个市场周期中的表现。
接下来,对各个因子的年化收益进行加权,构建综合因子。加权的方法可以根据因子的重要性、历史表现等因素进行确定。常见的加权方法包括等权重加权、根据因子历史表现进行加权等。
最后,使用综合因子进行投资组合构建和交易决策。综合因子可以用作投资组合的权重分配依据,高年化收益的因子将获得更高的权重。根据投资者的风险偏好和目标,可以根据综合因子进行资产配置、持仓调整等操作。
基于年化收益的多因子加权合成方法的优点在于它将多个因子的年化收益综合考虑,以寻求相对较高的整体投资回报。这种方法能够在选择因子和确定权重时,更加注重历史表现和潜在收益。
但是,这个方法相比起基于夏普系数的组合方式来说,没有考虑风险因素,因此在实际应用中需要结合风险管理和资产分散化等因素进行综合考虑。
代码实现的过程和6.2.1中基于夏普系数的组合类似。
年化收益加权组合的多因子策略效果如下:



样本外(2020-01-01 ~ 2022-12-31)的效果有些下降,但仍然有接近9%的年化收益。

#### 6.2.3 基于机器学习手段的多因子组合
LightGBM(Light Gradient Boosting Machine)是一个基于梯度提升框架的机器学习算法,它被设计用于处理大规模数据集和高维特征。LightGBM 是由微软开发的,并在机器学习领域广泛使用。
使用LightGBM进行多因子组合有以下优点:
- 高效性:LightGBM具有快速的训练速度和高效的内存利用率。它采用了基于直方图的决策树算法和并行化训练,可以处理大规模的因子数据和高维特征空间。
- 准确性:LightGBM通过梯度提升框架,能够学习因子之间的复杂非线性关系,提高模型的准确性和预测能力。它可以自动进行特征选择和组合,提取更多有用的信息。
当然,在LightGBM进行多因子组合,我们也需要注意以下问题:
- 数据准备和特征工程:在使用LightGBM进行多因子组合之前,需要进行数据对齐、预处理和特征工程等操作。这需要一定的数据处理和领域知识。
- 过拟合风险:如果不适当地选择因子或进行过度的特征工程,模型可能会过拟合训练数据,导致在新数据上的泛化能力下降。因此,需要进行合适的特征选择和模型调优,以避免过拟合问题。
LightGBM训练100轮后组合出的因子效果如下:




## 七. 总结与思考
本报告主要介绍了因子模型在量化投资中的应用和重要性。首先,我们介绍了因子模型的基本概念和构建方法,包括单因子和多因子模型的构建方法和样本外表现。然后,我们介绍了因子模型在量化投资中的应用,包括如何使用因子模型来识别市场中的隐藏规律和价值,以及如何通过多因子组合策略来降低单因子模型的风险,提高投资组合的稳定性。
在实验部分,我们使用了Python编程语言和Jupyter Notebook来实现因子模型的构建和应用。我们使用了股票数据和基本面数据来构建因子模型,并使用样本外表现来评估因子模型的预测能力和稳定性。我们还介绍了因子组合策略的构建方法和实现过程,并使用回测数据来评估因子组合策略的表现。
因子模型的优点在于可以帮助投资者识别市场中的隐藏规律和价值,提高投资组合的风险调整收益率。同时,因子模型可以通过多因子组合策略来降低单因子模型的风险,提高投资组合的稳定性。然而,因子模型也存在一些缺点,例如因子构建的不确定性、样本外表现的不稳定性等。
未来,随着数据科学和人工智能技术的发展,因子模型在量化投资中的应用将会更加广泛和深入,同时也需要更加严谨和科学的方法来构建和应用因子模型。总之,本报告提供了一个全面的介绍因子模型在量化投资中的应用和实现方法,帮助读者更好地理解市场动态,识别超额收益机会,并优化投资组合的风险与回报。同时,本报告也提出了因子模型存在的一些问题和挑战,例如因子构建的不确定性和样本外表现的不稳定性等,这些问题需要更加严谨和科学的方法来解决。