骁勇善战的量化利器:多因子模型【量化理论】
我叫补三补四,很高兴见到大家,欢迎一起学习交流和进步
今天来讲一讲alpha策略制定后的测试问题
风险模型雏形
股票因子受多种因素影响,其价格由多种因素决定,所谓的多因子策略就是要发掘诸如此类的因子,以一种合理的方式组合起来,形成模型,股价波动又意味着风险,因此,多因子模型中的因子,又往往被称为风险因子,这些因子共同解释了股票的风险
假设一个投资组合的收益率为Rp,那么投资组合的风险σP=Std(Rp)。
按照这个定义,我们可以证明,假设投资组合中有N支股票,而且这些股票是完全不相关的,每支股票本身的风险都是σ,那么投资组合的风险:

假设所有股票的相关性都为ρ,那么可以证明,投资组合的风险为:

(这样的模型有一个问题在于没有和大盘涨跌对接,也就无法体现系统性风险)
多因子模型
多因子模型(MFM)认为,一只股票的收益可以由一系列公共因子加上一个股票自身特殊因子来解释,多因子模型有很多优势,首先,在研究几千支股票的相关性和几十个因子相关性相比,显然是研究几十个因子能让问题变得更简单,其次,因子能让风险和经济逻辑分析更加全面,并且具有经济学意义,而不只是对原有数据的重复挖掘
构建多因子模型首先要选取合适的因子,因此,我们先要了解因子的分类:
1. 按功能分类
• 风险因子(Risk Factors):这类因子主要用于解释资产收益的风险来源,通常缺乏预测能力,但能很好地解释收益差异。常见的风险因子包括市值、市盈率、市净率、流动性、残差波动率等。
• 阿尔法因子(Alpha Factors):阿尔法因子是指能够稳定贡献超额收益的因子,其构建相对复杂,数据来源独特,且不同机构的阿尔法因子通常呈现低相关性。
2. 按数据来源分类
• 价量因子(Price and Volume Factors):基于市场价格和交易量数据构建的因子,如动量因子、波动率因子、流动性因子等。
• 基本面因子(Fundamental Factors):基于公司财务数据和经营状况构建的因子,如估值因子(市盈率、市净率等)、成长因子(净利润增速)、盈利因子(ROE等)。
• 事件驱动因子(Event-Driven Factors):基于特定事件对股价的影响构建的因子,如财报发布、盈利预增、突发事件等。
• 另类数据因子(Alternative Data Factors):利用非传统数据源构建的因子,如社交媒体情绪、信用卡交易信息等。
3. 按时间周期分类
• 高频因子(High-Frequency Factors):基于高频数据(如分钟级或秒级数据)构建的因子,通常反映短期市场行为,适合日内交易。
• 中频因子(Medium-Frequency Factors):基于中频数据构建的因子,通常1-5天更新一次,结合了高频数据降频化和基本面特征。
• 低频因子(Low-Frequency Factors):基于长期事件或基本面数据构建的因子,更新频率较低。
4. 按普适性分类
• 时序因子(Time-Series Factors):专注于同一类资产在不同时间的表现。
• 截面因子(Cross-Sectional Factors):作用于多种资产在同一时刻的表现。
在多因子模型当中,最重要的还是alpha因子和风险因子两种
1. 风险因子(Risk Factors)
风险因子主要用于解释资产收益的风险来源,而不是直接预测收益。它们通常与市场整体表现或特定风险相关,能够帮助投资者理解投资组合的风险暴露。常见的风险因子包括:
• 市场因子(Market Factors):如整体市场回报、宏观经济数据(GDP增长率、失业率)、利率水平等。
• 行业因子(Industry Factors):特定行业内的共同因素,如能源行业的油价变动、科技行业的产品周期等。
• 风格因子(Style Factors):如市值(大盘股与小盘股)、估值(市盈率、市净率)、动量等。
2. 阿尔法因子(Alpha Factors)
阿尔法因子是能够稳定贡献超额收益的因子,其核心在于预测未来资产的相对收益。它们通常基于独特的数据来源或复杂的模型构建,不同机构的阿尔法因子往往呈现低相关性。常见的阿尔法因子包括:
• 价量因子(Price and Volume Factors):如动量因子(过去表现良好的股票未来可能继续表现良好)、波动率因子等。
• 基本面因子(Fundamental Factors):如价值因子(市盈率、市净率)、成长因子(净利润增长率)、盈利因子(ROE)等。
• 事件驱动因子(Event-Driven Factors):如财报发布、盈利预增、突发事件等。
• 另类数据因子(Alternative Data Factors):如社交媒体情绪、信用卡交易数据等。
3. 因子在模型中的不同应用
不同因子在投资模型中的应用方式和目标也有所不同:
• 风险因子:主要用于风险控制和投资组合优化。通过控制风险因子的暴露,投资者可以降低组合的系统性风险。
• 阿尔法因子:主要用于构建投资组合以获取超额收益。投资者通过筛选和组合具有高阿尔法因子的资产,期望在市场中获得超越基准的收益。
• 多因子模型:结合风险因子和阿尔法因子,平衡收益与风险。例如,动量因子可以与其他基本面因子结合,优化投资组合的收益和风险。
4. 因子的局限性与动态调整
• 局限性:不同因子在不同市场环境下的表现可能差异较大。例如,动量因子在市场反转时可能失效,而价值因子在市场高估时可能表现不佳。
• 动态调整:因子的有效性可能随时间变化,因此需要定期评估和调整因子权重。例如,基本面因子在某些阶段可能更有效,而价量因子在另一些阶段可能更突出。
总结
不同的因子在投资模型中扮演着不同的角色。风险因子主要用于风险管理和解释收益来源,而阿尔法因子则专注于预测和获取超额收益。通过合理结合和动态调整这些因子,投资者可以构建更稳健且收益更高的投资组合。
一般来讲,所有的因子模型采用的都是一个流程:
- 从各种维度统计论证某个指标的时间序列选股的有效性。
- 利用该指标的历史时间序列构建资产池序列,并跟踪其收益。
- 将收益序列作为一个回归项对现有的资产池所有管辖资产进行回归,得出各个资产因子的显著暴露。
- 根据基金经理的投资风格、投资目标、风险收益比权衡等因素,确定投资组合的目标因子暴露。
- 计算出权重,进行资金分配。
单因子有效应分析alphalens
(一个国外用于单因子分析的alphalens项目)
数据预处理
首先,我们需要先获取股票列表:
import tushare as tsdf_code=ts.get_industry_classified()
然后再生成对应的行业id号:
# 根据行业名称生成行业对应的ID号df_code['sector_name']=df_code['c_name']sector_name=df_code.sector_name.unique()sector_id=range(0,len(sector_name))# 在df_code里添加一列行业对应的IDsec_names=dict(zip(sector_id, sector_name))sec_names_rev=dict(zip(sector_name, sector_id))df_code['sector_id']=df_code['sector_name'].map(sec_names_rev)# 生成code和与行业代码对应的字典code_sec=dict(zip(df_code.code,df_code.sector_id))
获取每只股票的行情数据(如果股票停牌,就设计对应股票日期数据不存在):
# 由于有的股票在某些交易日不交易,导致要提取的数据提取不到# 所以这里使用沪深300的数据作为交易日的标准code='399300'start_date='2013-01-01'end_date='2016-12-31'df=ts.get_k_data(code,start=start_date,end=end_date)df=df.set_index('date')df[code]=df.opendf=df[[code]]# 获取所有股票的数据,并与沪深300数据的日期进行对齐for code in df_code.code:df_t=ts.get_k_data(code,start=start_date,end=end_date)df_t=df_t.set_index('date')df[code]=df_t.open# 将index转换为datetime格式(从TuShare导出的数据date是字符串格式)df.index=pd.to_datetime(df.index)# 删掉沪深300指数的数据del df['399300']
这里用了未来因子,所以会有强相关性,但在实际情况当中是不合适的:
# 为了更有效地演示,这里我们使用未来5天的收益率作为预测因子# 这个因子由于加入了未来函数,所以会有很强的预测效果lookahead_bias_days=5predictive_factor = df.pct_change(lookahead_bias_days)predictive_factor = predictive_factor.shift(-lookahead_bias_days)predictive_factor = predictive_factor.stack()predictive_factor.index = predictive_factor.index.set_names(['date', 'asset'])
最后输出每日资产的价格:
pricing = dfpricing.head()

其中:code_sec和sec_names都是字典:code_sec的键值是资产代码,对应值是行业ID;sec_names键值是行业ID,对应值是行业名称:
然后用将数据整合为alphalens所需要的格式:
# 将数据整合为alphalens所需要的格式
factor_data = alphalens.utils.get_clean_factor_and_forward_returns(predictive_factor, pricing, quantiles=5, bins=None, groupby=code_sec,groupby_labels=sec_names)factor_data.head()
收益率分析
收益率可以说成是投资的目的,因此,对于因子我们可以进行收益率分析判断其与收益率的相关性
简单来看,我们提取不同分位数的因子和未来收益:
mean_return_by_q, std_err_by_q = alphalens.performance.mean_return_by_quantile(factor_data, by_group=False)mean_return_by_q.head()
并将其图表化:
alphalens.plotting.plot_quantile_returns_bar(mean_return_by_q)

假如,随着因子增大,未来收益也增加,我们就认为这是一个不错的因子
除此之外,alphalens还提供了其他方法进行相关收益率的检测:
mean_return_by_q_daily, std_err = alphalens.performance.mean_return_by_quantile(factor_data, 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)
比如用该方法绘制出最高因子和最低因子收益率的差值

实际应用当中只需要调用一个函数就能实现收益率分析:
alphalens.tears.create_returns_tear_sheet(factor_data)
信息系数分析
用于衡量两个变量的线性关系,信息系数在0-1之间,0表示因子完全没有预测作用;1表示因子完全有预测作用
可用如下函数计算信息比率:
ic = alphalens.performance.factor_information_coefficient(factor_data)ic.head()

因为我们本来就是用了未来5天的信息比率作为因子,所以此时的信息比率就等于1
一组信息系数比率既高又稳定,我们就认为这组信息系数是长期有效的
可以画图来判断信息系数的分布:
alphalens.plotting.plot_ic_hist(ic)

总结
总结一下:股价量化模型当中,最流行的就是多因子模型,基本框架从创立之初从未变过,因子的种类很多,像是动量因子、估值因子、盈利因子、行业因子等等——值得注意的是,众多财务因子,往往在该模型中没有起到很好的效果,在IQC比赛的101alpha当中101个alpha因子全部都是技术因子(会计对上市公司进行财报的审计是只在其中选取10%的股票,另外有很多不能被称之为异常却让纸面现金流变得更好看的操作)
相关文章:
骁勇善战的量化利器:多因子模型【量化理论】
我叫补三补四,很高兴见到大家,欢迎一起学习交流和进步 今天来讲一讲alpha策略制定后的测试问题 风险模型雏形 股票因子受多种因素影响,其价格由多种因素决定,所谓的多因子策略就是要发掘诸如此类的因子,以一种合理的方…...
Android Loader机制解析
参考: Android Loader 机制...
使用Docker部署SearXNG
SearXNG 搜索引擎 SearXNG 是一个整合了超过70个搜索服务结果的免费的私有互联网搜索引擎,用户不会被网站跟踪或被建立档案进行特征分析,良好地保障了用户的隐私。知识库可以有效地弥补大模型的知识欠缺问题,但依旧无法补充或弥补知识库和大…...
C# ConcurrentQueue 使用详解
总目录 前言 在C#多线程编程中,数据共享如同走钢丝——稍有不慎就会引发竞态条件(Race Condition)或死锁。传统Queue<T>在并发场景下需要手动加锁,而ConcurrentQueue<T>作为.NET Framework 4.0 引入的线程安全集合&a…...
armv7l
在 **ARMv7l** 中,最后的字符是字母 **“l”**(小写字母 “L”),而不是数字 **“1”**。 --- ### 1. **ARMv7l 的含义** - **ARMv7**:指的是 **ARM 架构的第 7 代版本**,是一种广泛应用于嵌入式系统&…...
spring中关于Bean的复习(IOC和DI)
文章目录 1.spring程序开发步骤1.1 导入spring开发的基本包坐标1.2 编写Dao接口和实现类1.3 创建spring核心配置文件1.4 在spring配置文件中配置UserDaoImpl1.5 使用Spring的Api获得Bean实例 2. Bean实例化的三种方式2.1 无参构造方法实例化2.2 工厂静态方法实例化2.3 工厂实例…...
Docker内存芭蕾:优雅调整容器内存的极限艺术
title: “💾 Docker内存芭蕾:优雅调整容器内存的极限艺术” author: “Cjs” date: “2025-2-23” emoji: “🩰💥📊” 当你的容器变成内存吸血鬼时… 🚀 完美内存编排示范 📜 智能内存管家脚本…...
一周学会Flask3 Python Web开发-flask3上下文全局变量session,g和current_app
锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili flask3提供了session,g和current_app上下文全局变量来方便我们操作访问数据。 以下是一个表格,用于比较Flask中的…...
【蓝桥杯单片机】客观题
一、第十三届省赛(一) 二、第十三届省赛(二)...
QT中经常出现的用法:组合
在 C 中,一个类包含另一个类的对象称为组合( Composition )。这是一种常见的设计模式,用 于表示一个类是由另一个类的对象组成的。这种关系通常表示一种 " 拥有 " ( "has-a" )的关系。…...
下载CentOS 10
1. 进入官网:https://www.centos.org/ 2. 点击右上角的Download进入下载页面。 3. 选择对应的CPU架构,点击ISOs下面的Mirrors开始下载。...
第9章:LangChain让大模型结构化输出
文章详细介绍了LangChain4j中如何使用结构化输出(Structured Outputs)。主要内容包括: JSON Schema:通过指定JSON Schema,LLM可以生成符合结构的输出。工具(Tools):通过工具调用实现…...
ES6 新特性,优势和用法?
ES6 新特性,优势和用法? ES6(ECMAScript 2015)引入了许多新特性,这些特性让 JavaScript 变得更加强大、简洁和易于使用。下面为你详细介绍一些常见的 ES6 新特性、它们的优势以及用法。 1. 块级作用域:le…...
简说spring 的设计模式
spring 的设计模式(23种…) (面试题)说说BeanFactory和FactoryBean的实现原理和区别? spring 中你还知道哪些设计模式?? 1.简单工厂模式 实质: 由一个工厂类根据传入的参数,动态决…...
【 Avalonia UI 语言国际化 I18n】图文结合教学,保姆级教学,语言国际化就是这么简单(.Net C#)
完整项目地址 github : https://github.com/Crazy-GrowUp/AvaloniaI18nTest/tree/master gitee :https://gitee.com/jack_of_disco/avalonia-i18n-test 0.项目新建 Properties 文件夹 对应的项目配置文件里面就会增加 <Folder Include"Properties\" /> 1.项…...
Spring Boot 日志管理(官网文档解读)
摘要 本篇文章详细介绍了SpringBoot 日志管理相关的内容,文章主要参考官网文章的描述内容,并在其基础上进行一定的总结和拓展,以方便学习Spring Boot 的小伙伴能快速掌握Spring Boot 日志管理相关的内容。 日志实现方式 Sping Boot 的日志管…...
Nginx学习笔记:常用命令端口占用报错解决Nginx核心配置文件解读
Nginx 1. 基础命令1.1 重新加载systemd配置1.2 停止Nginx服务1.3 启动Nginx服务1.4 重启Nginx服务1.5 查看Nginx服务状态1.6 测试配置和重载Nginx 2. 额外命令2.1 启用开机自启2.2 禁用开机自启2.3 强制关闭所有Nginx进程 3. Nginx端口占用解决方案3.1 查找占用端口8090的进程3…...
【玩转 Postman 接口测试与开发2_020】(完结篇)DIY 实战:随书示例 API 项目本地部署保姆级搭建教程(含完整调试过程)
《API Testing and Development with Postman》最新第二版封面 文章目录 最新版《Postman 接口测试与开发实战》示例 API 项目本地部署保姆级搭建教程1 前言2 准备工作3 具体部署3.1 将项目 Fork 到自己名下3.2 创建虚拟环境并安装依赖3.3 初始运行与项目调试 4 示例项目的用法…...
高清下载油管视频到本地
下载工具并安装: yt-dlp官网地址: GitHub - yt-dlp/yt-dlp: A feature-rich command-line audio/video downloader ffmpeg官网地址: Download FFmpeg 注:记住为其添加环境变量 操作命令: 该指令表示以720p码率下载VIDEO_UR…...
网络运维学习笔记 021 HCIA-Datacom新增知识点02 SDN与NFV概述
SDN与NFV概述 经典IP网络是一个分布式的、对等控制的网络。 每台网络设备存在独立的数据平面、控制平面和管理平面。 设备的控制平面对等的交互路由协议,然后独立的生成数据平面指导报文转发。 它的优势在于设备与协议解耦,厂家间的兼容性较好且故障场景…...
《论模型驱动架构设计方法及其应用》审题技巧 - 系统架构设计师
软件测试工程师软考论文写作框架 一、考点概述 “模型驱动架构设计及其应用”这一论题,主要考察了考生对模型驱动架构设计(MDA)这一先进软件设计方法的理解与应用能力。论题涵盖了MDA的基本概念、核心要素、实施流程及在实际项目中的应用等…...
【Linux】多线程 -> 线程同步与基于BlockingQueue的生产者消费者模型
线程同步 条件变量 当一个线程互斥地访问某个变量时,它可能发现在其它线程改变状态之前,它什么也做不了。 例如:一个线程访问队列时,发现队列为空,它只能等待,直到其它线程将一个节点添加到队列中。这…...
Docker Mysql 数据迁移
查看启动命令目录映射 查看容器名称 docker ps查看容器的启动命令 docker inspect mysql8.0 |grep CreateCommand -A 20如下图所示:我这边是把/var/lib/mysql 目录映射到我宿主机的/mnt/mysql/data目录下,而且我的数量比较大使用方法1的话时间比较久,所以我采用方法2 如果没…...
四步彻底卸载IDEA!!!
各位看官早安午安晚安呀 如果您觉得这篇文章对您有帮助的话 欢迎您一键三连,小编尽全力做到更好 欢迎您分享给更多人哦 大家好,我们今天来学习四步彻底卸载IDEA!!! 首先我要提醒各位 如果你想删除 IDEA 相关…...
HTTP实验(ENSP模拟器实现)
HTTP概述 HTTP(HyperText Transfer Protocol,超文本传输协议),设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。 HTTP定义了多种请求方法,常用的包括: GET:请求资源。 POST&…...
【网络安全】常见的web攻击
1、SQL注入攻击 定义: 攻击者在HTTP请求中注入恶意的SQL代码,当服务器利用参数构建SQL语句的时候,恶意的SQL代码被一起构建,并在数据库中执行。 示例: 用户登录: 输入用户名xx, 密码 or 1 …...
登录-05.JWT令牌-介绍
一.JWT令牌 JWT令牌是一种简洁的、自包含的格式,用于在通讯双方之间以json数据格式安全的传输数据。说白了,JWT令牌就是将json格式的数据进行封装,从而实现安全传输。 所谓简洁,就是指JWT令牌就是一个简单的字符串。 所谓自包含…...
K8S下redis哨兵集群使用secret隐藏configmap内明文密码方案详解
#作者:朱雷 文章目录 一、背景环境及方案说明1.1、环境说明1.2、方案一:使用配置文件设置密码1.3、方案二:使用args 的命令行传参设置密码 二、redis secret configmap deployment参考2.1 创建secret-redis.yaml参考2.2 修改configmap配置参…...
Spring框架基本使用(Maven详解)
前言: 当我们创建项目的时候,第一步少不了搭建环境的相关准备工作。 那么如果想让我们的项目做起来方便快捷,应该引入更多的管理工具,帮我们管理。 Maven的出现帮我们大大解决了管理的难题!! Maven…...
spring boot知识点4
1.如何监视所有spring boot微服务 安装actuator插件,然后通过接口查询 /actuator/health 2.spring boot项目性能如何优化 a.优化启动时间,去除重复的依赖 b.JVM优化(java虚拟机优化),限制堆的最小最大值 c.数据库…...

