量化交易-单因子分析-alphalens

news/2024/5/8 8:08:15/文章来源:https://blog.csdn.net/xu624735206/article/details/129162947

1. 数据准备

1.1 计算因子IC重要函数

def get_clean_factor_and_forward_returns(factor,prices,groupby=None,binning_by_group=False,quantiles=5,bins=None,periods=(1, 5, 10),filter_zscore=20,groupby_labels=None,max_loss=0.35,zero_aware=False,cumulative_returns=True)
  • factor: pd.Series - MultiIndex 因子数据
  • prices:pd.DataFrame 价格数据,注意避免使用未来函数,例如可以使用第二天的开盘价
  • groupby : pd.Series - MultiIndex or dict 分组,如行业分组
  • binning_by_group : bool 是否分组进行计算
  • quantiles : int or sequence[float] 将股票按数量等分
  • bins : int or sequence[float] 按因子值等宽进行划分
  • periods : sequence[int] 收益计算周期/调仓周期
  • filter_zscore : int or float, optional 异常阈值的倍数,用来过滤掉涨跌幅特别大的股票,会导致前视偏差
  • groupby_labels : dict 分组标签
  • max_loss : float, optional 允许丢弃的最多的的数据的比例
  • zero_aware : bool, optional是否正负信号分开算
  • cumulative_returns : bool, optional 是否计算单利
  • 返回值 merged_data : pd.DataFrame - MultiIndex

1.2 准备因子数据

  • factor: pd.Series - MultiIndex 因子数据

请添加图片描述

  • 聚宽数据,本地运行计算
code = ["IC9999.CCFX", "IH9999.CCFX", "IF9999.CCFX"]
start_date = "2022-1-18"
end_date = "2023-1-18"
fre = "1d"
period = 5# Todo: 循环获取因子数据
factor_df = pd.DataFrame()for future in code:df = get_price(future, start_date=start_date, end_date=end_date, frequency=fre, panel=False)df["mom"] = momentum_factor(df, time_period=period)df["code"] = [future] * len(df)factor_df = pd.concat([factor_df, df[["code", "mom"]]])
factor_df = factor_df.reset_index()
factor_df = factor_df.sort_values(by="index")
factor_df = factor_df.set_index(["index", "code"])
print(factor_df)
  • 运行结果

请添加图片描述

  • 取单个因子,将 将MutlIndex DataFrame —> MutlIndex Series
factor_series = factor_df["mom"]
print(factor_series)
  • 运行结果

请添加图片描述

1.3 行情数据准备

  • prices:pd.DataFrame 价格数据

请添加图片描述

  • 聚宽数据,本地运行计算
code = ["IC9999.CCFX", "IH9999.CCFX", "IF9999.CCFX"]
df = get_price(code, start_date=start_date, end_date=end_date, frequency=fre, panel=False, fields=["close"])
df = df.set_index(["time", "code"])
df = df.close.unstack()
  • 运行结果

请添加图片描述

1.4 注意点

需要修改 alphalens.utils.compute_forward_returns中源码(342行)

# df.index.levels[0].name = "date"
# df.index.levels[1].name = "asset"
df.index.set_names(["date", "asset"], inplace=True)

2. 计算

2.1 IC 计算以及结果展示

# Todo: 生成alphalens通用结构
factor_return = utils.get_clean_factor_and_forward_returns(factor_series, df)
print(factor_return)# 获取每天的IC结果
res_ic = performance.factor_information_coefficient(factor_return)
print(res_ic)alphalens.plotting.plot_ic_ts(res_ic)
alphalens.plotting.plot_ic_hist(res_ic)
alphalens.plotting.plot_ic_qq(res_ic)plt.show()

请添加图片描述

请添加图片描述
请添加图片描述

2.2 因子收益率

  • 因子收益率是在固定周期内对因子暴露值和下期的收益率之间建立横截面回归方程。
  • 得到的权重系数即为因子收益率。
  • 因子的收益率与股票的收益率是有区别
    • 股票收益率:收盘之间计算
    • 因子的收益率:横截面数据回归方程得来, 特征值就是因子值,目标值是股票收益率

请添加图片描述

factor_pnl = tears.create_returns_tear_sheet(factor_return)
  • 返回表格内容
    • 给每个股票在每一天都打了分,那么,你得按照这个分数来分层次
    • 分5个层次,那么得分前20%的是第一层,即Top Quantile,最后面20%的是Bottom Quantile
    • 1、5、10,也就是按照每天调仓、一周调仓、半
    • 个月调仓来进行因子的测试
    • 第一行是按照这样的调仓周期,获得的年化alpha,beta(这里,alphalens中的beta是全市场的平均收益,而这里的全市场是每一个层加起来的平均收益)
    • 后面是每个层的收益。

请添加图片描述

  • 因子的方向:从小到大、从大到小、中间的位置
    • 用于回测的时候选股位置使用
    • 对第五组有正向预测,对第一组是方向预测

请添加图片描述

  • 分组因子的累积收益(一期)

请添加图片描述

请添加图片描述

  • 收益移动平均线
    请添加图片描述

2.3 统计指标

因子名称因子平均收益IC meanIC stdIC > 0.02IR
0.0004-0.0170.1920.425-0.0885

|

  • 第三列数据:在筛选因子的时候,会考虑某段时间的平均值大小。判断平均值大于某个数字,IC的值一般根据筛选严格程度取值,这个值可以自定义0.06意味筛选严格,大于 0.02会放松筛选(可以用在对开始很多因子的海选中) IC 大于 0.02 的比例
  • IR = IC mean / IC std IR值越大越稳定
  • 期货分层回测计算因收益

请添加图片描述

2.3 打分依据

  • 因子平均收益 > 0.002
  • IC mean > 0.03
  • IC > 0.02(50%)
  • IR > 0.3

2.4 研报统计结果

2.5 注意点

  • 用到19号的期货数据计算得到的因子值,是20号的因子值

  • 用到19号的期货数据计算得到的因子值,不能用于19号价格的预测,存在未来函数

  • 传递给Alphalens的价格数据需要包含资产的进入价格,也就是在某个时间点观察到因子取值后,下一个可买入的价格。这个价格一定不能用于此次因子的计算。这一点一定要反复检查,以免在研究中引入前视偏差。

  • 可以使用19号close价格计算因子,20号的open价格计算IC值

  • 当因子IC超过0.1时,要注意检查

  • 用到19号的期货数据计算得到的因子值,是20号的因子值

  • 用到19号的期货数据计算得到的因子值,不能用于19号价格的预测,存在未来函数

  • 传递给Alphalens的价格数据需要包含资产的进入价格,也就是在某个时间点观察到因子取值后,下一个可买入的价格。这个价格一定不能用于此次因子的计算。这一点一定要反复检查,以免在研究中引入前视偏差。

  • 可以使用19号close价格计算因子,20号的open价格计算IC值

  • 当因子IC超过0.1时,要注意检查

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_72709.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】-程序编译的环境和预处理详解-让你轻松理解程序是怎么运行的!!

作者:小树苗渴望变成参天大树 作者宣言:认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧! 程序的编译前言一、 程序的翻译环境和执行环境二、 详解翻译环境2.1编译环境2.1.1预编…

民锋国际期货:2023,既艰难又充满希望,既纷乱又有无数机会。

不管是官方还是民间,各种信号都表明,2023年是一个拼经济的年份。 通货膨胀带来的需求量的增加,与中国经济高速发展带来的供给量增加,二者共同构成了我们的物价。 做一个长期主义者,做一个坚定看好中国未来的人&#…

MapBox动态气泡图渲染教程

先来看效果: 视频效果: 屏幕录制2023-02-22 15.34.57 首先我们来介绍一下思路。对于mapbox和openlayers这样的框架来讲,气泡图中的气泡本质上就是一个div,就是将一个dom元素追加到canvas上的固定位置而已。 在mapbox中有marker的概念,官网也有示例: Attach a popup to …

二叉树——路径总和

路径总和 链接 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。 叶子节点…

数据库及缓存之MySQL(一)

思维导图 常见知识点 1.mysql存储引擎: 2.innodb与myisam区别: 3.表设计字段选择: 4.mysql的varchar(M)最多存储数据: 5.事务基本特性: 6.事务并发引发问题: 7.mysql索引: 8.三星索引&#xf…

升职加薪必备,2023年程序员不能不知道的AI辅助编码工具

已经有很多人把chatGPT当做必备的Bug修复工具了,对于用AI写代码,有人感到失落,害怕被取代,而另一些人则认为人工智能将加快编写更好代码的过程。 尽管 AI 编写的代码并非完美无缺,但我相信,最终AI将取代人…

车机开发—【CarService启动流程】

汽车架构:车载HAL是汽车与车辆网络服务之间的接口定义(同时保护传入的数据): 车载HAL与Android Automotive架构: Car App:包括OEM和第三方开发的AppCar API:内有包含CarSensorManager在内的AP…

Hadoop集群模式安装(Cluster mode)

1、Hadoop源码编译 安装包、源码包下载地址 Index of /dist/hadoop/common/hadoop-3.3.0为什么要重新编译Hadoop源码? 匹配不同操作系统本地库环境,Hadoop某些操作比如压缩、IO需要调用系统本地库(*.so|*.dll) 修改源码、重构源码 如何…

H12-831题库(有详细的解析)

1.(单选)某工程师利用2台路由器进行IPv6业务测试,通过运行BGP4模拟总部与分支的互联互通。如图所示,某工程师抓包查看R1发出的update报文。关于该报文信息的描述,以下哪个说法是正确的? A.该报文描述的路由的下一跳地址为:2001:db8::2345:1::1 B.该报文…

自动增长配置不合理导致的性能抖动

背景客户收到了SQL专家云告警邮件,在凌晨2点到3点之间带有资源等待的会话数暴增,请我们协助分析。现象登录SQL专家云,进入活动会话的趋势分析页面,下钻到2点钟一个小时内的数据,看到每分钟的等待数都在100左右&#xf…

关于upstream的八种回调方法

1 creat_request调用背景:用于创建自己模板与第三方服务器的第一次连接步骤1) 在Nginx主循环(ngx_worker_process_cycle方法) 中,会定期地调用事件模块, 以检查是否有网络事件发生。2) 事件模块…

人员行为识别系统 TensorFlow

人员行为识别系统人员行为识别系统通过TensorFlow深度学习技术,人员行为识别算法对画面中区域人员不按要求穿戴、违规抽烟打电话、睡岗离岗以及作业流程不规范实时分析预警,发现违规行为立即抓拍告警。深度学习应用到实际问题中,一个非常棘手…

快速读懂网络拓扑图

快速读懂网络拓扑图几重常见的网络拓扑总线型拓扑简介优点缺点环型拓扑简介优点缺点星型拓扑简介优点缺点网络层级机构节点结点链路通路不同的连接线代表什么意思?不同颜色、粗细的直线代表什么意思?闪电线-串行链路几重常见的网络拓扑 总线型拓扑 简介…

浅谈volatile关键字

文章目录1.保证内存可见性2.可见性验证3.原子性验证4.原子性问题解决5.禁止指令重排序6.JMM谈谈你的理解6.1.基本概念6.2.JMM同步规定6.2.1.可见性6.2.2.原子性6.2.3.有序性6.3.Volatile针对指令重排做了啥7.你在哪些地方用过Volatile?volatile是Java提供的轻量级的…

【华为OD机试模拟题】用 C++ 实现 - 求字符串中所有整数的最小和

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

【Git】Git的分支操作

目录 4、 Git 分支操作 4.1 什么是分支 4.2 分支的好处 4.3 分支的操作 4、 Git 分支操作 4.1 什么是分支 在版本控制过程中, 同时推进多个任务, 为每个任务, 我们就可以创建每个任务的单独分支。 使用分支意味着程序员可以把自己的工作…

postgres 源码解析50 LWLock轻量锁--1

简介 postgres LWLock(轻量级锁)是由SpinLock实现,主要提供对共享存储器的数据结构的互斥访问。LWLock有两种锁模式,一种为排他模式,另一种是共享模式,如果想要读取共享内存中的内容,需要在读取…

面试之设计模式(简单工厂模式)

案例 在面试时,面试官让你通过面对对象语言,用Java实现计算器控制台程序,要求输入两个数和运算符号,得出结果。大家可能想到是如下: public static void main(String[] args) {Scanner scanner new Scanner(System.…

BERT模型系列大全解读

前言 本文讲解的BERT系列模型主要是自编码语言模型-AE LM(AutoEncoder Language Model):通过在输入X中随机掩码(mask)一部分单词,然后预训练的主要任务之一就是根据上下文单词来预测这些单词,从…

F.pad() 函数

F.pad() 对tensor 进行扩充的函数。 torch.nn.functional.pad (input, pad, mode‘constant’, value0) input:需要扩充的 tensor,可以是图像数据,亦或是特征矩阵数据;pad:扩充维度,预先定义某维度上的扩充…