JQFactor是聚宽提供的单因子分析Python包,限定在聚宽的研究环境中使用。另外聚宽还提供了一个可以在本地Python开发环境中使用的jqfactor_analyzer,在本地直接用pip安装即可。二者大同小异。这里以JQFactor为例介绍其单因子分析的基本概念和分析结果的详细说明。
这是本文用到的示范代码:https://download.csdn.net/download/u010302494/12031300
一、因子和单因子分析的概念
一个非常有趣的现象就是讲单因子的文章非常多,但什么是因子似乎很难找到一个规范的定义。这里给出我的理解:因子就是以投资对象(例如一只股票)、和交易日期为自变量的二元函数。即给定交易对象和交易日期,我们能通过一种因子算法得到唯一确定的一个实数,这个实数就叫做交易对象在这个交易日的因子值。例如,股票的每日收盘价、市盈率、涨幅都可以看做股票在该日的不同因子。理论上因子的种类是无穷多的。聚宽网站提供了大量经典单因子的定义、历史数据和历史表现:https://www.joinquant.com/view/factorlib/list。开发者也可以自己定义因子的算法。
所谓单因子分析就是要从众多因子中找出能有效预测投资对象未来价格变化情况的因子。
二、单因子分析
1 因子数据准备:
单因子分析的第一步是要计算好所有考察对象在所有考察日期的因子值,保存在一个通常取名为factor的变量中。关于factor的格式说明如下:
pandas.DataFrame: 因子值, columns 为股票代码 (如 '000001.XSHE'), index 为 日期的 DatetimeIndex
或者 pandas.Series: 因子值, index 为日期和股票代码组成的 MultiIndex
或者 Factor 的子类: 因子算法,即通过定义一个Factor的子类来提供因子算法
JQFactor提供了get_factor_values函数可以直接调用很多现成的单因子数据,聚宽网站上有这些单因子数据的详细说明:https://www.joinquant.com/view/factorlib/list
此外,聚宽还提供了专门的本地数据获取模块JQData,可以从聚宽网站上下载量化分析需要用到的几乎所有的数据,其中就包括了许多高质量的因子数据,点击这个链接可以访问
下图是一个第一种格式factor的示例

2 单因子分析函数调用:
采用JQFactor进行单因子分析非常简单,直接调用函数analyze_factor即可。这个函数参数的详细说明这里就不拷贝了,大家用help去看JQFactor.analyze_factor的帮助即可。对于初学者来说只需要输入factor这一个参数,其它所有参数都有默认值。
analyze_factor调用后返回一个类型为jqfactor.analyze.FactorAnalyzerResult的对象,通常用变量far表示。这个变量拥有非常复杂的结构和功能,包含了所有分析结果的数据和图表,解读这个变量才是难点,也是本文的重点。
3 单因子分析结果详解:
far.factor_data:因子值,内容等同于最初输入的factor。这是一个pandas.Series类型的变量,其索引为日期和股票代码生成 MultiIndex。如下图所示:

return(Code,T):代码为Code的股票T日的日收益率=T+1日收盘价/T日收盘价-1。这里要注意,这个收益率的定义跟我们常用的日涨幅的定义不一致。我们常用的T日的日涨幅=T日收盘价/T-1日收盘价-1,而JQFactor中T日的日收益率相当于我们常用定义中的T+1日的日涨幅,它的含义是在T日买入股票,持股一个交易日后的收益率,以此来评估在T日买入股票的价值。
JQFactor并没有暴露这个值供用户访问,但JQFactor是以这个值为基础演算出了后续所有分析结果,所以必须把这个概念讲清楚才能理解后续的各种概念。
forward_return(Code,T,N):代码为Code的股票在T日调仓周期为N期间内的return的总和=return(Code,T)+return(Code,T+1)+……+return(Code,T+N-1)。这个数字可以在far.clean_factor_data中看到。调仓周期长度N在调用analyze_factor时用参数periods给出, 默认值为三种调仓周期 [1, 5, 10]。所谓调仓周期的含义就是买入股票持股N日后卖出。
period_wise_return(Code,T,N):代码为Code的股票在T日调仓周期为N的期间平均日收益率=forward_return(Code,T,N)/N,即周期内每日收益率return的平均值。period_wise_return代表持股期间每日收益率的平均值——注意,不是持股期间的总收益率哦。
JQFactor基于每只股票每日的return来计算每只股票每日针对不同调仓周期的period_wise_return,JQFactor没有提供对这个数据的直接访问,但提供了很多基于这个数据的不同分类统计结果。JQFactor分析结果中的各种mena_return,其实就是对这个period_wise_return取的加权平均值。为简化起见,下文中将period_wise_return简称为因子收益
far.clean_factor_data:经过清洗、整理、初步处理后的因子数据,包含了完备的信息,从这张表中可以推导出所有的单因子分析统计结果,如下图所示。
period_1、period_5、period_10:分别代表调仓周期为1、5、10个交易日的forward_return。例如下图中第一行数字-0.045253,代表2018年1月2日这天,平安银行的从1月2日到1月8日连续五个交易日的return之和为-0.045253
factor:因子值
group:所属行业名称
factor_quantile:所属分层的序号。单因子分析的基本操作之一就是在每个交易日根据因子值的大小把全部股票平均分为Q层(Q在调用analyze_factor时用参数 quantiles给出, 默认值为 5),factor_quantile代表每种股票在每天所属分层的编号。
weight:计算每层的收益时,该股票所占权重的计算方法,在调用analyze_factor时用参数weight_method给出,默认值为"avg",即每种股票按等权重计算。下图示例采用的是weight_method="mktcap",即按股票市值加权

far.mean_return_by_date:给出各调仓周期各分层在各交易日的所有股票的因子收益的加权平均值。下图数字0.003646表示在2018-1-2这一天第一分层的所有股票针对调仓周期为5的因子收益的加权平均值

far.mean_return_std_by_date:给出按分层、日期、调仓周期分组的因子收益的标准差

far.mean_return_by_quantile:给出各调仓周期各分层的因子收益的加权平均值

far.mean_return_std_by_quantile:给出各调仓周期各分层的因子收益的标准差

far.mean_return_by_group:给出各分层各行业的因子收益的加权平均值

far.mean_return_std_by_group:给出各分层各行业的因子收益的标准差

far.mean_return_spread_by_quantile:最高分层因子收益与最低分层因子收益之差,即用far.mean_return_by_date中最高分层的数据减去最低分层的数据即可,这个数据代表因子值的变化对收益变化的影响程度。

far.mean_return_spread_std_by_quantile:最高分层因子收益与最低分层因子收益之差的标准差。

未完待续