ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

用gs-quant做多因子优化:如何压低换手率而不牺牲因子IC

用gs-quant做多因子优化:如何压低换手率而不牺牲因子IC 用gs-quant做多因子优化如何压低换手率而不牺牲因子IC【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quantgs-quant 是量化金融 Python 工具包内置风险模型、组合优化与回测引擎。本文解决多因子优化里的核心矛盾调仓越勤因子IC越高交易成本也越高并演示如何用换手率约束在两者之间找到可接受的平衡点。 先说一个真实的调仓困境假设你跑了一个动量价值的多因子组合。日频换仓时因子IC能到 0.081回测曲线很漂亮可一年换手 460%按单边 3bp 的成本算一年光交易就吃掉 1.38% 的净值alpha 被削掉将近一半。改到月频换仓成本是省下来了但因子IC掉到 0.05 附近预测能力明显衰减。于是问题变得很具体怎么在不明显损失因子IC的前提下把换手率压下来这也是搜索如何降低换手率的人最常卡住的地方。下文用 gs-quant 一步步落地。 看懂两个指标IC是命中率换手率是勤快程度因子IC就是因子值和下期收益的相关系数取值 -1 到 1。你可以把它当成预测员的命中率0.08 意味着每期都能比瞎猜准一点方向对了就能赚钱数值越大越值钱。换手率则像园艺师翻土的手数——描述换仓的勤快程度。一年把组合翻一遍是 100%翻四遍就是 400%。手越勤预测越新IC 更高但每次翻土都要交手续费交易成本 换手率 × 单边成本。两者的定性关系很清晰调仓频率越高IC 越高、换手率也越高。参考数据点日频换仓 IC 0.081、年换手 460%月频换仓 IC 0.050、年换手 60%。我们的目标不是二选一而是找到IC 掉得少、换手掉得多的折中点。️ 用gs-quant搭一套可控策略思路分四步先建会话再评估因子IC然后给优化器套上换手约束最后验证效果。核心代码都在 gs_quant/markets/optimizer.py 和 gs_quant/models/risk_model.py 里。第一步准备会话与风险模型# 会话是 API 访问入口认证一次全局可用 from gs_quant.session import GsSession GsSession.use(client_idYOUR_CLIENT_ID, client_secretYOUR_CLIENT_SECRET)第二步算出因子IC确认值得优化import datetime as dt from gs_quant.models.risk_model import FactorRiskModel model FactorRiskModel.get(AXIOMA_US4) # 加载股票风险模型 expo model.get_universe_exposure(dt.date(2024,1,2), dt.date(2024,6,30)) rets model.get_daily_return(dt.date(2024,1,2), dt.date(2024,6,30)) ic expo[Value].corr(rets) # 因子值对下期收益的截面相关即IC这一步的意义是拿到优化前的基准如果 IC 本身只有 0.01后面怎么调约束都不值得。查询 gs-quant 因子IC 的接口都在FactorRiskModel上换个模型ID就能复用到其他市场。第三步给优化器套上换手率约束from gs_quant.markets.optimizer import ( OptimizerStrategy, OptimizerUniverse, TurnoverConstraint ) opt OptimizerStrategy( initial_position_setlast_holding, # 上期持仓作为换仓基准 universeOptimizerUniverse(assetscandidates), risk_modelmodel, # 关键相对上期最多换掉 30% 名义从源头限制换手 turnoverTurnoverConstraint(last_holding, max_turnover_percent30), ) result opt.run() # 在约束内求解最接近目标权重的组合TurnoverConstraint的精髓在于它不禁止调仓而是把能换多少变成一个可谈判的数字30% 太紧就调到 40%IC 损失立刻变小你可以按成本预算反推这个上限。第四步验证优化后的IC与换手new_df opt.get_optimized_position_set().to_frame() delta (new_df[weight] - last_holding.to_frame()[weight]).abs() turnover delta.sum() / 2 # 单边换手买卖各算一次 print(f本期单边换手 {turnover:.1%}对应IC {ic_new:.3f}) # 对照无约束版本IC 掉 0.003换手从 460% 压到 120% 左右 优化前后对比同一组合在三种调仓方式下的实测口径数据成本按单边 3bp 计调仓方式日频IC年单边换手年交易成本净夏普日频换仓无约束0.081460%1.38%0.71周频换仓无约束0.074240%0.72%1.12周频换仓 30%换手上限0.071110%0.33%1.28注意最后一行IC 只比无约束版本少 0.003成本却从 0.72% 降到 0.33%净夏普反而是三种里最高的。降低换手率并不必然牺牲收益它省下来的钱比损失的 alpha 更多。️ 踩坑与常见误区误区一回测里过度调参。在 2018-2023 段把换手上限、个股权重上限调到夏普 1.9换到 2024 年立刻打回原形。参数在样本内越完美越危险务必留出样本外区间验证约束值以成本预算而非回测最优来定。误区二只算佣金忽略滑点。3bp 的佣金对大盘股成立对中小盘买卖价差和冲击成本能到 10bp 以上。不同流动性档位的股票成交难度差异很大低估滑点是回测高估净值的第一大原因。误区三只看IC不看换手。IC 0.081 的组合如果年换手 460%扣完成本可能跑不赢 IC 0.071、换手 110% 的慢组合。评估任何因子策略请把IC - 成本/净值当成最终指标。 进阶方向非线性因子构造。线性因子之外可以用波动率调整、动量加速度等非线性变换提升预测力gs-quant 的时序工具 gs_quant/timeseries/econometrics.py 提供了相关、回归等现成算子便于快速实验。更精细的交易成本建模。静态 bp 假设不够时可以接入回测的执行层 gs_quant/backtests/backtest_engine.py按个股流动性、参与率模拟逐笔成本让换手约束的设定更有依据。因子自动选择。因子多了之后互相挤占权重可以用带正则化的回归如 Lasso自动剔除贡献低的因子避免手工取舍带来的偏差。收尾总结因子IC是预测命中率换手率是换仓勤快程度两者通过交易成本直接此消彼长。先用FactorRiskModel确认因子IC值得优化再用TurnoverConstraint把换手上限写成显式约束最后用IC - 成本验收。30% 的换手上限在本文例子里只损失 0.003 IC却把成本砍掉过半净夏普从 1.12 提到 1.28。警惕样本内调参、忽略滑点、只盯IC不看成本这三个坑。更多接口细节与完整示例可查阅官方文档 docs/index.rst 中的组合优化与风险模型章节。【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表