一个开箱即用的高性能 Barra 风控模型……

伴随着癸卯兔年到甲辰龙年的交替,A 股市场在短期内经历了剧烈波动。随着雪球产品大面积敲入,基差快速扩大,小微盘股等板块流动性枯竭,量化基金行业出现了整体性净值大幅回撤。这种市场情况无疑对量化交易的风控能力提出了更严格的要求。

风控模型不但能够提供更准确的股票组合优化结果,还能及时发现预期外的风险敞口,从而实现更稳定的收益,同时还支持事后对投资组合进行更深入的业绩归因和风险归因,帮助及时调整投资策略。

2018年 MSCI 发布的中国 A 股全市场股票模型(The Barra China Equity Model,即 Barra CNE6 模型)就是研究风险敞口、行业配置和收益归因等问题的重要工具之一。Barra 模型采用多层次的因子体系,能够更好地捕捉横截面上机构头寸在各种因子(包括市值等风格因子)上的暴露,从而更精细地预测和解释中国股票市场的风险。与传统的时间序列回归模型有所不同,当 Barra 模型中纳入具有时序记忆的变量时,它还可以共享截面回归和时序回归模型的一些优良性质。

目前,我们在 DolphinDB 中完整实现了 Barra CNE6 中的 CNLT 长期模型的全流程,从而帮助用户更准确地分析市场因子对投资组合的影响,进一步优化投资策略,以实现更高的投资回报。

下图为实践全流程,本文带你速通✌️完整实践指南请点击风险预测、组合优化、收益归因……基于 DolphinDB 的 Barra 多因子模型实践指南 - 知乎

基于 DolphinDB 的因子合成

CNE6 共包含9个一级因子、21个二级因子、46个三级因子。我们基于因子计算模块barraFactorsCal,对初始的三级因子进行了计算和有效性检验,并基于因子合成模块barraFactorsMerge,使用 DolphinDB 接口合成指定的一级和二级因子。具体流程如下:

  1. 风格因子计算:基于 getXXXX 函数计算单个三级风格因子。

  2. 行业因子计算:基于 getIndustryFactors 函数计算行业因子。

  3. 因子预处理:首先通过 MAD 法,以及市值加权标准化,对原始三级风格因子进行数据清洗。再基于 getAllFactors 和 getRegTable 函数,得到用于单因子模型检验的回归因子表。

  4. 单因子模型检验:基于 getFactorsValidation 函数针对回归因子表生成每个因子对应的 IC 、FSC 指标。

  5. 因子合成:针对不同因子加权方法,基于getFSLevelFactor函数合成三级因子,得到用于建立 Barra 多因子模型的一级因子窄表。

基于 DolphinDB 构建收益风险模型

合成一级因子后,我们就可以建立收益与风险模型,并从拟合优度、偏差统计量以及 Q 统计量等角度对模型进行评估。

调用收益风险模型对应接口函数getRetTable,即可获得收益风险模型,并绘制得到对应的模型评估指标(R2、T 统计量、Bias 统计量等)。例如,通过下述代码绘制模型的 𝑆𝑡𝑢𝑑𝑒𝑛𝑡𝑖𝑧𝑒𝑑 R_2 ,可知 12 年至 22 年模型的解释力最低为 5%,最高为 84%,平均为 37%,因此模型的解释力度较高。

// 一级因子收益率回归  
retOut1 = getRetTable(facTable1,adjust = true)                                    
// adjust采用Newey-West协方差调整、当市场收益率存在序列自相关时采用此方法
retOut1 = getRetTable(facTable1,adjust = false,shrink = false)                    
// shrink采用贝叶斯收缩调整特异性风险、推荐使用
retOut1 = getRetTable(facTable1,adjust = true,shrink = true)                     
 // 特异性风险采用bayesian shrinkage
retOut1 = getRetTable(facTable1,adjust = true,shrink = true,eigenfactor = true)   
// 因子风险采用eigenfactor adjust,当市场关联密切时采用此方法
retOut1 = getRetTable(facTable1,adjust = true,shrink = true,eigenfactor = true)   
// 综上,推荐使用
retOut1 = getRetTable(facTable1,adjust = false,shrink = true,eigenfactor = true)  
// 综上,推荐使用
retOut1 = getRetTable(facTable1,adjust = false,shrink = true,eigenfactor = true)  
// 综上,推荐使用
retOut1 = getRetTable(fTable,adjust = false,shrink = true,eigenfactor = false)    
// 综上,推荐使用
undef(`retOut)
retOut = getRetTable(facTable1,adjust = true,shrink = false ,eigenfactor = false)  
// 综上,推荐使用
retOut1.stock_risk[string(2022.12.30)]   // 12.30的特质收益协方差矩阵
retOut1.fac_risk[string(2022.12.30)]     // 12.30的风险因子协方差矩阵
retOut1.R2                               // R2
retOut1.res                              // 特质收益
retOut1.tstat                            // t-stat
retOut1.fac_ret                          // 因子收益
retOut1.bias                             // bias统计量

plot(retOut1.R2.stR2,retOut1.R2.record_date,"𝑆𝑡𝑢𝑑𝑒𝑛𝑡𝑖𝑧𝑒𝑑 R2 月频时序图")

图片

studentized R2 月频时序图

基于 DolphinDB 的 Barra 多因子模型应用

通过 Barra 多因子收益风险模型,我们可以在 DolphinDB 中轻松实现投资组合的风险评估和配置优化。具体应用案例如下:

个股收益预测

预测个股收益能够帮助投资者评估投资组合的整体风险水平,并采取相应的调整措施。对应接口函数为getPredicOut,实现脚本如下:

predictOut = getPredicOut(facTable1)         
// 结果较多,如需查看,推荐持久化后再查看结果,或者可以取出来部分较少的结果,除去预测收益外
pr = select * from predictOut.predict_ret    // 利用本期因子暴露预测最后一期的收益率
predictOut.R2                               // 预测模型R2
predictOut.res                              // 预测模型特质收益
predictOut.tstat                            // 预测模型t-stat
predictOut.fac_ret                          // 预测模型因子收益
predictOut.bias                             // 预测模型bias统计量

组合权重优化

组合权重优化的目的在于将组合的风险特征完全定量化,使得投资经理可以清楚地了解组合的收益来源和风险暴露。权重优化的目标函数,优化目标多种多样,例如可以控制最小预测收益并最小组合风险、控制最小本期收益并最小组合风险、控制最大风险并最大化预测收益、控制最大风险并最大化本期收益等等。

以预测收益控制最小预测收益率为例,对应接口函数getOptimizeWeights,实现脚本如下:

optionCode = exec stock_code from getPredicOut(facTable1).predict_ret
             order by return_day desc limit 20             // 初步筛选stock1
optionCode = exec stock_code from getPredicOut(facTable2).predict_ret 
             order by return_day desc limit 20  

// 控制收益、最小化风险模型
portWeight1 = getOptimizeWeights(facTable = facTable1,retOut = retOut1,
                                 st = st,et = et, method ="minRiskControlRet",
                                 r = 0.05,optionCode = optionCode) 
                                 // 获得权重组合
portWeight2 = getOptimizeWeights(facTable = facTable2,retOut = retOut2,
                                 st = st,et = et, method ="minRiskControlRet",
                                 r = 0.05,optionCode = optionCode)

index_code = '000300'
CodePre = set(exec stock_code from getPredicOut(facTable1).predict_ret
              order by return_day desc limit 200)           // 初步筛选stock2
CodeWeight = set(exec stock_code from getBenchMark(st=st,et=et,code = index_code)
                                where i_weight != 0)
CodeFac =set(exec stock_code from facTable1 )
optionCode = (CodePre&CodeWeight&CodeFac).keys()
portWeight3 = getOptimizeWeights(facTable = facTable1,retOut = retOut1,
                                 st = st,et = et, method ="minRiskControlRet",
                                 r = 0.005,deStyle = true,  optionCode = optionCode)
                                 // 获得权重组合,并实现在风格上的风险敞口为0
portWeight3 = getOptimizeWeights(facTable = facTable1,retOut = retOut1,
                                 st = st,et = et, method ="minRiskControlRet",
                                 r = 0.005,deIndustry = true,optionCode = optionCode)
                                  // 获得权重组合,并实现在行业上的风险敞口为0
portWeight4 = getOptimizeWeights(facTable = facTable2,retOut = retOut2,
                                 st = st,et = et, method ="minRiskControlRet",
                                 r = 0.05,optionCode = optionCode)

事前与事后资产配置评估

事后资产配置指在实际收益数据可用之后,根据实际的历史收益数据进行的资产配置。这个过程发生在投资决策之后,基于实际观察到的历史收益数据对资产进行重新配置。

因此根据市值或者是等权法评估已有指数的 Bias,可以计算出指定组合的偏差统计量和 Q 统计量,以对事后资产配置进行评估。

我们基于getFacSpecialBias函数 ,计算事后资产配置的 Bias 统计量,以评估事后资产配置。

/*
获取因子的Bias时序统计量和获取个股的特质收益统计量
Input:
      retOut      getRetTable()函数返回的结果
      index_name    指数代码
      method      等权方法或者流通市值方法 'equal','float_market'
Output:
      Bias统计量
*/

事前资产配置指在实际收益数据可用之前,根据模型的预测和假设进行的资产配置。这个过程发生在投资决策之前,基于模型的预测结果和投资者的目标、约束条件等进行资产配置。

根据已经由优化目标得到组合权重或是给定的组合权重,可以计算出指定组合的偏差统计量和 Q 统计量,观察指定资产配置组合权重的合理性或是评估优化权重的好坏。

我们可以基于getPortfolioAccuracy接口以评估事前资产配置组合。

/* getPortfolioAccuracy
计算资产组合的时序偏差统计量、Q-统计量
Input:                                      
         facTable          NULL   (Default)   (getFSLevelFactor函数返回的)全因子回归表
         retOut            NULL  (Default)    (getRetTable函数返回的)全因子收益表    
         st                2022.01.03(Default)                
         et                2023.01.02(Default)
         index_code        指定资产组合        '000300'、'399101'
         method            权重配比方法        "float_value"  流通市值加权,"equal" 等权
Output:  
         accuracyTable   
*/

至此,基于 DolphinDB 实现 Barra 多因子模型 CNLT 的全流程跑通。若需获取 Barra 完整模块脚本(因子计算模块 barraFactorsCal、因子合成模块 barraFactorsMerge、多因子模型模块 barraFactorsModel),或者想要拓展 Barra 模型,以满足个性化需求,请联系小助手微信(dolphindb1)。同时,债券领域的多因子风险和归因模型如 Campisi、Brinson 等,我们也正在开发过程中,敬请期待!

最后,在本次的 Barra 因子开发合作项目中,我们还要向盈米基金蜂鸟投研科技团队表达最诚挚的感谢。盈米基金的前瞻性思维和深厚的行业经验,为我们提供了宝贵的指导与支持。同时,其对风险管理的独到见解,为此次项目的成功推进奠定了坚实基础。本次合作成功凝聚了双方团队的共同努力,为量化金融领域的因子开发与探索树立了新的标杆,并为投资者提供更可靠、精准的决策支持。

  • 18
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值