Alphalens笔记
一、Alphalens 简介
Alphalens是用于因子分析的Python工具包,是Quantopian公司旗下三大开源包之一,另外两个分别是 Zipline(回测)和Pyfolio(绩效和风险分析)。
- Github-Zipline:回测
- Github-Alphalens:因子分析
- Github-Pyfolio:绩效和风险分析
Alphalens的主要功能:
- Returns Analysis
- Information Coefficient Analysis
- Turnover Analysis
- Grouped Analysis
二、Alphalens 安装
alphalens 0.3.6
使用pip安装:
pip install alphalens
使用conda安装:
conda install -c conda-forge alphalens
三、Alphalens 使用
1、数据预处理
factor_data = utils.get_clean_factor_and_forward_returns(factor_df, price_df,
quantiles=5, bins=None,periods=(1, 5, 10, 20), max_loss=0.5)
factor_df:
price_df:
factor_data:
2、主要功能 alphalens.tears.create_full_tear_sheet
def create_full_tear_sheet(factor_data,long_short=True,group_neutral=False,by_group=False):# 因子分组统计结果plotting.plot_quantile_statistics_table(factor_data)# 因子收益率分析create_returns_tear_sheet(factor_data,long_short,group_neutral,by_group,set_context=False)# 因子IC分析create_information_tear_sheet(factor_data,group_neutral,by_group,set_context=False)create_turnover_tear_sheet(factor_data, set_context=False)
1)因子分组统计结果
plotting.plot_quantile_statistics_table(factor_data)
生成Quantiles Statistics,因子值factor_data[‘factor’]按不同分组factor_data[‘factor_quantile’]进行统计分析。
2)因子收益率分析
create_returns_tear_sheet
def create_returns_tear_sheet(factor_data,long_short=True,group_neutral=False,by_group=False):# weights = factor_weights(factor_data, demeaned, group_adjust, equal_weight)# weights = (factor - factor.mean())/sum(abs((factor - factor.mean())))# 某一交易日所有股票的因子值,去中心化(factor - factor.mean())后得到权重weights# 该交易日的factor_returns=factor_data中的收益率按照weights加权平均# factor_returns相当于是因子值加权的收益率,其中weights和为0。 factor_returns = perf.factor_returns(factor_data,long_short,group_neutral)# Compute mean returns for factor quantiles across provided forward returns columns.# 首先,对同一横截面上的收益率去中心化处理(x - x.mean())# 然后,对不同分组factor_quantile(level)计算去中心化收益率的均值(mean_quant_ret)和# 标准差(std_quantile)mean_quant_ret, std_quantile = \perf.mean_return_by_quantile(factor_data,by_group=False,demeaned=long_short,group_adjust=group_neutral)# period_ret.add(1).pow(conversion_factor).sub(1)# 将收益率按照base_period统一计算维度mean_quant_rateret = \mean_quant_ret.apply(utils.rate_of_return, axis=0,base_period=mean_quant_ret.columns[0])# compute quantile bucket returns separately for each date.# 首先,对横截面上的收益率去中心化(x - x.mean())# 然后,对不同分组和不同日期分别计算去中心化收益率的均值(mean_quant_ret_bydate)# 和标准差(std_quant_daily)mean_quant_ret_bydate, std_quant_daily = \perf.mean_return_by_quantile(factor_data,by_date=True,by_group=False,demeaned=long_short,group_adjust=group_neutral)mean_quant_rateret_bydate = mean_quant_ret_bydate.apply(utils.rate_of_return, axis=0,base_period=mean_quant_ret_bydate.columns[0])compstd_quant_daily = \std_quant_daily.apply(utils.std_conversion, axis=0,base_period=std_quant_daily.columns[0])# reg_fit = OLS(y, x).fit()# alpha, beta = reg_fit.params# x为横截面上所有个股的平均收益率,x代表市场表现# x = add_constant(x)# y为因子值加权的收益率(factor_returns)alpha_beta = perf.factor_alpha_beta(factor_data,factor_returns,long_short,group_neutral)# Top组的mean_quant_rateret_bydate - Bottom组的mean_quant_rateret_bydatemean_ret_spread_quant, std_spread_quant = \perf.compute_mean_returns_spread(mean_quant_rateret_bydate,factor_data['factor_quantile'].max(),factor_data['factor_quantile'].min(),std_err=compstd_quant_daily)fr_cols = len(factor_returns.columns)vertical_sections = 2 + fr_cols * 3gf = GridFigure(rows=vertical_sections, cols=1)# 表格Returns Analysis(不同周期下的收益率结果):# alpha、beta、mean_quant_rateret.iloc[-1]、mean_quant_rateret.iloc[0]、# mean_ret_spread_quant.mean()plotting.plot_returns_table(alpha_beta,mean_quant_rateret,mean_ret_spread_quant)# 柱形图Mean Period Wise Return By Factor Quantile:# mean_quant_rateret,分组平均超额收益(收益去中心化处理)plotting.plot_quantile_returns_bar(mean_quant_rateret,by_group=False,ylim_percentiles=None,ax=gf.next_row())# 小提琴图violinplotting.plot_quantile_returns_violin(mean_quant_rateret_bydate,ylim_percentiles=(1, 99),ax=gf.next_row())# <CustomBusinessDay>trading_calendar = factor_data.index.levels[0].freqif trading_calendar is None:trading_calendar = pd.tseries.offsets.BDay()warnings.warn("'freq' not set in factor_data index: assuming business day",UserWarning)for p in factor_returns:# p遍历factor_returns的列名1D、5D、10D、20Dtitle = ('Factor Weighted '+ ('Group Neutral ' if group_neutral else '')+ ('Long/Short ' if long_short else '')+ "Portfolio Cumulative Return ({} Period)".format(p))# 因子加权的多空累计收益净值曲线# Factor Weighted Long/Short Portfolio Cumulative Return (1D Period)# factor_returns = perf.cumulative_returns(factor_returns, period, freq)plotting.plot_cumulative_returns(factor_returns[p],period=p,freq=trading_calendar,title=title,ax=gf.next_row())# 因子分组超额收益净值曲线plotting.plot_cumulative_returns_by_quantile(mean_quant_ret_bydate[p],period=p,freq=trading_calendar,ax=gf.next_row())ax_mean_quantile_returns_spread_ts = [gf.next_row()for x in range(fr_cols)]plotting.plot_mean_quantile_returns_spread_time_series(mean_ret_spread_quant,std_err=std_spread_quant,bandwidth=0.5,ax=ax_mean_quantile_returns_spread_ts)plt.show()gf.close()
去中心化因子的加权收益率
demeaned = True
weights = factor_weights(factor_data, demeaned, group_adjust, equal_weight)
weights = (factor - factor.mean())/sum(abs((factor - factor.mean())))
同一横截面上所有股票的因子值,去中心化(factor - factor.mean())后得到权重weights
该交易日的因子加权收益率factor_returns=factor_data中的收益率按照weights加权平均
factor_returns = perf.factor_returns(factor_data, long_short, group_neutral)
mean_quant_rateret
- 首先,对同一横截面上的收益率去中心化处理(x - x.mean()),factor_data[]
# factor_data['5D']=factor_data.groupby('date')['5D'].transform(lambda x: x - x.mean())
factor_data = utils.demean_forward_returns(factor_data)
- 然后,对不同分组factor_quantile(level)计算去中心化收益率的均值(mean_quant_ret)和标准差(std_quantile)
grouper = ['factor_quantile', factor_data.index.get_level_values('date')]
mean_quant_ret = factor_data.groupby(grouper)['1D','5D','10D','20D'].mean()
- 将收益率按照base_period统一计算维度
mean_quant_rateret = mean_quant_ret.add(1).pow(conversion_factor).sub(1)
表格Returns Analysis(不同周期下的收益率结果):
alpha、beta、 mean_quant_rateret.iloc[-1]、mean_quant_rateret.iloc[0]、mean_ret_spread_quant.mean()
plotting.plot_returns_table(alpha_beta,mean_quant_rateret,mean_ret_spread_quant)
分组平均超额收益Mean Period Wise Return By Factor Quantile:
mean_quant_rateret,分组平均超额收益(收益去中心化处理)
plotting.plot_quantile_returns_bar(mean_quant_rateret,by_group=False,ylim_percentiles=None,ax=gf.next_row())
因子加权的多空累计收益净值曲线
# Factor Weighted Long/Short Portfolio Cumulative Return (1D Period)
# factor_returns = perf.cumulative_returns(factor_returns, period, freq)
plotting.plot_cumulative_returns(factor_returns[p],period=p,freq=trading_calendar,title=title,ax=gf.next_row()
)
因子分组超额收益净值曲线
plotting.plot_cumulative_returns_by_quantile(mean_quant_ret_bydate[p],period=p,freq=trading_calendar,ax=gf.next_row()
)
mean return spread 分布
Top组的mean_quant_rateret_bydate - Bottom组的mean_quant_rateret_bydate
3)IC分析
create_information_tear_sheet
def create_information_tear_sheet(factor_data,group_neutral=False,by_group=False):# Computes the Spearman Rank Correlation between factor values and# N period forward returns for each period in the factor index.# 计算每个横截面上,因子值与不同周期收益率的spearman相关系数 ic = perf.factor_information_coefficient(factor_data, group_neutral)# 生成IC表Information Analysis:plotting.plot_information_table(ic)columns_wide = 2fr_cols = len(ic.columns)rows_when_wide = (((fr_cols - 1) // columns_wide) + 1)vertical_sections = fr_cols + 3 * rows_when_wide + 2 * fr_colsgf = GridFigure(rows=vertical_sections, cols=columns_wide)ax_ic_ts = [gf.next_row() for _ in range(fr_cols)]plotting.plot_ic_ts(ic, ax=ax_ic_ts)ax_ic_hqq = [gf.next_cell() for _ in range(fr_cols * 2)]plotting.plot_ic_hist(ic, ax=ax_ic_hqq[::2])plotting.plot_ic_qq(ic, ax=ax_ic_hqq[1::2])plt.show()gf.close()
计算IC
ic = perf.factor_information_coefficient(factor_data, group_neutral)
计算同一横截面上收益率与因子的spearman相关性
stats.spearmanr( factor_data['5D'], factor_data['factor'])
生成IC表 Information Analysis
def plot_information_table(ic_data):ic_summary_table = pd.DataFrame()ic_summary_table["IC Mean"] = ic_data.mean()ic_summary_table["IC Std."] = ic_data.std()ic_summary_table["Risk-Adjusted IC"] = \ic_data.mean() / ic_data.std()t_stat, p_value = stats.ttest_1samp(ic_data, 0)ic_summary_table["t-stat(IC)"] = t_static_summary_table["p-value(IC)"] = p_valueic_summary_table["IC Skew"] = stats.skew(ic_data)ic_summary_table["IC Kurtosis"] = stats.kurtosis(ic_data)print("Information Analysis")utils.print_table(ic_summary_table.apply(lambda x: x.round(3)).T)
Alphalens笔记相关推荐
- Python量化交易学习笔记(1)
Python量化交易学习笔记(1) http://zwpython.com/ http://www.topquant.vip/?p=2275 [更多参见] <zwPython,目前最好的py开发 ...
- 【读书笔记】知易行难,多实践
前言: 其实,我不喜欢看书,只是喜欢找答案,想通过专业的解答来解决我生活的困惑.所以,我听了很多书,也看了很多书,但看完书,没有很多的实践,导致我并不很深入在很多时候. 分享读书笔记: <高效1 ...
- 【运维学习笔记】生命不息,搞事开始。。。
001生命不息,搞事不止!!! 这段时间和hexesdesu搞了很多事情! 之前是机械硬盘和固态硬盘的测速,我就在那默默的看着他一个硬盘一个机械测来测去. 坐在他后面,每天都能看到这位萌萌的小男孩,各 ...
- SSAN 关系抽取 论文笔记
20210621 https://zhuanlan.zhihu.com/p/353183322 [KG笔记]八.文档级(Document Level)关系抽取任务 共指id嵌入一样 但是实体嵌入的时候 ...
- pandas以前笔记
# -*- coding: utf-8 -*- """ Created on Sat Jul 21 20:06:20 2018@author: heimi "& ...
- PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call
您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...
- 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程
暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...
- 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移
暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...
- 王道考研 计算机网络笔记 第六章:应用层
本文基于2019 王道考研 计算机网络: 2019 王道考研 计算机网络 个人笔记总结 第一章:王道考研 计算机网络笔记 第一章:概述&计算机网络体系结构 第二章:王道考研 计算机网络笔记 第 ...
最新文章
- 预训练模型transformers综合总结(一)
- SpringBoot实战(十一)之与JMS简单通信
- @Autowired和@Resource注解的区别?
- Qt中基类widget的各个事件函数中包含了ignore()的调用
- mysql指数函数_SQL语言参考大全的目录
- doc文件转换html,HTML+CSS入门 如何使用POI将doc文件转换为HTML
- python进行usb通讯_Python实现树莓派USB串口通讯
- Linux下压缩、解压缩、效率,linux tar bz、bz2、gz、zip
- 程序员硬核测评:全方位测评 GaussDB(for Redis) 和开源 Redis
- centos 6.x下jira显示饼图乱码解决方法
- 最长递增子序列和双序列
- Ajax学习札记(前言)
- 解决Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile
- 从单张图重建三维人体模型综述(一)
- checkra1n越狱教程linux,Checkra1n iOS 13.6.1 越狱技术教程
- 通过矩形的中心坐标与原顶点坐标以及旋转角度计算矩形的旋转后4个顶点的位置...
- 编程. 已知字符串:this is a test of java. 按要求执行以下操作: (1) 统计该字符串中字母s出现的次数 (2) 取出子字符串test (3) 用多种方式将本字
- 二、计算机网络体系架构——网络工程师成长之路
- c++ union学习
- Access to XMLHttpRequest at ‘xxx‘ from origin ‘http://localhost:8082‘has been blocked by CORS policy
热门文章
- Java TCP实现高仿版QQ聊天(一)
- 【零成本 超详细】使用Win10自带的Hyper-V管理工具搭建虚拟机
- instrument之Time Profiler总结
- Discuz x2 数据字典
- 俄罗斯方块30周年 设计者忆当年
- 计算机语言排名labview,编程语言排名
- 嵌入式Linux使用TFT屏幕:使用树莓派4B的MIPI-DSI接口点亮ST7701S屏幕
- vscode 中python不能跳转问题
- python中temp的用法_python temp是什么
- 优品优男所谓“日有所思,夜有所梦”