下图为实践全流程,本文带你速通✌️完整实践指南请点击阅读原文,如需获取 Barra 完整模块脚本,请戳小助手(dolphindb1)。

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

风格因子计算:基于
getXXXX
函数计算单个三级风格因子。行业因子计算:基于
getIndustryFactors
函数计算行业因子。因子预处理:首先通过 MAD 法,以及市值加权标准化,对原始三级风格因子进行数据清洗。再基于
getAllFactors
和getRegTable
函数,得到用于单因子模型检验的回归因子表。单因子模型检验:基于
getFactorsValidation
函数针对回归因子表生成每个因子对应的 IC 、FSC 指标。因子合成:针对不同因子加权方法,基于 getFSLevelFactor
函数合成三级因子,得到用于建立 Barra 多因子模型的一级因子窄表。
基于 DolphinDB 构建收益风险模型
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 shrinkageretOut1 = 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 // R2retOut1.res // 特质收益retOut1.tstat // t-statretOut1.fac_ret // 因子收益retOut1.bias // bias统计量plot(retOut1.R2.stR2,retOut1.R2.record_date,"𝑆𝑡𝑢𝑑𝑒𝑛𝑡𝑖𝑧𝑒𝑑 R2 月频时序图")

基于 DolphinDB 的 Barra 多因子模型应用
getPredicOut,实现脚本如下:
predictOut = getPredicOut(facTable1)// 结果较多,如需查看,推荐持久化后再查看结果,或者可以取出来部分较少的结果,除去预测收益外pr = select * from predictOut.predict_ret // 利用本期因子暴露预测最后一期的收益率predictOut.R2 预测模型R2predictOut.res // 预测模型特质收益predictOut.tstat // 预测模型t-statpredictOut.fac_ret // 预测模型因子收益predictOut.bias // 预测模型bias统计量
组合权重优化
getOptimizeWeights,实现脚本如下:
optionCode = exec stock_code from getPredicOut(facTable1).predict_retorder by return_day desc limit 20 // 初步筛选stock1optionCode = exec stock_code from getPredicOut(facTable2).predict_retorder 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_retorder by return_day desc limit 200) // 初步筛选stock2CodeWeight = 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)// 获得权重组合,并实现在风格上的风险敞口为0portWeight3 = getOptimizeWeights(facTable = facTable1,retOut = retOut1,st = st,et = et, method ="minRiskControlRet",r = 0.005,deIndustry = true,optionCode = optionCode)// 获得权重组合,并实现在行业上的风险敞口为0portWeight4 = getOptimizeWeights(facTable = facTable2,retOut = retOut2,st = st,et = et, method ="minRiskControlRet",r = 0.05,optionCode = optionCode)
事前与事后资产配置评估
getFacSpecialBias函数 ,计算事后资产配置的 Bias 统计量,以评估事后资产配置。
/*获取因子的Bias时序统计量和获取个股的特质收益统计量Input:retOut getRetTable()函数返回的结果index_name 指数代码method 等权方法或者流通市值方法 'equal','float_market'Output:Bias统计量*/
事前资产配置指在实际收益数据可用之前,根据模型的预测和假设进行的资产配置。这个过程发生在投资决策之前,基于模型的预测结果和投资者的目标、约束条件等进行资产配置。
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 因子开发合作项目中,我们还要向盈米基金蜂鸟投研科技团队表达最诚挚的感谢。盈米基金的前瞻性思维和深厚的行业经验,为我们提供了宝贵的指导与支持。同时,其对风险管理的独到见解,为此次项目的成功推进奠定了坚实基础。本次合作成功凝聚了双方团队的共同努力,为量化金融领域的因子开发与探索树立了新的标杆,并为投资者提供更可靠、精准的决策支持。




