3、因子分析
约 2652 字大约 9 分钟
2026-05-31
1.因子分析概述
1.因子分析概述
定义:
因子分析是股票投资的常用思路。指利用“因子”或特定特征”使各种股票收益最大化的投资方法。这些因素包括波动性、动量、股票规模等;
原理:
因子分析将多个实测变量转换少数几个综合指标(或称潜变量),它反映一种降维的思想。通过降维将相关性高的变量聚在一起,从而减少需要分析的变量的数量,而减少问题分析的复杂性。用来确定维度数量,对标体系的维度由主观来做判断
2.因子类别和流程
量化选股因子:
多为财务指标,如营业利润率、销售净利率、营业收入环比增长率等;
量化择时因子:
多为技术指标,如均线、换手率、波动率等
流程:
因子构造 -> 因子选股 -> 构建股票池 -> 策略回测
3.常用基础因子
1.价量因子
价量因子,是指利用get_price()函数可以获取到的价量信息,如open(开盘价)、close(收盘价)、high(最高价)、low(最低价)、volume(成交量)、money(成交金额)等
2.财务数据因子
财务数据因子,是指当日可以看到的最新单季财务指标,如peratio(动态市盈率)、turnover_ratio(换手率)、pb_ratio (市净率)、market_cap (股票的总市值)、circulating_market_cap(股票的流通市值)等
3.行业因子
行业因子包含证监会行业分类,聚宽一、二级行业分类以及申万一二、三级行业分类,如A01(农业)、A02(林业)、B06(煤炭开采和洗选业)、B07(石油和天然气开采业)、C36(汽车制造业)等。返回值是一个哑变量,若某股票属于某行业,则返回1;否则返回0
4.概念因子
概念因子,即概念板块代码,如GN028(智能电网)、GN030物联网)、GN092(高端装备制造)、GN181(一带一路)等。返回值是一个哑变量,如果某股票属于某个概念,则返回1;否则返回0
5.指数因子
指数因子,即指数代码,如000001.XSHG(上证指数)、000002.XSHG(A股指数)、000003.XSHG(B股指数)、000006.XSHG(地产指数)等。返回值是一个哑变量,若某股票是某指数的成分股,则返回1;否则返回0
6.资金流因子
资金流因子,即getmoney_flow函数查询的数据。可以使用的字段包括:change_pct (涨跌幅)、net amount_ main (力净额)、net_pct_main (力净占比)、net_amount_xl (超大单净额)、net_pct_xl (超大单净占比)、net amount_1 (大单净额)、net_pct_1(大单净占比)、net_amount_m (中单净额)、net_ pct_m (中单净占比)net_amounts(小单净额)和net_pct_s(小单净占比) (反应庄家占比)
小结
因子分析概述
因子类别及流程
常用基础因子
2.自定义因子实战
1.自定义因子
自定义因子类:
三个基本属性,分别为name、max_window 和dependencies;一个核心函数,calc()
流程:
构造因子属性 -> 实现因子计算 -> 因子分析
name:
因子名称。因子命名只能由字母、数字和下画线组成,并且第一个字符不能是数字,另外不能与Python中的HD关键字相同,也不能与基础因子冲突
max_window:
获取数据的最长时间窗口,返回日线数据
dependencies:
自定义因子依赖的基础因子名称,如high,low,close
2.因子计算
实现方式:
实现Factor类内置calc(函数)
calc(self,data)
data: 字典对象
key属性是dependencies中的因子名称;
value属性是因子对应的数据表(pandas.DataFrame格式)示例
def calc(self, data):
return data['close'][ -10:].mean()
返回
Pandas.Series:index属性是股票代码,value属性是因子值3.单因子分析
实现方式:
调用analyze_factor
analyze factor(
factor,
start_date,
end_date,
industry,
universe,
quantiles,
periods,
weight_ method,
use _real_price,
skip_paused,
max_loss,
factor_dep_definitions
)factor:获因子值,可输入三种类型的值
pandas.DataFrame:因子值,columns为股票代码 ('000001.XSHE') ,index为日期的Datetimelndex或str
pandas.Series:因子值,index为日期和股票代码的Multilndex
Fator的子类,自定义因子
start_date:开始日期
end_date:结束日期
industry:获行业分类,默认为jq_I1; sw11:申万一级行业;'sw I2:申万二级行业;sw 13:申万三级行业;jq11聚宽一级行业;jq12:聚宽二级行业;zjw:'证监会行业'
universe:对股票池的定义,可输入两种类型的值。为str时认为输入的是一个指数,股票池为这个指数的成分股,为list时认为输入的是一个股票池;当factor输入为因子值时(DataFrame、Series),该参数无效
quantiles:分位数数量,默认为5
periods:调仓周期,int或int的列表,默认为[1,5,10]
weight_method:计算分位数收益时的加权方法;avg:按平均加权;mktcap:按市值加权
use_real_price:是否动态复权,默认为False(当factor为因子值时这个参数失效)
skip_paused:是否跳过停牌,默认为False(当factor为因子值时这个参数失效)
maxloss:因重复值或nan值太多而无效的因子值的最大占比,默认为0.25
factor_dep_definitions:主因子的依赖因子的列表,默认为空列表(注:当factor为因子值时这个参数失效
4.代码示例
jupyter中运行以下代码
from jqfactor import Factor,analyze_factor
warnings.filterwarnings('ignore')
class MA10(Factor):
#因子名称为'ma10'
name = 'ma10'
#设定最长时间窗口
max_window = 10
#设置依赖的基础因子
dependencies = ['close']
#实现因子计算
def calc(self,data):
return data['close'][-10:].mean()
#单因子分析
far = analyze_factor(factor=MA10,
start_date='2022-01-01',
end_date='2022-06-30',
weight_method='mktcap',
universe='000300.XSHG',
industry='jq_11',
quantiles=8,
periods=(1,5,10))
#分析结束后通过不同属性获取数据
#月度信息系数
far.ic_monthly
'''text
period_1 period_5 period_10
2022-01 -0.089596 -0.192517 -0.226488
2022-02 0.004491 0.011325 -0.054634
2022-03 -0.078828 -0.106743 -0.134678
2022-04 -0.029746 0.005308 0.058185
2022-05 -0.007236 0.080919 0.089145
2022-06 0.049581 0.125328 0.163221
'''小结
自定义因子类
因子计算
单因子分析
3.因子分析结果
1.结果展示函数
实现方式:
create_full_tear_sheet(demeaned=False, group_adjust=False,by_group=False, turnover_periods=None, avgretplot=(5, 15), std_bar=False)
demeaned:是否使用超额收益计算
- True:使用超额收益计算(基准收益被认为是每日所有股票收益按照weight列中权重加权的均值)
- False:不使用超额收益
group_adjust:是否使用行业中性化收益计算
- False:不使用行业中性化后的收益
- True:使用行业中性化后的收益计算(行业收益被认为是每日各个行业股票收益按照weight列中权重加权的均值)
by_group:是否按行业展示
- True:按行业展示
- False:不按行业展示
turnover_periods:调仓周期
avgretplot:tuple因子预测的天数(计算过去的天数,计算未来的天数)
std_bar:是否使用标准差
True:显示标准差
False:不显示标准差
2.结果分析
收益分析:
因子收益分析。包含7种常见的收益分析。
IC分析:
指Information Coefficient,IC代表预测值和实现值之间的相关性,通常用以评价预测能力。取值在-1至1之间,值越大,表示预测能力越好
换手率分析:
因子的换手率是在不同的时间周期下,观察因子个分位中个股的进出情况;
收益分析详解:
在收益分析中,分位数的平均收益,各分位数的累积收益,以及分位数的多空组合收益三方面观察因子的表现。第一分位数的因子值最小,第五分位数的因子值最大
分位数收益:表示持仓1、5、10天后,各分位数可以获得的平均收益
分位数的累积收益:表示各分位数持仓收益的累计值
多空组合收益:做多五分位(因子值最大),做空一分位(因子值最小)的投资组合的收益
IC分析:
一般有两种方法,即normalIC和rankIC。聚宽量化交易平台计算的是rank IC
normalIC:因子载荷与因子收益之间的相关系数
rankIC:因子载荷的排序值与收益的排序值之间的相关系数
考虑到单日IC的波动较大,聚宽提供了KC的月度移动平均线作为参考
换手率分析:
计算方法举例:
某因子第一分位持有的股票数量为30支,一天后有一只发生变动,其换手率为:1/30*100%=3.33%
对于5日、10日的换手率,在每日都会对比当日1、5分位数的成分股与5日、10日前该分位数的成分股的变化进行计算
价值:
因子稳定性的体现:换手率低的因子,因子值在时间序列层面的持续性更好
衡量交易成本:在实际的交易过程中,假设我们要维护投资组合的因子暴露恒定,对于高换手率因子,则需要进行更多的交易。交易中的税费和滑点,也会吞噬掉我们的部分利润
3.代码示例
jupyter中运行以下代码
from jqfactor import analyze_factor
from jqfactor import Factor
warnings.filterwarnings('ignore')
#自定义因子类
class MA5(Factor):
name='ma5'
max_window = 5
dependencies = ['close']
def calc(self,data):
return data['close'][-5:].mean()
#进行单因子分析
far = analyze_factor(factor=MA5,
start_date= '2022-01-01',
end_date='2022-03-01',
weight_method= 'mktcap',
universe='000300.XSHG',
industry='jq_l1',
quantiles=8,
periods=(1,5,10))
#结果展示,绘制图表
far.create_full_tear_sheet(demeaned=False,
group_adjust=False,
by_group=False,
turnover_periods=None,
avgretplot=(5,15),
std_bar=False)小结
结果分析函数
结果分析
代码示例
4.Alpha因子
1.Alpha因子
Alpha191:
国泰君安数量化专题研究报告-《基于短周期价量特征的多因子选股imooc体系》给出了191个短周期交易型阿尔法因子。聚宽量化平台根据这份报告选取并实现了191个Alpha因子,并开源给大家使用。
Alpha013:
因子公式:((HIGH*LOW)^0.5)-VWAP),最高价减去最低价开方,并且减去VWAP;
2.代码示例
jupyter中运行以下代码
# 导入函数库
from jqfactor import Factor
import numpy as py
from jqfactor import analyze_factor
warnings.filterwarnings('ignore')
-p).mean())
#进行单因子分析
far = analyze_factor(factor=ALPHA013,
start_date= '2022-01-01',
end_date='2022-03-01',
weight_method= 'mktcap',
universe='000300.XSHG',
industry='jq_l1',
quantiles=8,
periods=(1,5,10))
#结果展示,绘制图表
far.create_full_tear_sheet(demeaned=False,
group_adjust=False,
by_group=False,
turnover_periods=None,
avgretplot=(5,15),
std_bar=False)