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

news2024/11/27 18:35:28

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.coloradmin.cn/o/364486.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nginx优化与防盗链

Nginx优化与防盗链 📒博客主页: 微笑的段嘉许博客主页 💻微信公众号:微笑的段嘉许 🎉欢迎关注🔎点赞👍收藏⭐留言📝 📌本文由微笑的段嘉许原创! &#x1f4c…

图文并茂详解NAT协议(含实例分析)

什么是 NAT 协议 我们的计算机要想访问互联网上的信息,就需要一个地址,而且这个地址是大家(其他主机)所认可的,是公共的,这个地址也叫做公有 IP 地址。 与之相对的,除了公有 IP 地址外&#x…

Python自动化测试框架【Allure-pytest功能特性介绍】

Python自动化测试框架【Allure-pytest功能特性介绍】 目录:导读 前言 生成报告 测试代码 目录结构 Allure特性 Environment Categories Fixtures and Finalizers allure.attach 总结 写在最后 前言 Allure框架是一个灵活的轻量级多语言测试报告工具&am…

【PMP考试最新解读】第七版《PMBOK》应该如何备考?(含最新资料)

PMP新版大纲加入了ACP敏捷管理的内容,而且还不少,敏捷混合题型占到了 50%,前不久官方也发了通知8月启用第七版《PMBOK》,大家都觉得考试难度提升了,我从新考纲考完下来,最开始也被折磨过一段时间&#xff0…

玩游戏用哪个牌子的蓝牙耳机最好?打游戏无延迟的蓝牙耳机

作为一名苦逼的打工人,从早忙到黑,每天最期待的事莫过于下班回到家或是周末闲暇时光,来两把王者或吃鸡,配合无线游戏耳机,效果直接拉满,下面分享几款打游戏无延迟的蓝牙耳机。 一、南卡小音舱蓝牙耳机 蓝…

孪生工厂:机械臂加工产线 HMI 监控界面

2018 年,世界经济论坛(WEF)携手麦肯锡公司共同倡议并正式启动了全球“灯塔工厂网络项目”(Lighthouse Network),共同遴选率先应用工业革命 4.0 技术实现企业盈利和持续发展的创新者与示范者。这就使得工厂系统需要对各流水线及生产运行成本方面进行多角度…

设计模式(十五)-面向对象概念

软件设计(十五)-UML建模(下)https://blog.csdn.net/ke1ying/article/details/129152487 一、设计原则 1、单一职责:设计目的单一的类。 2、开放-封闭原则:对扩展开放,对修改关闭。 3、里氏替…

微服务架构中的缓存设计浅析

在微服务架构中,缓存中间件越来越成为不可或缺的组件,下面聊聊微服务环境下的缓存设计。 1、简介 缓存在应用软件架构中是提高性能最直接的方式,如下 假设应用程序将数据存储在Mysql中,众所周知Mysql会将数据存储在硬盘上以防止…

git 拉取远程分支到本地

目录:***!本小作者,是将终端和Git的可视化插件结合使用,刚接触的可以自习看一下,内容简单,避免弯路!***一,简单了解远程分支1,连接远程:2,提交&am…

SpringBoot使用validator进行参数校验

Validated、Valid和BindingResultBean Validation是Java定义的一套基于注解的数据校验规范,比如Null、NotNull、Pattern等,它们位于 javax.validation.constraints这个包下。hibernate validator是对这个规范的实现,并增加了一些其他校验注解…

业务流程建模标注(BPMN)详细介绍

1、基本信息摘要:该文章的目的是对BPMN(Business Process Modeling Notation)的概要描述和介绍。描述基本的BPMN符号,包括这些图元如何组合成一个业务流程图(Business Process Diagram)2、BPMN简介2.1概述该文章的目的是对BPMN(Bu…

pytest之fixture用法

特点及优势1、命令灵活:对于setup.teardown,可以不起这两个名字2、数据共享:在conftest.py配置里写的方法可以实现数据共享,不需要import导入,可以跨文件共享3、scope的层次及神奇的yield组合相当于各种setup和teardow…

MySQL —— 表的操作

文章目录1. 创建表2. 查看表结构3. 修改表3.1 向表中插入数据3.2删除表中的数据3.3 修改表的性质3.3.1 添加字段3.3.2 修改字段的长度3.3.3 删除字段3.3.4 修改字段名3.3.5 修改表名4. 删除表5. 备份表前言: 本文会详细的讲解,在MySQL中表的操作。1. 创建…

Linux基础命令-uname显示系统内核信息

前言 这个命令主要是显示系统内核的相关信息,一般需要查看内核信息才会使用到这个命令,一起来看看吧。 一 命令的介绍 uname命令来自于英文词组“Unix name”的缩写,其功能是用于查看系统主机名、内核及硬件架构等信息。如果不加任务参数&am…

UVM实战(张强)-- UVM中的寄存器模型

目录一.整体的设计结构图二.各个组件代码详解2.1 DUT2.2 bus_driver2.3 bus_sequencer2.4 bus_monitor2.5 bus_agent2.6 bus_transaction2.7 bus_if2.8 my_if2.9 my_transaction2.10 my_sequencer2.11 my_driver2.12 my_monitor2.13 my_agent2.14 my_scoreboard2.15 my_env2.16…

龙芯GS232(MIPS 32)架构cache管理笔记

1 mips32架构 MIPS架构是一种基于精简指令集(Reduced Instruction Set Computer,RISC)的计算机处理器架构。MIPS架构由MIPS Technologies公司在1981年开发,并在1984年发布了第一款MIPS处理器。 MIPS架构的特点包括: …

Alkyne choline,685082-61-5,炔基胆碱,炔基可通过铜催化的点击化学进行修饰和共轭

1、基础产品数据(Basic Product Data):CAS号:685082-61-5中文名:炔胆碱,炔基胆碱英文名:Alkyne-choline ,Alkyne choline2、详细产品数据(Detailed Product Data&#xf…

深入讲解CFS组调度!(下)

接上文深入讲解CFS组调度!(上) 六、task group时间片 6.1. 时间片分配 若使能CFS组调度会从上到下逐层通过权重比例来分配上层分得的时间片,分配函数是sched_slice()。但是从上到下不便于遍历,因此改为从下到上进行…

盘点全网好评最多的7款团队协同软件,你用过哪款?

能亲自带团队管理项目当然是一件开心和兴奋的事,但是突然成为团队负责人后开始不大适应。如何转换角色,还有自己和团队成员之间在心理、行为等方面的互动也变得很敏感。新手领导上任的过程,是团队秩序再造的过程;是晋升者个人职业…

Python----------字符串

1.转义字符 注:转义字符放在你所想效果字符前 2.原始字符串 print(r"D:\three\two\one\now") ->D:\three\two\one\now注: 在使用原始字符串时,转义字符不再有效,只能当作原始的字符,每个字符都没有特殊…