骁勇善战的量化利器:多因子模型【量化理论】

打印 上一主题 下一主题

主题 872|帖子 872|积分 2616

我叫补三补四,很高兴见到大家,接待一起学习互换和进步

  

  
本日来讲一讲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项目)

数据预处置处罚

起首,我们需要先获取股票列表:
  1. import tushare as ts
  2. df_code=ts.get_industry_classified()
复制代码
然后再生成对应的行业id号:
  1. # 根据行业名称生成行业对应的ID号
  2. df_code['sector_name']=df_code['c_name']
  3. sector_name=df_code.sector_name.unique()
  4. sector_id=range(0,len(sector_name))
  5. # 在df_code里添加一列行业对应的ID
  6. sec_names=dict(zip(sector_id, sector_name))
  7. sec_names_rev=dict(zip(sector_name, sector_id))
  8. df_code['sector_id']=df_code['sector_name'].map(sec_names_rev)
  9. # 生成code和与行业代码对应的字典
  10. code_sec=dict(zip(df_code.code,df_code.sector_id))
复制代码
获取每只股票的行情数据(假如股票停牌,就计划对应股票日期数据不存在):
  1. # 由于有的股票在某些交易日不交易,导致要提取的数据提取不到
  2. # 所以这里使用沪深300的数据作为交易日的标准
  3. code='399300'
  4. start_date='2013-01-01'
  5. end_date='2016-12-31'
  6. df=ts.get_k_data(code,start=start_date,end=end_date)
  7. df=df.set_index('date')
  8. df[code]=df.open
  9. df=df[[code]]
  10. # 获取所有股票的数据,并与沪深300数据的日期进行对齐
  11. for code in df_code.code:
  12.     df_t=ts.get_k_data(code,start=start_date,end=end_date)
  13.     df_t=df_t.set_index('date')
  14.     df[code]=df_t.open
  15. # 将index转换为datetime格式(从TuShare导出的数据date是字符串格式)
  16. df.index=pd.to_datetime(df.index)
  17. # 删掉沪深300指数的数据
  18. del df['399300']
复制代码
这里用了将来因子,所以会有强相关性,但在实际环境当中是不符合的:
  1. # 为了更有效地演示,这里我们使用未来5天的收益率作为预测因子
  2. # 这个因子由于加入了未来函数,所以会有很强的预测效果
  3. lookahead_bias_days=5
  4. predictive_factor = df.pct_change(lookahead_bias_days)
  5. predictive_factor = predictive_factor.shift(-lookahead_bias_days)
  6. predictive_factor = predictive_factor.stack()
  7. predictive_factor.index = predictive_factor.index.set_names(['date', 'asset'])
复制代码
最后输出每日资产的价格:
  1. pricing = df
  2. pricing.head()
复制代码

此中:code_sec和sec_names都是字典:code_sec的键值是资产代码,对应值是行业ID;sec_names键值是行业ID,对应值是行业名称:
然后用将数据整合为alphalens所需要的格式:
# 将数据整合为alphalens所需要的格式
  1. factor_data = alphalens.utils.get_clean_factor_and_forward_returns(predictive_factor,                                                          pricing,                                                        quantiles=5,                                                      bins=None,                                                  groupby=code_sec,
  2. groupby_labels=sec_names)
  3. factor_data.head()
复制代码
收益率分析

收益率可以说成是投资的目的,因此,对于因子我们可以进行收益率分析判断其与收益率的相关性
简单来看,我们提取不同分位数的因子和将来收益:
  1. mean_return_by_q, std_err_by_q = alphalens.performance.mean_return_by_quantile
  2.     (factor_data, by_group=False)
  3. mean_return_by_q.head()
复制代码
并将其图表化:
  1. alphalens.plotting.plot_quantile_returns_bar(mean_return_by_q)
复制代码

假如,随着因子增大,将来收益也增长,我们就以为这是一个不错的因子
除此之外,alphalens还提供了其他方法进行相关收益率的检测:
  1. mean_return_by_q_daily, std_err = alphalens.performance.mean_return_by_quantile
  2.     (factor_data, by_date=True)
  3. quant_return_spread, std_err_spread = alphalens.performance.compute_mean_returns_
  4.     spread(mean_return_by_q_daily,
  5. upper_quant=5,
  6. lower_quant=1,
  7. std_err=std_err)
  8. alphalens.plotting.plot_mean_quantile_returns_spread_time_series(quant_return_
  9.     spread, std_err_spread)
复制代码
好比用该方法绘制出最高因子和最低因子收益率的差值

实际应用当中只需要调用一个函数就能实现收益率分析:
  1. alphalens.tears.create_returns_tear_sheet(factor_data)
复制代码

信息系数分析

用于权衡两个变量的线性关系,信息系数在0-1之间,0表现因子完全没有猜测作用;1表现因子完全有猜测作用
可用如下函数盘算信息比率:
  1. ic = alphalens.performance.factor_information_coefficient(factor_data)
  2. ic.head()
复制代码

因为我们原来就是用了将来5天的信息比率作为因子,所以此时的信息比率就等于1
一组信息系数比率既高又稳固,我们就以为这组信息系数是恒久有效的
可以画图来判断信息系数的分布:
  1. alphalens.plotting.plot_ic_hist(ic)
复制代码

总结

总结一下:股价量化模型当中,最流行的就是多因子模型,基本框架从创立之初从未变过,因子的种类很多,像是动量因子、估值因子、盈利因子、行业因子等等——值得留意的是,众多财政因子,通常在该模型中没有起到很好的结果,在IQC比赛的101alpha当中101个alpha因子全部都是技能因子(管帐对上市公司进行财报的审计是只在此中选取10%的股票,另外有很多不能被称之为非常却让纸面现金流变得更好看的操纵)

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

水军大提督

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表