很多量化研究者都有这样的经历:策略信号已经算出来了,真正耗时的工作却刚刚开始——如何分配资金?怎样限制集中度?换一种协方差估计,结果还稳不稳?参数是在验证集上选出来的,还是看着整段回测“调”出来的?
skfolio 值得关注的核心,是把资产配置组织成一套可以组合、调参和验证的研究流程。如果你已经熟悉Python 和 scikit-learn,这套设计会很自然:组合优化器也是估计器,可以fit、predict,也可以进入 Pipeline。其官方定位涵盖组合优化、因子模型构建和风险管理,采用 BSD-3-Clause 开源许可证。(项目源代码: https://github.com/skfolio/skfolio)
1. skfolio 想解决什么问题?
把预期收益、协方差矩阵交给优化器,得到一组权重,是组合研究的一步。真实研究还需要不断回答:数据怎么处理、模型怎么选、参数怎么确定,以及结果在未参与选择的数据上是否成立。作者团队在论文中将 skfolio 放在 Python 组合优化与机器学习生态的交汇处。它的设计重点,是为不同组合方法提供一致的研究接口。
作者Hugo Delatte 在公开 LinkedIn 资料中的创业帖子解释,skfolio 最初服务于较复杂的 QIS 指数,希望兼顾研发效率与受监管环境中的生产需求。随后成立的 Skfolio Labs 提供企业支持、服务等级协议与专业指导。这是作者对项目起源和商业支持方向的说明;不能据此推断任何特定机构已经采用,也不能视作监管认证。对中国开发者来说,这对应一个很具体的需求:把各自散落在笔记本中的资产筛选、风险估计、优化和评估,逐步整理成可以复用的研究组件。
图 1:根据官方模块设计整理的流程示意。图中的“验证”需要正确设置时间切分,并不意味着接入框架后自动消除数据泄漏。
2. 最值得关注的五个优势
优势一:让资产筛选与优化进入同一条 Pipeline
skfolio 提供资产预筛选组件,例如去除高度相关资产、选择数据完整的资产等,并能与优化器组成 scikit-learn Pipeline。研究者由此可以把筛选规则也纳入每个训练窗口,减少在整个历史样本上提前筛选造成的信息穿越。
Hugo 在介绍缺失数据功能的帖子中,专门提到资产成立、到期、违约和退市等事件带来的挑战。他强调,把处理步骤放入 Pipeline,便于与交叉验证和参数搜索衔接。
这对成立时间不同的 ETF、不断变化的股票池尤其有启发。不过,历史资产池与退市数据仍需研究者提供;组件不会凭空补齐缺失的历史,也不能独自修复幸存者偏差。
优势二:参数选择可以成为规范实验
协方差估计方法、正则化强度、风险指标,都可能改变最终权重。skfolio 支持通过 'GridSearchCV'、'RandomizedSearchCV' 搜索参数,也支持对嵌套组件进行调参。评分指标可以按照研究目标设置。
这让研究问题从“哪个参数画出的曲线最好看”,转向“在预先约定的验证方案中,哪个参数更稳定”。研究团队也更容易保留统一的实验口径。
参数搜索本身仍会过拟合。最终测试区间应在搜索前留出;一旦根据测试结果反复修改模型,它就不再是独立测试。
优势三:把样本外验证放到显眼位置
skfolio 提供 WalkForward,以及带有清洗和隔离机制的组合交叉验证工具。前者适合按时间向前推进的检验,后者能够组织多条测试路径,用于观察结果对样本切分的敏感性。
一个值得强调的细节是:不打乱数据,不等于已经满足时间因果顺序。普通 KFold 即使设置 'shuffle=False',也可能用测试区间之后的数据训练。若要模拟当时的决策,应优先采用只使用过去信息的滚动验证;存在重叠标签时,还需结合标签跨度设置清洗与隔离。
图 2:概念示意,不代表任何真实回测结果。调参仅使用开发区间,最后的独立测试区间在模型确定后才使用。
优势四:风险建模能够围绕业务目标组合
skfolio 的优化模块覆盖均值—风险、风险预算、最大分散化、层次聚类等方法,并提供交易成本、权重、分组、换手等相关建模选项。其意义在于,研究者可以把业务约束与风险目标一起写进模型,而不只追求一组无约束最优权重。各参数的适用范围仍需按具体优化器核对。
例如,同一组资产可以分别研究最小方差与 CVaR 目标:前者关注波动,后者关注尾部损失。结果差异可以帮助投资团队讨论风险偏好,而不是简单宣布某一种方法“更先进”。
在输入端,skfolio 提供多种协方差估计方法,包括收缩、去噪等;这些方法为研究估计误差提供了可替换组件,效果仍依赖样本与市场环境。
进一步地,Black–Litterman、Entropy Pooling、时间序列因子模型和合成情景等模块,为研究主观观点、风险因子和压力情景提供了接口。压力情景是模型假设,不能被当作未来事件的预测。
优势五:结果不止是一张权重表
skfolio 用 Portfolio、MultiPeriodPortfolio 等对象承载组合结果,使组合收益、风险与跨期评估更容易衔接。当前文档还区分目标权重保持不变与持仓权重随收益漂移的评估约定。使用者需要明确选择与实际策略相符的口径。
对于团队协作,这意味着研究报告可以更清楚地记录“模型是什么、假设是什么、结果如何计算”。这是一项工程价值,并不直接意味着投资回报更高。
3. v1.0 新功能:基于资产特征的横截面因子模型
v1.0.0 引入了 'CharacteristicsFactorModel',将 skfolio 的研究流程从组合配置延伸到自定义因子模型的构建。该版本还新增了 AssetPanel 数据容器、因子暴露转换器、Alpha 估计器、凸优化中的因子暴露约束,以及事后和事前归因功能。
这一模型根据各时点实际可获得的资产特征,例如行业、市值和基本面数据,构建因子暴露。在每个时点,通过资产收益对因子暴露的横截面回归,估计因子收益。这与时间序列因子模型有所不同:后者以已知的因子收益序列为输入,利用一段历史数据估计各资产的因子暴露。
其研究流程串联了资产特征、描述指标、经过转换的因子暴露、横截面回归,以及因子风险和特质风险的估计。输出的 'ReturnDistribution' 为组合优化器提供输入;拟合后的 'FactorModel' 则提供分解结果和诊断信息。各组件可以遵循 scikit-learn 的接口约定进行定制和调参。(因子模型指南: https://skfolio.org/user_guide/factor_models.html)
对于专注中国股票市场的研究团队,这为研究自定义风险模型并将其接入组合构建,提供了一条具体路径。例如,可以先定义行业和风格因子暴露,再评估相应的组合风险,并开展归因分析。这是一种应用设想,并非已经验证的本地部署案例或业绩结论。
使用这一模型仍然需要各时点真实可得的资产特征数据,以及适当的估计样本范围。官方文档提供了基于合成数据的教程,方便读者探索 API;其中的实证示例采用美国股票数据,不能视为对中国市场有效性的验证。(因子模型数据与示例: https://skfolio.org/user_guide/factor_models.html)
4. Skfolio Labs 官网选登的专家评价
Skfolio Labs (官网: https://skfoliolabs.com/)官网展示了研究者与从业者的使用评价。他们的反馈重点涉及该工具在实际研究中的设计特点。
Peter Cotton 博士
官网列示身份:Crunch Labs 联合创始人;曾任 ExodusPoint 和 Intech 首席数据科学家。
Cotton 肯定了项目的代码质量与管理,并指出,遵循 scikit-learn 的接口约定,有助于通过统计堆叠方法组合不同的投资组合模型。他还特别提到了 skfolio 对 Schur 投资组合的实现。
Romain Lafarguette 博士
官网列示身份:GIC 量化负责人;曾任 ADIA 量化研究员。
Lafarguette 强调了易于使用的接口、丰富的优化设计、约束与因子中性化设置的灵活性,以及求解器选择和回测能力。
Daniel P. Palomar 博士
官网列示身份:香港科技大学优化领域教授;《Portfolio Optimization: Theory and Application》作者。
Palomar 肯定了统一的研究框架、多样的组合方法、滚动与随机化回测,以及可视化工具。
以上内容为 Skfolio Labs 官网选登评价的中文转述,并非逐字引语。人物职位按该网站列示,不应将这些个人评价理解为其任职机构的背书。
5. 中国量化与 fintech 团队可以怎样用?
以下是根据工具能力提出的应用方向,不代表已经核实的中国客户案例。
ETF 与多资产配置研究。 对一组股票、债券、商品等资产代理,比较等权、最小方差、风险预算和层次风险平价;统一检查波动、回撤、集中度和换手。skfolio 在这里可以承担组合建模与评估环节。
多因子策略的组合构建。上文介绍的 v1.0 横截面特征因子模型,为团队使用自有数据探索自定义股票风险模型、考虑因子暴露的组合配置及归因分析,提供了具体起点。
FOF、基金筛选与财富管理原型。面对不同成立时间和相关性的基金,可以研究动态资产池与配置方法。但净值频率、申赎安排、费用和实际可投资性需要另外建模,不能直接把日频股票示例当成基金组合实盘。
风险管理与投研沟通。使用不同风险目标或压力情景,回答“如果相关性结构变化,组合暴露会怎样”等问题;把假设与结果一起展示,比只呈现一条净值曲线更便于讨论。
高校教学与量化团队培训。在统一接口下比较方法,能够让学习者把注意力放在模型假设和验证设计上。这是本文对其教学用途的判断。
图 3:建议的职责划分。skfolio 位于研究与组合建模层,市场数据、可交易性判定和真实订单执行需要配套系统。
在中国市场落地,优先补齐三件事:
1. 时间上真实可得的数据。 明确复权、财务信息可用时间、历史资产池、退市记录与交易日历,避免使用当时尚未知晓的信息。
2. 策略对应的交易约束。按具体品种和历史规则处理停牌、涨跌停、买卖限制、最小交易单位、申赎及费用;这些条件不能只用一个通用成本参数替代。
3. 研究权重到实际持仓的衔接。增加成交与滑点假设、订单取整、执行延迟和持仓核对,再评估净收益。
这些是本文提出的实施要求,不是声称 skfolio 已原生覆盖所有中国交易规则。官方公开资料也不足以支持“中国几乎无人使用”或“仅在少数国家推广”的市场渗透率判断。
6. 一个适合上手的最小示例
先用官方示例数据理解接口,再替换为经过清洗和授权的本地数据。当前 GitHub README 标明需要 Python 3.10 或更高版本,可通过 'pip install -U skfolio'安装。(安装入口: https://github.com/skfolio/skfolio)
from sklearn.model_selection import train_test_split
from skfolio.datasets import load_sp500_dataset
from skfolio.optimization import MeanRisk
from skfolio.preprocessing import prices_to_returns
# 官方示例数据用于熟悉接口,不代表中国市场。
returns = prices_to_returns(load_sp500_dataset())
train, test = train_test_split(
returns, test_size=0.3, shuffle=False
)
# 默认最小方差模型:先拟合历史,再评价留出的数据。
model = MeanRisk()
model.fit(train)
portfolio = model.predict(test)
print(model.weights_)
print(portfolio.summary())
此例根据官方快速入门整理,未在本文制作环境中安装运行;没有虚构回测数字。'predict(test)' 是用拟合后的组合评价测试收益,并非提前预测未来市场涨跌。这个入门例子也没有模拟真实成交与完整的再平衡成本。
下一步可以设计一个中国 ETF 研究实验:预先确定历史资产池与样本区间,在开发区间用滚动窗口比较等权、最小方差和 HRP;确定方案后,仅用保留的独立测试区间做最终评价。统一成本、再平衡频率与风险指标,公开完整设定。这样的实验,比单独展示一张最高收益曲线更能帮助社区判断工具是否适合自己。
7. 从一次试用开始,参与中文生态
如果你正在寻找一套能够连接 sklearn、组合优化和样本外验证的 Python 工具,skfolio 值得放进下一次研究实验。
你可以从三个小动作开始:
- 访问源码与示例:skfolio GitHub仓库( https://github.com/skfolio/skfolio)
- 跑通一个模型:(官方示例库: https://skfolio.org/auto_examples/index.html)再用自己的数据检验。
- 反馈真实体验:分享中文教程、可复现的问题或改进建议;如果项目对你有帮助,欢迎在 GitHub 点亮 ⭐,支持项目被更多开发者发现。
资料说明:本文使用作者公开可访问的个人资料及具体帖子,未声称覆盖全部动态。