
gs-quant因子风险模型实战指南30分钟把组合风险拆到Barra风格因子贡献【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant组合一天跌了 5%风险委员会问敞口到底在哪你却只能回答不知道——这是做归因时最常见的卡点。本文用 gs-quant 的因子风险模型FactorRiskModel带你走通完整流程拉取真实风险模型的因子收益、协方差矩阵和个股因子暴露最后拼出一张能拿得出手的因子贡献表30 分钟内跑通 读完你能带走三样东西一套从模型 ID 到数据落地的最小调用链、一份各字段单位与坑位的对照清单、以及一个把暴露度 × 协方差变成风险贡献的近似算法。核心源码在 gs_quant/models/risk_model.py官方教程在 gs_quant/documentation/05_factor_models/ 目录下的两个 notebook本文所有 API 均与源码一一对应。先跑通登录并加载一个现成风险模型所有查询都挂在一个模型对象上所以第一步永远是拿到它。平台上有现成的第三方模型如 Barra 系列用get()加模型 ID 即可加载get_dates()告诉你数据从哪天到哪天from datetime import date from gs_quant.models.risk_model import FactorRiskModel, DataAssetsRequest from gs_quant.models.risk_model import RiskModelUniverseIdentifierRequest as Identifier from gs_quant.session import GsSession, Environment GsSession.use(Environment.PROD, client_idyour_id, client_secretyour_secret) model FactorRiskModel.get(BARRA_USMEDS) # 模型ID可用列表见官方教程 days model.get_dates(date(2023, 1, 2), date(2023, 3, 31)) print(len(days), days[0], days[-1])这段只做两件事建立会话、加载模型并核对数据覆盖区间。要看住的是days——后面所有查询的日期都必须落在这段区间内否则返回空。摸清家底确认模型里有哪些因子、什么类别不同供应商的模型因子命名完全不同直接猜名字是后面报错的最大来源。用get_factor_data()把因子清单拉出来看factors model.get_factor_data(date(2023, 1, 2), date(2023, 1, 26)) factors[[name, category]].drop_duplicates() # 全部因子及所属类别返回一张表每行一个因子category常见三类Style风格市值/估值/动量这些、Industry行业、Country国家。后面按名字取数据时用的就是name这一列的值别抄错大小写。拉因子侧数据单因子收益与协方差矩阵归因需要两个因子侧对象每个因子每天的收益回归出来的风格价格和因子间协方差矩阵N×N对角线是各因子当日方差。# 1) 因子收益索引是日期列是因子名 factor_returns model.get_factor_returns_by_name(date(2023, 1, 2), date(2023, 3, 31)) factor_returns[[Momentum, Size, Liquidity]].tail() # 2) 协方差矩阵日方差单位乘100转成百分比 cov model.get_covariance_matrix(date(2023, 3, 1), date(2023, 3, 31)) * 100 cov.iloc[-1] # 最近一个交易日的完整矩阵注意单位这个坑协方差是日方差不乘 100 你会以为因子波动小得离谱。另外get_covariance_matrix默认全量返回也可以传assets参数把矩阵限制到与某批资产相关的因子上。拉资产侧数据个股暴露度与风险拆解因子贡献 资产对因子的敏感度 × 因子波动。敏感度就是因子暴露度每个因子相对估计宇宙的 z-score可以理解为这只股票在这条风格上比平均偏多少assets DataAssetsRequest(Identifier.bbid, [AAPL UW, GS UW]) # 用BBID标识资产 exposure model.get_universe_factor_exposure( date(2023, 3, 1), date(2023, 3, 31), assets, get_factors_by_nameTrue) specific model.get_specific_risk(date(2023, 3, 1), date(2023, 3, 31), assets) # 特质风险 total model.get_total_risk(date(2023, 3, 1), date(2023, 3, 31), assets) # 总风险get_factors_by_nameTrue很关键——不加它暴露度表的列名是一串因子 ID根本没法读。specific是模型解释不了的那部分年化风险误差项total是全年化风险两者相减就是因子风险即这只股票有多少风险来自风格。拼起来算出因子风险贡献近似版单日、单资产把两块数据对齐后做一次矩阵乘法就能得到因子风险贡献的近似值import numpy as np last exposure.loc[exposure.index[-1]] # 最近一天暴露度列因子名 last_cov cov.xs(cov.index[-1].split(: )[1]) # 同日协方差列行因子名 aligned last.reindex(last_cov.columns) # 两边因子必须对齐 factor_risk aligned.values last_cov.values aligned.values # 日方差单位 (np.sqrt(factor_risk) * np.sqrt(252) * 100).round(2) # 年化%这段就是多因子归因的骨架暴露度 × 协方差 × 暴露度转置。真实生产里还会把特质风险单独加回去、做跨日加权但作为哪个因子贡献最大的第一判断这个近似足够用。验证结果与高频报错自查跑完之后怎么确认结果靠谱日期对齐factor_returns.index应该只含工作日、无缺天若发现某天缺失先查model.get_missing_dates()那是数据延迟不是代码问题列数核对exposure.shape[1]应接近因子总数远小于说明部分因子暴露为 0行业因子只对该行业资产非零属正常单位量级日方差 ×100 后风格因子日方差通常在 10⁻⁴~10⁻³ 量级差两个数量级多半是单位没换算常见报错先看这三处报错/现象原因处理MqValueError: Factor with name ... does not exist因子名不属于该模型回到第二步用get_factor_data()查真实名字结果全空日期不在模型日历内或 BBID 写法不对应为AAPL UW这种格式用get_dates()核对区间认证异常GsSession.use()未调用或环境不对检查 client id/secret 与Environment收尾要点与下一步先核对再查询get_dates()和get_factor_data()是两个排雷动作放在所有取数之前单位是最大坑协方差是日方差风险是年化百分比换算关系别记混暴露度按名字取get_factors_by_nameTrue能让结果表直接可读现在就可以做打开 01_Factor_Models.ipynb把它 Step 2 的模型表里的 ID 抄下来替换本文第一段的BARRA_USMEDS跑一遍。进阶方向各附一个入口看盘中因子表现get_intraday_factor_data()支持按因子名和类别过滤用真实组合验证因子Factor.mimicking_portfolio()gs_quant/markets/factor.py拉因子模仿组合的成分与收益自己上传一套模型看 02_Upload_Factor_Models.ipynb 的完整字段与流程【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考