Alphalens和Jqfactor_analyzer单因子分析解读
摘要:
Alphalens和Jqfactor_analyzer都是一款开源的Python 的工具包,Alphalens是Quantopian公司(成立9年的知名量化平台于今年10月正式宣告关门)旗下,是较早的开源回测框架,因其接口简单易用被广泛的量化分析师所青睐,不过alphalens 作为国外的开源量化模块,在使用时应该注意美股与A股的不同(比如A股是单向交易一般散户不能做空,采用的是T+1的交易制度等),同时考虑到Quantopian公司的倒闭之后的维护性也是一个问题。Jqfactor_analyzer是国内聚宽旗下的,最早的版本发布于2019年5月,提供的主要回测功能和Alphalens比较相似:因子收益、因子 IC、因子换手以及事件研究的基础上做了功能的完善,不过在框架上采用了面向对象的思想具有很好的封装性,在后续使用中也可以利用其继承特性进行个性化功能定制,同时由于其可以通过对象直接访问各个因子分析结果的值,所以具备更好的可理解性、可测试性和可修改性。在使用方式上和Alphalens也略有些不同,需要建立连接在线获取prices、行业、权重数据,耗费时间,整体上Jqfactor_analyzer性能劣于Alphalens,但是在单个功能尤其是数据清洗部分Jqfactor_analyzer较Alphalens有所提升。下面就围绕他们的主要回测功能进行介绍。
- 在介绍之前,首先给出我对因子和单因子分析的理解:因子就是以交易对象(股票)和交易日期为自变量的二元函数,通过这个函数得到交易对象在某个交易日的因子值。聚宽上提供了一些经典单因子的类别、概念、回测等,详见经典因子分析。
接口使用
- 获取因子数据
股票:[‘000001.XSHE’,‘000002.XSHE’,‘000004.XSHE’,‘000006.XSHE’]
因子:Skewness60 (个股收益的60日偏度)
时间:‘2020-09-01’ - ‘2020-10-01’
# 导入函数库
from jqdatasdk import get_factor_values
import jqdatasdk
import jqfactor_analyzer as ja
jqdatasdk.auth("username","password")
factor_data = get_factor_values(securities=['000001.XSHE','000002.XSHE','000004.XSHE','000006.XSHE'], factors=['Skewness60','DEGM','quick_ratio'], start_date='2020-09-01', end_date='2020-10-01')
# 将字典类型数据转换为DataFrame
factor_data = pd.DataFrame(factor_data['Skewness60'])
#
# 将 index 转换为 DatetimeIndex
factor_data.index = pd.to_datetime(factor_data.index)
print(factor_data)
- 对因子进行分析
# 对因子进行分析,参数使用默认值
far = ja.analyze_factor(factor=factor_data,industry='jq_l1',weight_method='mktcap',quantiles=2,periods=(1,5))
# 展示全部分析
far.create_full_tear_sheet(demeaned=False, group_adjust=False, by_group=False, turnover_periods=None,
avgretplot=(5, 15), std_bar=False)
主要功能解读
-
1. 因子收益表
-
1.1收益计算
以2020-09-01,000001.XSHE为例:
1期收益率计算为:
(2020-09-02 close - 2020-09-01 close)/ 2020-09-01 close
=(15.32-15.14)÷15.14= 0.0118890357
5期收益率计算为
(2020-09-08 close - 2020-09-01 close)/ 2020-09-01 close
(15.43-15.14)÷15.14=0.01915 -
1.2 因子值
factor为所选择因子Skewness60的值 -
1.3分组
group这里按照聚宽1类jq_l1分的 -
1.4权重
聚宽增加weights,本例选用的是市值权重mktcap,即根据同一quantile下市值进行权重分配(市值和权重成正比)
另外也可以选择 'avg’等权重(默认);‘mktcap’: 按总市值加权;‘ln_mktcap’: 按总市值的对数加权;‘cmktcap’: 按流通市值加权; ‘ln_cmktcap’: 按流通市值的对数加权 -
2.alpha、 beta计算
def factor_alpha_beta(factor_data, demeaned=True, group_adjust=False):
"""
计算因子的alpha(超额收益),
alpha t-统计量 (alpha 显著性)和 beta(市场暴露).
使用每期平均远期收益作为自变量(视为市场组合收益)
因子值加权平均的远期收益作为因变量(视为因子收益), 进行回归.
Parameters
----------
factor_data : pd.DataFrame - MultiIndex
一个 DataFrame, index 为日期 (level 0) 和资产(level 1) 的 MultiIndex,
values 包括因子的值, 各期因子远期收益, 因子分位数,
因子分组(可选), 因子权重(可选)
demeaned : bool
因子分析是否基于一个多空组合? 如果是 True, 则计算权重时因子值需要去均值
group_adjust : bool
因子分析是否基于一个分组(行业)中性的组合?
如果是 True, 则计算权重时因子值需要根据分组和日期去均值
Returns
-------
alpha_beta : pd.Series
一个包含 alpha, beta, a t-统计量(alpha) 的序列
"""
returns = fa