本模板主要用于分析标准库Alpha101,和Alpha191两个标准库中的因子,以及使用def()方式自定义的因子进行全信息分析,只用引入因子,设置测试时间,测试股票池子,就能实现快速的完成因子测试,本模板基于聚宽的因子研究模板,做了适当的修改。在此感谢聚宽。
标准因子库因子分析模板¶
# 导入函数库
from jqdata import *
import numpy as np
import pandas as pd
import jqfactor
from jqlib import alpha191
from jqlib.alpha191 import *
from jqfactor import get_factor_values
from jqfactor import Factor
from jqfactor import analyze_factor
warnings.filterwarnings('ignore')
#获取交易日期列表
#四个参数分别为开始日期,结束日期,交易周期('day','month','quarter','halfyear'),count:天数,与start二者取其一
def get_tradeday_list(start,end,frequency=None,count=None):
if count != None:
df = get_price('000001.XSHG',end_date=end,count=count)
else:
df = get_price('000001.XSHG',start_date=start,end_date=end)
#如果频率为“day”或者没有设置,直接返回df.index
if frequency == None or frequency =='day':
return df.index
else:
#否则增加一列'year-month',值为前7位
df['year-month'] = [str(i)[0:7] for i in df.index]
if frequency == 'month':
return df.drop_duplicates('year-month').index#删除重复项,设置'year-month'为index
elif frequency == 'quarter':#季度
df['month'] = [str(i)[5:7] for i in df.index]
df = df[(df['month']=='01') | (df['month']=='04') | (df['month']=='07') | (df['month']=='10') ]
return df.drop_duplicates('year-month').index
elif frequency =='halfyear':
df['month'] = [str(i)[5:7] for i in df.index]
df = df[(df['month']=='01') | (df['month']=='06')]
return df.drop_duplicates('year-month').index
# 设置起止时间
start='2016-07-01'
end='2016-08-01'
# 设置调仓周期
periods=(5,10,20)
# 设置分层数量
quantiles=5
#获取日期列表
date_list = get_tradeday_list(start=start,end=end,count=None)#获取回测日期间的所有交易日
date_list
#定义一个空的dataframe记录因子值
factor_df = pd.DataFrame()
#循环计算给定日期范围的因子值
mark = 1
for d in date_list:
pool = get_index_stocks('000905.XSHG',date=d)
#alpha191.alpha_005为因子库,标准因子,也可以用定义因子函数
far=alpha191.alpha_005(pool, end_date=d)
if mark == 1:
factor_df = far
mark = 0
else:
#逐日合并factor_df
factor_df = pd.concat([far,factor_df],axis=1,sort=True)
#将columns更改为可以日期标签
factor_df.columns = date_list
factor_df.head()
#数据清洗、包括去极值、标准化、中性化等,并加入y值
from jqfactor import *
for date in date_list:
#对数据进行处理、标准化、去极值、中性化
#factor_df = winsorize_med(factor_df, scale=3, inclusive=True, inf2nan=True, axis=0) #中位数去极值处理
se = standardlize(factor_df[date], inf2nan=True) #对每列做标准化处理
se = neutralize(se, how=['liquidity'], date=date)#剔除原始因子值与流动性相关的部分
factor_df[date] = se
#进行转置,调整为分析可用的格式
factor_df = factor_df.T
factor_df.head()
#使用获取的因子值进行单因子分析
far = analyze_factor(factor=factor_df, start_date=date_list[0], end_date=date_list[-1], weight_method='avg', industry='jq_l1', quantiles=quantiles, periods=periods,max_loss=0.3)
# 打印信息比率(IC)相关表
far.plot_information_table(group_adjust=False, method='rank')
# 画各分位数平均收益图
far.plot_quantile_returns_bar(by_group=False, demeaned=0, group_adjust=False)
# 打印换手率表
far.plot_turnover_table()
#调用因子分析方法,进行因子信息全览
far.create_full_tear_sheet(demeaned=False, group_adjust=False, by_group=False, turnover_periods=None, avgretplot=(5, 15), std_bar=False)
# 计算指定调仓周期的各分位数每日累积收益
df = far.calc_cumulative_return_by_quantile(period=5)
#进行数据展示
df.plot(figsize=(15,6))