金融学习之三——晕头转向的alphalens

alphalens分析是一个进行单因子分析的开源项目。alphalens需要的数据有自己要求的格式,因此整个过程就分为两个部分:(a)处理数据,形成所需的格式(b)计算并理解数据的结果。
下午跑了一遍前文书中提到的alphalens单因子有效性分析,程序是跑完了,可结果还有待看懂,大概的过程如下:
(1)获取数据,进行初步处理

import tushare as ts
ts.set_token('*********************************')
pro=ts.pro_api()
data = pro.stock_basic(exchange='', list_status='L', fields='ts_code,symbol,name,area,industry,list_date')
data

在这里插入图片描述
在这里,我拿到了4179条上市公司的基本数据,包括行业,股票名称和代码等等,为了简化操作,我们只取前100支股票进行操作

data_code=data[:100]
data_code
#对数据中的行业进行编码并生成字典
t=data_code.industry.unique()
tlen=range(0,len(t))
in_id=dict(zip(tlen,t))
in_id_r=dict(zip(t,tlen))
data_code['in_id']=data_code['industry'].map(in_id_r)
code_sec=dict(zip(data_code.ts_code,data_code.in_id))

取出这100支股票的行情数据。为了对齐交易日期,使用沪深300指数的交易日期作为所有股票的索引基准。

df=pro.trade_cal(exchange='SSE',start_date='2013-01-01',end_date='2017-12-31')
df=df.set_index('cal_date')
df['399300']=df.is_open
df=df[['399300']]
for i in data_code.ts_code:
    dfn=pro.daily(ts_code=i,start_date='2013-01-01',end_date='2017-12-31')
    dfn=dfn.set_index('trade_date')
    df[i]=dfn.open
import pandas as pd
df.index=pd.to_datetime(df.index)
del df['399300']
df

在这里插入图片描述
根据书上的操作,选用未来5日的收益率作为因子进行分析。

lookahead_bias_days=5
pre_factor=df.pct_change(lookahead_bias_days)
pre_factor=pre_factor.shift(-lookahead_bias_days)
pre_factor=pre_factor.stack()
pre_factor.index=pre_factor.index.set_names(['date','asset'])
pri=df

最后使用alphalens的整合函数来整理数据:

import alphalens
data1=alphalens.utils.get_clean_factor_and_forward_returns(pre_factor,pri,quantiles=5,bins=None,groupby=code_sec,groupby_labels=in_id)
data1

在这里插入图片描述
到此数据的整理才算结束,可以进行分析操作了。
(2)收益率分析
首先查看不同分位数的因子和收益率的相关性:

mean_return_by_q,std_err_by_q=alphalens.performance.mean_return_by_quantile(data1,by_group=False)
mean_return_by_q.head()

在这里插入图片描述
画个图更容易观察:

alphalens.plotting.plot_quantile_returns_bar(mean_return_by_q)

在这里插入图片描述
据书上的说明是“随着因子的增大,未来的收益率也会增加,说明因子和收益率有很强的相关性,是一个不错的因子“,反正我没太懂。
再绘制一下每个调仓期最高因子和最低因子收益率的差值图:

mean_return_by_q_daily,std_err=alphalens.performance.mean_return_by_quantile(data1,by_date=True)
quant_return_spread,std_err_spread=alphalens.performance.compute_mean_returns_spread(mean_return_by_q_daily,upper_quant=5,lower_quant=1,std_err=std_err)
alphalens.plotting.plot_mean_quantile_returns_spread_time_series(quant_return_spread,std_err_spread)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
分3种时间长度来计算,绿色部分是最高因子收益率和最低因子收益率的差值,橙色是绿色线的移动平均线。如果一个因子有效,那么这个差值应该是稳定的大于0的,看上去貌似这个因子还不错。
再来求取不同分位数因子的累积净值:

alphalens.plotting.plot_cumulative_returns_by_quantile(mean_return_by_q_daily,period=5)

在这里插入图片描述
实际上,上述的结果和图都可以通过下面的一个函数全部给显示出来,都是重复性内容,图我就不贴了。

alphalens.tears.create_returns_tear_sheet(data1)alphalens.tears.create_returns_tear_sheet(data1)

(3)信息系数分析
信息系数可以从另一个角度来衡量因子有效性,信息系数的值在0-1之间,0表示无预测作用,1表示有完全预测作用,所以一般越接近1越好。
计算信息比率:

ic=alphalens.performance.factor_information_coefficient(data1)
ic.head()

在这里插入图片描述
并绘制信息系数的图:

alphalens.plotting.plot_ic_ts(ic)

在这里插入图片描述
还可以通过直方图和QQ图观察信息系数的分布:

#直方图
alphalens.plotting.plot_ic_hist(ic)
#QQ图
alphalens.plotting.plot_ic_qq(ic)

在这里插入图片描述
在这里插入图片描述
从图上可以看出,信息系数的分布类似于正态分布,平均值较好。
最后绘制出每个月的信息系数表现图:

mean_monthly_ic=alphalens.performance.mean_information_coefficient(data1,by_time='M')
alphalens.plotting.plot_monthly_ic_heatmap(mean_monthly_ic)

在这里插入图片描述
最后这张热力图不知道在说什么,书上也没解释,小白好苦啊。
上面的这些信息系数的报表也可以通过下面这个函数一次显示:

alphalens.tears.create_information_tear_sheet(data1)

后面就没有了,没有完全看懂,作者还欠我很多个解释哈。

  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值