因子分析(by+alphalens)
目录Alphalens是什么?
使用Alphalens的数据准备工作?
如何用Alphalens测试选股因子效果?
什么是信息系数?
如何通过信息系数的可视化呈现进一步观测因子效果?
更多:因子在不同板块的选股能力比较分析
Alphalen是什么?
Alphalens是一个Python第三方库,专门用于选股因子alpha(α)的绩效分析。因子:
对股价未来涨跌有预测效果的指标
下载方式: pip install alphalens==0.2.1
使用Alphalens的数据准备工作?factor: MultiIndex(用stack()方法来转换)
prices: DataFrame
索引要求均为日期-datetime日期格式
将以上数据通过alphalens处理成标准格式-factor_data 用于进一步分析
下面以沪深300成分股为例,构造选股因子(factor)并
fromjaqs_fxdayu.dataimportDataView# 可以视为一个轻量级的数据库,数据格式基于pandas,方便数据的调用和处理
fromjaqs_fxdayu.dataimportRemoteDataService# 数据服务,用于下载数据
importos
importwarnings
warnings.filterwarnings("ignore")
dataview_folder='../Factor'
ifnot(os.path.isdir(dataview_folder)):
os.makedirs(dataview_folder)
# 数据下载
defsave_dataview():
data_config={
"remote.data.address":"tcp://data.quantOS.org:8910",
"remote.data.username":"18566262672",
"remote.data.password":"eyJhbGciOiJIUzI1NiJ9.eyJjcmVhdGVfdGltZSI6IjE1MTI3MDI3NTAyMTIiLCJpc3MiOiJhdXRoMCIsImlkIjoiMTg1NjYyNjI2NzIifQ.O_-yR0zYagrLRvPbggnru1Rapk4kiyAzcwYt2a3vlpM"
}
ds=RemoteDataService()
ds.init_from_config(data_config)
dv=DataView()
props={'start_date':20140101,'end_date':20140201,'universe':'000300.SH',
'fields':"pb,pe,ps,float_mv,sw1",
'freq':1}
dv.init_from_config(props,ds)
dv.prepare_data()
dv.save_dataview(dataview_folder)# 保存数据文件到指定路径,方便下次直接加载
# save_dataview()
# 加载数据
dv=DataView()
dv.load_dataview(dataview_folder)Dataview loaded successfully.
dv.fields['low_adj',
'index_weight',
'ps',
'index_member',
'close_adj',
'high_adj',
'sw1',
'float_mv',
'high',
'open_adj',
'vwap_adj',
'pb',
'open',
'pe',
'vwap',
'close',
'adjust_factor',
'low',
'trade_status']
importpandasaspd
fromdatetimeimportdatetime
factor=dv.get_ts("pb")
factor.index=pd.Index(map(lambdax:datetime.strptime(str(x),"%Y%m%d"),factor.index))#索引调整为datetime日期格式
factor=factor.stack()#处理成MultiIndex格式(alphalens分析因子必须的格式)
factor.head()symbol
2014-01-02 000001.SZ 1.0563
000002.SZ 1.2891
000008.SZ 4.8981
000009.SZ 3.5794
000012.SZ 2.3725
dtype: float64
defchange_index(df):
df.index=pd.Index(map(lambdax:datetime.strptime(str(x),"%Y%m%d"),df.index))