[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-skfolio--skfolio":3,"tool-skfolio--skfolio":64},[4,17,27,35,43,56],{"id":5,"name":6,"github_repo":7,"description_zh":8,"stars":9,"difficulty_score":10,"last_commit_at":11,"category_tags":12,"status":16},3808,"stable-diffusion-webui","AUTOMATIC1111\u002Fstable-diffusion-webui","stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面，旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点，将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。\n\n无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师，还是想要深入探索模型潜力的开发者与研究人员，都能从中获益。其核心亮点在于极高的功能丰富度：不仅支持文生图、图生图、局部重绘（Inpainting）和外绘（Outpainting）等基础模式，还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外，它内置了 GFPGAN 和 CodeFormer 等人脸修复工具，支持多种神经网络放大算法，并允许用户通过插件系统无限扩展能力。即使是显存有限的设备，stable-diffusion-webui 也提供了相应的优化选项，让高质量的 AI 艺术创作变得触手可及。",162132,3,"2026-04-05T11:01:52",[13,14,15],"开发框架","图像","Agent","ready",{"id":18,"name":19,"github_repo":20,"description_zh":21,"stars":22,"difficulty_score":23,"last_commit_at":24,"category_tags":25,"status":16},1381,"everything-claude-code","affaan-m\u002Feverything-claude-code","everything-claude-code 是一套专为 AI 编程助手（如 Claude Code、Codex、Cursor 等）打造的高性能优化系统。它不仅仅是一组配置文件，而是一个经过长期实战打磨的完整框架，旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。\n\n通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能，everything-claude-code 能显著提升 AI 在复杂任务中的表现，帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略，使得模型响应更快、成本更低，同时有效防御潜在的攻击向量。\n\n这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库，还是需要 AI 协助进行安全审计与自动化测试，everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目，它融合了多语言支持与丰富的实战钩子（hooks），让 AI 真正成长为懂上",140436,2,"2026-04-05T23:32:43",[13,15,26],"语言模型",{"id":28,"name":29,"github_repo":30,"description_zh":31,"stars":32,"difficulty_score":23,"last_commit_at":33,"category_tags":34,"status":16},2271,"ComfyUI","Comfy-Org\u002FComfyUI","ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎，专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式，采用直观的节点式流程图界面，让用户通过连接不同的功能模块即可构建个性化的生成管线。\n\n这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景，也能自由组合模型、调整参数并实时预览效果，轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性，不仅支持 Windows、macOS 和 Linux 全平台，还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构，并率先支持 SDXL、Flux、SD3 等前沿模型。\n\n无论是希望深入探索算法潜力的研究人员和开发者，还是追求极致创作自由度的设计师与资深 AI 绘画爱好者，ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能，使其成为当前最灵活、生态最丰富的开源扩散模型工具之一，帮助用户将创意高效转化为现实。",107662,"2026-04-03T11:11:01",[13,14,15],{"id":36,"name":37,"github_repo":38,"description_zh":39,"stars":40,"difficulty_score":23,"last_commit_at":41,"category_tags":42,"status":16},3704,"NextChat","ChatGPTNextWeb\u002FNextChat","NextChat 是一款轻量且极速的 AI 助手，旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性，以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发，NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。\n\n这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言，它也提供了便捷的自托管方案，支持一键部署到 Vercel 或 Zeabur 等平台。\n\nNextChat 的核心亮点在于其广泛的模型兼容性，原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型，让用户在一个界面即可自由切换不同 AI 能力。此外，它还率先支持 MCP（Model Context Protocol）协议，增强了上下文处理能力。针对企业用户，NextChat 提供专业版解决方案，具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能，满足公司对数据隐私和个性化管理的高标准要求。",87618,"2026-04-05T07:20:52",[13,26],{"id":44,"name":45,"github_repo":46,"description_zh":47,"stars":48,"difficulty_score":23,"last_commit_at":49,"category_tags":50,"status":16},2268,"ML-For-Beginners","microsoft\u002FML-For-Beginners","ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程，旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周，包含 26 节精炼课程和 52 道配套测验，内容涵盖从基础概念到实际应用的完整流程，有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。\n\n无论是希望转型的开发者、需要补充算法背景的研究人员，还是对人工智能充满好奇的普通爱好者，都能从中受益。课程不仅提供了清晰的理论讲解，还强调动手实践，让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持，通过自动化机制提供了包括简体中文在内的 50 多种语言版本，极大地降低了全球不同背景用户的学习门槛。此外，项目采用开源协作模式，社区活跃且内容持续更新，确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路，ML-For-Beginners 将是理想的起点。",84991,"2026-04-05T10:45:23",[14,51,52,53,15,54,26,13,55],"数据工具","视频","插件","其他","音频",{"id":57,"name":58,"github_repo":59,"description_zh":60,"stars":61,"difficulty_score":10,"last_commit_at":62,"category_tags":63,"status":16},3128,"ragflow","infiniflow\u002Fragflow","RAGFlow 是一款领先的开源检索增强生成（RAG）引擎，旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体（Agent）能力相结合，不仅支持从各类文档中高效提取知识，还能让模型基于这些知识进行逻辑推理和任务执行。\n\n在大模型应用中，幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构（如表格、图表及混合排版），显著提升了信息检索的准确度，从而有效减少模型“胡编乱造”的现象，确保回答既有据可依又具备时效性。其内置的智能体机制更进一步，使系统不仅能回答问题，还能自主规划步骤解决复杂问题。\n\n这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统，还是致力于探索大模型在垂直领域落地的创新者，都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口，既降低了非算法背景用户的上手门槛，也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目，它正成为连接通用大模型与行业专有知识之间的重要桥梁。",77062,"2026-04-04T04:44:48",[15,14,13,26,54],{"id":65,"github_repo":66,"name":67,"description_en":68,"description_zh":69,"ai_summary_zh":69,"readme_en":70,"readme_zh":71,"quickstart_zh":72,"use_case_zh":73,"hero_image_url":74,"owner_login":67,"owner_name":67,"owner_avatar_url":75,"owner_bio":68,"owner_company":76,"owner_location":76,"owner_email":76,"owner_twitter":76,"owner_website":76,"owner_url":77,"languages":78,"stars":91,"forks":92,"last_commit_at":93,"license":94,"difficulty_score":95,"env_os":96,"env_gpu":96,"env_ram":96,"env_deps":97,"category_tags":109,"github_topics":110,"view_count":10,"oss_zip_url":76,"oss_zip_packed_at":76,"status":16,"created_at":126,"updated_at":127,"faqs":128,"releases":157},801,"skfolio\u002Fskfolio","skfolio","Python library for portfolio optimization built on top of scikit-learn","skfolio 是一款基于 Python 的开源库，专为投资组合优化和风险管理设计。它巧妙地将现代机器学习理念引入金融领域，构建在广泛使用的 scikit-learn 框架之上。\n\n许多量化从业者常面临模型接口不统一、策略验证繁琐的痛点。skfolio 通过提供与 scikit-learn 完全兼容的统一接口，简化了投资组合模型的构建、微调、交叉验证及压力测试流程。用户无需学习全新的 API，即可利用熟悉的机器学习工作流来管理金融资产。\n\nskfolio 非常适合量化研究员、数据科学家、金融工程师以及致力于探索机器学习在资产配置中应用的开发者。其独特优势在于深度整合了 scikit-learn 生态，支持多种先进的优化算法和风险度量方法，同时保持代码的规范性与可维护性。无论是进行学术探索还是开发企业级交易系统，skfolio 都能提供稳定可靠的底层支持，助力实现更科学的资产配置决策。",".. -*- mode: rst -*-\n\n|Licence| |Codecov| |Black| |PythonVersion| |PyPi| |CI\u002FCD| |Downloads| |Ruff| |Contribution| |Website| |JupyterLite| |Discord| |DOI|\n\n.. |Licence| image:: https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLicense-BSD%203--Clause-blue.svg\n   :target: https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fblob\u002Fmain\u002FLICENSE\n\n.. |Codecov| image:: https:\u002F\u002Fcodecov.io\u002Fgh\u002Fskfolio\u002Fskfolio\u002Fgraph\u002Fbadge.svg?token=KJ0SE4LHPV\n   :target: https:\u002F\u002Fcodecov.io\u002Fgh\u002Fskfolio\u002Fskfolio\n\n.. |PythonVersion| image:: https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fpython-3.10%20%7C%203.11%20%7C%203.12%20%7C%203.13-blue.svg\n   :target: https:\u002F\u002Fpypi.org\u002Fproject\u002Fskfolio\u002F\n\n.. |PyPi| image:: https:\u002F\u002Fimg.shields.io\u002Fpypi\u002Fv\u002Fskfolio\n   :target: https:\u002F\u002Fpypi.org\u002Fproject\u002Fskfolio\n\n.. |Black| image:: https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fcode%20style-black-000000.svg\n   :target: https:\u002F\u002Fgithub.com\u002Fpsf\u002Fblack\n\n.. |CI\u002FCD| image:: https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Factions\u002Fworkflow\u002Fstatus\u002Fskfolio\u002Fskfolio\u002Frelease.yml.svg?logo=github\n   :target: https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fraw\u002Fmain\u002FLICENSE\n\n.. |Downloads| image:: https:\u002F\u002Fstatic.pepy.tech\u002Fbadge\u002Fskfolio\n   :target: https:\u002F\u002Fpepy.tech\u002Fproject\u002Fskfolio\n\n.. |Ruff| image:: https:\u002F\u002Fimg.shields.io\u002Fendpoint?url=https:\u002F\u002Fraw.githubusercontent.com\u002Fastral-sh\u002Fruff\u002Fmain\u002Fassets\u002Fbadge\u002Fv2.json\n   :target: https:\u002F\u002Fgithub.com\u002Fastral-sh\u002Fruff\n\n.. |Contribution| image:: https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FContributions-Welcome-blue\n   :target: https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fblob\u002Fmain\u002FCONTRIBUTING.md\n\n.. |Website| image:: https:\u002F\u002Fimg.shields.io\u002Fwebsite.svg?down_color=red&down_message=down&up_color=53cc0d&up_message=up&url=https:\u002F\u002Fskfolio.org\n   :target: https:\u002F\u002Fskfolio.org\n\n.. |JupyterLite| image:: https:\u002F\u002Fjupyterlite.rtfd.io\u002Fen\u002Flatest\u002F_static\u002Fbadge.svg\n   :target: https:\u002F\u002Fskfolio.org\u002Flite\n\n.. |Discord| image:: https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FDiscord-Join%20Chat-5865F2?logo=discord&logoColor=white\n   :target: https:\u002F\u002Fdiscord.gg\u002FBu7EtNYugS\n\n.. |DOI| image:: https:\u002F\u002Fzenodo.org\u002Fbadge\u002F731792488.svg\n   :target: https:\u002F\u002Fdoi.org\u002F10.5281\u002Fzenodo.16148630\n\n.. |PythonMinVersion| replace:: 3.10\n.. |NumpyMinVersion| replace:: 1.23.4\n.. |ScipyMinVersion| replace:: 1.8.0\n.. |PandasMinVersion| replace:: 1.4.1\n.. |CvxpyBaseMinVersion| replace:: 1.5.0\n.. |ClarabelMinVersion| replace:: 0.9.0\n.. |SklearnMinVersion| replace:: 1.6.0\n.. |JoblibMinVersion| replace:: 1.3.2\n.. |PlotlyMinVersion| replace:: 5.22.0\n\n\n===============\n|icon|  skfolio\n===============\n.. |icon| image:: https:\u002F\u002Fraw.githubusercontent.com\u002Fskfolio\u002Fskfolio\u002Fmaster\u002Fdocs\u002F_static\u002Flogo_animate.svg\n    :width: 100\n    :alt: skfolio documentation\n    :target: https:\u002F\u002Fskfolio.org\u002F\n\n\n**skfolio** is a Python library for portfolio optimization and risk management built on\ntop of scikit-learn. It offers a unified interface and tools compatible with\nscikit-learn to build, fine-tune, cross-validate and stress-test portfolio models.\n\nIt is distributed under the open-source 3-Clause BSD license.\n\n**skfolio**  is backed by `Skfolio Labs \u003Chttps:\u002F\u002Fskfoliolabs.com>`_, which provides enterprise support and SLAs for\ninstitutions.\n\n.. image:: https:\u002F\u002Fraw.githubusercontent.com\u002Fskfolio\u002Fskfolio\u002Fmaster\u002Fdocs\u002F_static\u002Fexpo.jpg\n    :target: https:\u002F\u002Fskfolio.org\u002Fauto_examples\u002F\n    :alt: examples\n\nImportant links\n~~~~~~~~~~~~~~~\n\n- `Documentation \u003Chttps:\u002F\u002Fskfolio.org\u002F>`_\n- `Examples \u003Chttps:\u002F\u002Fskfolio.org\u002Fauto_examples\u002F>`_\n- `User Guide \u003Chttps:\u002F\u002Fskfolio.org\u002Fuser_guide\u002F>`_\n- `GitHub Repo \u003Chttps:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio>`_\n- `Enterprise Support \u003Chttps:\u002F\u002Fskfoliolabs.com>`_\n\nFeatured in\n~~~~~~~~~~~\n\n* `Portfolio Optimization: Theory and Application \u003Chttps:\u002F\u002Fportfoliooptimizationbook.com\u002F>`_ by Daniel P. Palomar, includes Python code examples using skfolio.\n\nInstallation\n~~~~~~~~~~~~\n\n`skfolio` is available on PyPI and can be installed with::\n\n    pip install -U skfolio\n\n\nDependencies\n~~~~~~~~~~~~\n\n`skfolio` requires:\n\n- python (>= |PythonMinVersion|)\n- numpy (>= |NumpyMinVersion|)\n- scipy (>= |ScipyMinVersion|)\n- pandas (>= |PandasMinVersion|)\n- cvxpy-base (>= |CvxpyBaseMinVersion|)\n- clarabel (>= |ClarabelMinVersion|)\n- scikit-learn (>= |SklearnMinVersion|)\n- joblib (>= |JoblibMinVersion|)\n- plotly (>= |PlotlyMinVersion|)\n\nDocker\n~~~~~~\n\nYou can also spin up a reproducible JupyterLab environment using Docker:\n\nBuild the image::\n\n    docker build -t skfolio-jupyterlab .\n\nRun the container::\n\n    docker run -p 8888:8888 -v \u003Cpath-to-your-folder-containing-data>:\u002Fapp\u002Fdata -it skfolio-jupyterlab\n\nBrowse:\n\nOpen localhost:8888\u002Flab and start using `skfolio`\n\nKey Concepts\n~~~~~~~~~~~~\nSince the development of modern portfolio theory by Markowitz (1952), mean-variance\noptimization (MVO) has received considerable attention.\n\nUnfortunately, it faces a number of shortcomings, including high sensitivity to the\ninput parameters (expected returns and covariance), weight concentration, high turnover,\nand poor out-of-sample performance.\n\nIt is well-known that naive allocation (1\u002FN, inverse-vol, etc.) tends to outperform\nMVO out-of-sample (DeMiguel, 2007).\n\nNumerous approaches have been developed to alleviate these shortcomings (shrinkage,\nadditional constraints, regularization, uncertainty set, higher moments, Bayesian\napproaches, coherent risk measures, left-tail risk optimization, distributionally robust\noptimization, factor model, risk-parity, hierarchical clustering, ensemble methods,\npre-selection, etc.).\n\nGiven the large number of methods, and the fact that they can be combined, there is a\nneed for a unified framework with a machine-learning approach to perform model\nselection, validation, and parameter tuning while mitigating the risk of data leakage\nand overfitting.\n\nThis framework is built on scikit-learn's API.\n\nAvailable models\n~~~~~~~~~~~~~~~~\n\n* Portfolio Optimization:\n    * Naive:\n        * Equal-Weighted\n        * Inverse-Volatility\n        * Random (Dirichlet)\n    * Convex:\n        * Mean-Risk\n        * Risk Budgeting\n        * Maximum Diversification\n        * Distributionally Robust CVaR\n        * Benchmark Tracker\n    * Clustering:\n        * Hierarchical Risk Parity\n        * Hierarchical Equal Risk Contribution\n        * Schur Complementary Allocation\n        * Nested Clusters Optimization\n    * Ensemble Methods:\n        * Stacking Optimization\n\n* Expected Returns Estimator:\n    * Empirical\n    * Exponentially Weighted\n    * Equilibrium\n    * Shrinkage\n\n* Covariance Estimator:\n    * Empirical\n    * Gerber\n    * Denoising\n    * Detoning\n    * Exponentially Weighted\n    * Ledoit-Wolf\n    * Oracle Approximating Shrinkage\n    * Shrunk Covariance\n    * Graphical Lasso CV\n    * Implied Covariance\n\n* Distance Estimator:\n    * Pearson Distance\n    * Kendall Distance\n    * Spearman Distance\n    * Covariance Distance (based on any of the above covariance estimators)\n    * Distance Correlation\n    * Variation of Information\n\n* Distribution Estimator:\n    * Univariate:\n        * Gaussian\n        * Student's t\n        * Johnson Su\n        * Normal Inverse Gaussian\n    * Bivariate Copula\n        * Gaussian Copula\n        * Student's t Copula\n        * Clayton Copula\n        * Gumbel Copula\n        * Joe Copula\n        * Independent Copula\n    * Multivariate\n        * Vine Copula (Regular, Centered, Clustered, Conditional Sampling)\n\n* Prior Estimator:\n    * Empirical\n    * Black & Litterman\n    * Factor Model\n    * Synthetic Data (Stress Test, Factor Stress Test)\n    * Entropy Pooling\n    * Opinion Pooling\n\n* Uncertainty Set Estimator:\n    * On Expected Returns:\n        * Empirical\n        * Circular Bootstrap\n    * On Covariance:\n        * Empirical\n        * Circular Bootstrap\n\n* Pre-Selection Transformer:\n    * Non-Dominated Selection\n    * Select K Extremes (Best or Worst)\n    * Drop Highly Correlated Assets\n    * Select Non-Expiring Assets\n    * Select Complete Assets (handle late inception, delisting, etc.)\n    * Drop Zero Variance\n\n* Cross-Validation and Model Selection:\n    * Compatible with all `sklearn` methods (KFold, etc.)\n    * Walk Forward\n    * Combinatorial Purged Cross-Validation\n    * Multiple Randomized Cross-Validation\n\n* Hyper-Parameter Tuning:\n    * Compatible with all `sklearn` methods (GridSearchCV, RandomizedSearchCV)\n\n* Risk Measures:\n    * Variance\n    * Semi-Variance\n    * Mean Absolute Deviation\n    * First Lower Partial Moment\n    * CVaR (Conditional Value at Risk)\n    * EVaR (Entropic Value at Risk)\n    * Worst Realization\n    * CDaR (Conditional Drawdown at Risk)\n    * Maximum Drawdown\n    * Average Drawdown\n    * EDaR (Entropic Drawdown at Risk)\n    * Ulcer Index\n    * Gini Mean Difference\n    * Value at Risk\n    * Drawdown at Risk\n    * Entropic Risk Measure\n    * Fourth Central Moment\n    * Fourth Lower Partial Moment\n    * Skew\n    * Kurtosis\n\n* Optimization Features:\n    * Minimize Risk\n    * Maximize Returns\n    * Maximize Utility\n    * Maximize Ratio\n    * Transaction Costs\n    * Management Fees\n    * L1 and L2 Regularization\n    * Weight Constraints\n    * Group Constraints\n    * Budget Constraints\n    * Tracking Error Constraints\n    * Turnover Constraints\n    * Cardinality and Group Cardinality Constraints\n    * Threshold (Long and Short) Constraints\n\nQuickstart\n~~~~~~~~~~\nThe code snippets below are designed to introduce the functionality of `skfolio` so you\ncan start using it quickly. It follows the same API as scikit-learn.\n\nImports\n-------\n.. code-block:: python\n\n    from sklearn import set_config\n    from sklearn.model_selection import (\n        GridSearchCV,\n        KFold,\n        RandomizedSearchCV,\n        train_test_split,\n    )\n    from sklearn.pipeline import Pipeline\n    from scipy.stats import loguniform\n\n    from skfolio import RatioMeasure, RiskMeasure\n    from skfolio.datasets import load_factors_dataset, load_sp500_dataset\n    from skfolio.distribution import VineCopula\n    from skfolio.model_selection import (\n        CombinatorialPurgedCV,\n        WalkForward,\n        cross_val_predict,\n    )\n    from skfolio.moments import (\n        DenoiseCovariance,\n        DetoneCovariance,\n        EWMu,\n        GerberCovariance,\n        ShrunkMu,\n    )\n    from skfolio.optimization import (\n        MeanRisk,\n        HierarchicalRiskParity,\n        NestedClustersOptimization,\n        ObjectiveFunction,\n        RiskBudgeting,\n    )\n    from skfolio.pre_selection import SelectKExtremes\n    from skfolio.preprocessing import prices_to_returns\n    from skfolio.prior import (\n        BlackLitterman,\n        EmpiricalPrior,\n        EntropyPooling,\n        FactorModel,\n        OpinionPooling,\n        SyntheticData,\n     )\n    from skfolio.uncertainty_set import BootstrapMuUncertaintySet\n\nLoad Dataset\n------------\n.. code-block:: python\n\n    prices = load_sp500_dataset()\n\nTrain\u002FTest split\n----------------\n.. code-block:: python\n\n    X = prices_to_returns(prices)\n    X_train, X_test = train_test_split(X, test_size=0.33, shuffle=False)\n\n\nMinimum Variance\n----------------\n.. code-block:: python\n\n    model = MeanRisk()\n\nFit on Training Set\n-------------------\n.. code-block:: python\n\n    model.fit(X_train)\n\n    print(model.weights_)\n\nPredict on Test Set\n-------------------\n.. code-block:: python\n\n    portfolio = model.predict(X_test)\n\n    print(portfolio.annualized_sharpe_ratio)\n    print(portfolio.summary())\n\n\n\nMaximum Sortino Ratio\n---------------------\n.. code-block:: python\n\n    model = MeanRisk(\n        objective_function=ObjectiveFunction.MAXIMIZE_RATIO,\n        risk_measure=RiskMeasure.SEMI_VARIANCE,\n    )\n\n\nDenoised Covariance & Shrunk Expected Returns\n---------------------------------------------\n.. code-block:: python\n\n    model = MeanRisk(\n        objective_function=ObjectiveFunction.MAXIMIZE_RATIO,\n        prior_estimator=EmpiricalPrior(\n            mu_estimator=ShrunkMu(), covariance_estimator=DenoiseCovariance()\n        ),\n    )\n\nUncertainty Set on Expected Returns\n-----------------------------------\n.. code-block:: python\n\n    model = MeanRisk(\n        objective_function=ObjectiveFunction.MAXIMIZE_RATIO,\n        mu_uncertainty_set_estimator=BootstrapMuUncertaintySet(),\n    )\n\n\nWeight Constraints & Transaction Costs\n--------------------------------------\n.. code-block:: python\n\n    model = MeanRisk(\n        min_weights={\"AAPL\": 0.10, \"JPM\": 0.05},\n        max_weights=0.8,\n        transaction_costs={\"AAPL\": 0.0001, \"RRC\": 0.0002},\n        groups=[\n            [\"Equity\"] * 3 + [\"Fund\"] * 5 + [\"Bond\"] * 12,\n            [\"US\"] * 2 + [\"Europe\"] * 8 + [\"Japan\"] * 10,\n        ],\n        linear_constraints=[\n            \"Equity \u003C= 0.5 * Bond\",\n            \"US >= 0.1\",\n            \"Europe >= 0.5 * Fund\",\n            \"Japan \u003C= 1\",\n        ],\n    )\n    model.fit(X_train)\n\n\nRisk Parity on CVaR\n-------------------\n.. code-block:: python\n\n    model = RiskBudgeting(risk_measure=RiskMeasure.CVAR)\n\nRisk Parity & Gerber Covariance\n-------------------------------\n.. code-block:: python\n\n    model = RiskBudgeting(\n        prior_estimator=EmpiricalPrior(covariance_estimator=GerberCovariance())\n    )\n\nNested Cluster Optimization with Cross-Validation and Parallelization\n---------------------------------------------------------------------\n.. code-block:: python\n\n    model = NestedClustersOptimization(\n        inner_estimator=MeanRisk(risk_measure=RiskMeasure.CVAR),\n        outer_estimator=RiskBudgeting(risk_measure=RiskMeasure.VARIANCE),\n        cv=KFold(),\n        n_jobs=-1,\n    )\n\nRandomized Search of the L2 Norm\n--------------------------------\n.. code-block:: python\n\n    randomized_search = RandomizedSearchCV(\n        estimator=MeanRisk(),\n        cv=WalkForward(train_size=252, test_size=60),\n        param_distributions={\n            \"l2_coef\": loguniform(1e-3, 1e-1),\n        },\n    )\n    randomized_search.fit(X_train)\n\n    best_model = randomized_search.best_estimator_\n\n    print(best_model.weights_)\n\n\nGrid Search on Embedded Parameters\n----------------------------------\n.. code-block:: python\n\n    model = MeanRisk(\n        objective_function=ObjectiveFunction.MAXIMIZE_RATIO,\n        risk_measure=RiskMeasure.VARIANCE,\n        prior_estimator=EmpiricalPrior(mu_estimator=EWMu(alpha=0.2)),\n    )\n\n    print(model.get_params(deep=True))\n\n    gs = GridSearchCV(\n        estimator=model,\n        cv=KFold(n_splits=5, shuffle=False),\n        n_jobs=-1,\n        param_grid={\n            \"risk_measure\": [\n                RiskMeasure.VARIANCE,\n                RiskMeasure.CVAR,\n                RiskMeasure.VARIANCE.CDAR,\n            ],\n            \"prior_estimator__mu_estimator__alpha\": [0.05, 0.1, 0.2, 0.5],\n        },\n    )\n    gs.fit(X)\n\n    best_model = gs.best_estimator_\n\n    print(best_model.weights_)\n\n\nBlack & Litterman Model\n-----------------------\n.. code-block:: python\n\n    views = [\"AAPL - BBY == 0.03 \", \"CVX - KO == 0.04\", \"MSFT == 0.06 \"]\n    model = MeanRisk(\n        objective_function=ObjectiveFunction.MAXIMIZE_RATIO,\n        prior_estimator=BlackLitterman(views=views),\n    )\n\nFactor Model\n------------\n.. code-block:: python\n\n    factor_prices = load_factors_dataset()\n\n    X, factors = prices_to_returns(prices, factor_prices)\n    X_train, X_test, factors_train, factors_test = train_test_split(\n        X, factors, test_size=0.33, shuffle=False\n    )\n\n    model = MeanRisk(prior_estimator=FactorModel())\n    model.fit(X_train, factors_train)\n\n    print(model.weights_)\n\n    portfolio = model.predict(X_test)\n\n    print(portfolio.calmar_ratio)\n    print(portfolio.summary())\n\nFactor Model & Covariance Detoning\n----------------------------------\n.. code-block:: python\n\n    model = MeanRisk(\n        prior_estimator=FactorModel(\n            factor_prior_estimator=EmpiricalPrior(covariance_estimator=DetoneCovariance())\n        )\n    )\n\nBlack & Litterman Factor Model\n------------------------------\n.. code-block:: python\n\n    factor_views = [\"MTUM - QUAL == 0.03 \", \"VLUE == 0.06\"]\n    model = MeanRisk(\n        objective_function=ObjectiveFunction.MAXIMIZE_RATIO,\n        prior_estimator=FactorModel(\n            factor_prior_estimator=BlackLitterman(views=factor_views),\n        ),\n    )\n\nPre-Selection Pipeline\n----------------------\n.. code-block:: python\n\n    set_config(transform_output=\"pandas\")\n    model = Pipeline(\n        [\n            (\"pre_selection\", SelectKExtremes(k=10, highest=True)),\n            (\"optimization\", MeanRisk()),\n        ]\n    )\n    model.fit(X_train)\n\n    portfolio = model.predict(X_test)\n\n\n\n\nK-fold Cross-Validation\n-----------------------\n.. code-block:: python\n\n    model = MeanRisk()\n    mmp = cross_val_predict(model, X_test, cv=KFold(n_splits=5))\n    # mmp is the predicted MultiPeriodPortfolio object composed of 5 Portfolios (1 per testing fold)\n\n    mmp.plot_cumulative_returns()\n    print(mmp.summary())\n\n\nCombinatorial Purged Cross-Validation\n-------------------------------------\n.. code-block:: python\n\n    model = MeanRisk()\n\n    cv = CombinatorialPurgedCV(n_folds=10, n_test_folds=2)\n\n    print(cv.summary(X_train))\n\n    population = cross_val_predict(model, X_train, cv=cv)\n\n    population.plot_distribution(\n        measure_list=[RatioMeasure.SHARPE_RATIO, RatioMeasure.SORTINO_RATIO]\n    )\n    population.plot_cumulative_returns()\n    print(population.summary())\n\n\nMinimum CVaR Optimization on Synthetic Returns\n----------------------------------------------\n.. code-block:: python\n\n    vine = VineCopula(log_transform=True, n_jobs=-1)\n    prior = SyntheticData(distribution_estimator=vine, n_samples=2000)\n    model = MeanRisk(risk_measure=RiskMeasure.CVAR, prior_estimator=prior)\n    model.fit(X)\n    print(model.weights_)\n\n\nStress Test\n-----------\n.. code-block:: python\n\n    vine = VineCopula(log_transform=True, central_assets=[\"BAC\"], n_jobs=-1)\n    vine.fit(X)\n    X_stressed = vine.sample(n_samples=10_000, conditioning = {\"BAC\": -0.2})\n    ptf_stressed = model.predict(X_stressed)\n\n\nMinimum CVaR Optimization on Synthetic Factors\n----------------------------------------------\n.. code-block:: python\n\n    vine = VineCopula(central_assets=[\"QUAL\"], log_transform=True, n_jobs=-1)\n    factor_prior = SyntheticData(\n        distribution_estimator=vine,\n        n_samples=10_000,\n        sample_args=dict(conditioning={\"QUAL\": -0.2}),\n    )\n    factor_model = FactorModel(factor_prior_estimator=factor_prior)\n    model = MeanRisk(risk_measure=RiskMeasure.CVAR, prior_estimator=factor_model)\n    model.fit(X, factors)\n    print(model.weights_)\n\n\nFactor Stress Test\n------------------\n.. code-block:: python\n\n    factor_model.set_params(factor_prior_estimator__sample_args=dict(\n        conditioning={\"QUAL\": -0.5}\n    ))\n    factor_model.fit(X, factors)\n    stressed_dist = factor_model.return_distribution_\n    stressed_ptf = model.predict(stressed_dist)\n\nEntropy Pooling\n---------------\n.. code-block:: python\n\n    entropy_pooling = EntropyPooling(\n        mean_views=[\n            \"JPM == -0.002\",\n            \"PG >= LLY\",\n            \"BAC >= prior(BAC) * 1.2\",\n        ],\n        cvar_views=[\n            \"GE == 0.08\",\n        ],\n    )\n    entropy_pooling.fit(X)\n    print(entropy_pooling.relative_entropy_)\n    print(entropy_pooling.effective_number_of_scenarios_)\n    print(entropy_pooling.return_distribution_.sample_weight)\n\nCVaR Hierarchical Risk Parity optimization on Entropy Pooling\n-------------------------------------------------------------\n.. code-block:: python\n\n    entropy_pooling = EntropyPooling(cvar_views=[\"GE == 0.08\"])\n    model = HierarchicalRiskParity(\n        risk_measure=RiskMeasure.CVAR,\n        prior_estimator=entropy_pooling\n    )\n    model.fit(X)\n    print(model.weights_)\n\nStress Test with Entropy Pooling on Factor Synthetic Data\n---------------------------------------------------------\n.. code-block:: python\n\n    # Regular Vine Copula and sampling of 100,000 synthetic factor returns\n    factor_synth = SyntheticData(\n        n_samples=100_000,\n        distribution_estimator=VineCopula(log_transform=True, n_jobs=-1, random_state=0)\n    )\n\n    # Entropy Pooling by imposing a CVaR-95% of 10% on the Quality factor\n    factor_entropy_pooling = EntropyPooling(\n        prior_estimator=factor_synth,\n        cvar_views=[\"QUAL == 0.10\"],\n    )\n\n    factor_entropy_pooling.fit(X, factors)\n\n    # We retrieve the stressed distribution:\n    stressed_dist = factor_model.return_distribution_\n\n    # We stress-test our portfolio:\n    stressed_ptf = model.predict(stressed_dist)\n\nOpinion Pooling\n---------------\n.. code-block:: python\n\n    # We consider two expert opinions, each generated via Entropy Pooling with\n    # user-defined views.\n    # We assign probabilities of 40% to Expert 1, 50% to Expert 2, and by default\n    # the remaining 10% is allocated to the prior distribution:\n    opinion_1 = EntropyPooling(cvar_views=[\"AMD == 0.10\"])\n    opinion_2 = EntropyPooling(\n        mean_views=[\"AMD >= BAC\", \"JPM \u003C= prior(JPM) * 0.8\"],\n        cvar_views=[\"GE == 0.12\"],\n    )\n\n    opinion_pooling = OpinionPooling(\n        estimators=[(\"opinion_1\", opinion_1), (\"opinion_2\", opinion_2)],\n        opinion_probabilities=[0.4, 0.5],\n    )\n\n    opinion_pooling.fit(X)\n\n\nRecognition\n~~~~~~~~~~~\n\nWe would like to thank all contributors to our direct dependencies, such as\n`scikit-learn \u003Chttps:\u002F\u002Fgithub.com\u002Fscikit-learn\u002Fscikit-learn>`_ and `cvxpy \u003Chttps:\u002F\u002Fgithub.com\u002Fcvxpy\u002Fcvxpy>`_, as well as the contributors of the following resources:\n\n    * PyPortfolioOpt\n    * Riskfolio-Lib\n    * scikit-portfolio\n    * statsmodels\n    * rsome\n    * `Microprediction \u003Chttps:\u002F\u002Fgithub.com\u002Fmicroprediction>`_ (Peter Cotton)\n    * `Portfolio Optimization Book \u003Chttps:\u002F\u002Fportfoliooptimizationbook.com\u002F>`_ (Daniel P. Palomar)\n    * `quantresearch.org \u003Chttps:\u002F\u002Fquantresearch.org>`_ (Marcos López de Prado)\n    * gautier.marti.ai (Gautier Marti)\n\n\nCitation\n~~~~~~~~\n\nIf you use `skfolio` in a scientific publication, we would appreciate citations:\n\n**The library:**\n\n.. code-block:: bibtex\n\n        @software{skfolio,\n          title     = {skfolio},\n          author    = {Delatte, Hugo and Nicolini, Carlo and Manzi, Matteo},\n          year      = {2024},\n          doi       = {10.5281\u002Fzenodo.16148630},\n          url       = {https:\u002F\u002Fdoi.org\u002F10.5281\u002Fzenodo.16148630}\n        }\n\nThe above uses the concept DOI, which always resolves to the latest release.\nIf you need precise reproducibility, especially for journals or conferences that require\nit, you can cite the version-specific DOI for the exact release you used. To find it,\ngo to our `Zenodo project page \u003Chttps:\u002F\u002Fdoi.org\u002F10.5281\u002Fzenodo.16148630>`_, locate the\nrelease you wish to reference (e.g. \"v0.10.2\"), and copy the DOI listed next to that\nversion.\n\n**The paper:**\n\n.. code-block:: bibtex\n\n        @article{nicolini2025skfolio,\n          title         = {skfolio: Portfolio Optimization in Python},\n          author        = {Nicolini, Carlo and Manzi, Matteo and Delatte, Hugo},\n          journal       = {arXiv preprint arXiv:2507.04176},\n          year          = {2025},\n          eprint        = {2507.04176},\n          archivePrefix = {arXiv},\n          url           = {https:\u002F\u002Farxiv.org\u002Fabs\u002F2507.04176}\n        }\n\n",".. -*- mode: rst -*-\n\n|Licence| |Codecov| |Black| |PythonVersion| |PyPi| |CI\u002FCD| |Downloads| |Ruff| |Contribution| |Website| |JupyterLite| |Discord| |DOI|\n\n.. |Licence| image:: https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLicense-BSD%203--Clause-blue.svg\n   :target: https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fblob\u002Fmain\u002FLICENSE\n\n.. |Codecov| image:: https:\u002F\u002Fcodecov.io\u002Fgh\u002Fskfolio\u002Fskfolio\u002Fgraph\u002Fbadge.svg?token=KJ0SE4LHPV\n   :target: https:\u002F\u002Fcodecov.io\u002Fgh\u002Fskfolio\u002Fskfolio\n\n.. |PythonVersion| image:: https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fpython-3.10%20%7C%203.11%20%7C%203.12%20%7C%203.13-blue.svg\n   :target: https:\u002F\u002Fpypi.org\u002Fproject\u002Fskfolio\u002F\n\n.. |PyPi| image:: https:\u002F\u002Fimg.shields.io\u002Fpypi\u002Fv\u002Fskfolio\n   :target: https:\u002F\u002Fpypi.org\u002Fproject\u002Fskfolio\n\n.. |Black| image:: https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fcode%20style-black-000000.svg\n   :target: https:\u002F\u002Fgithub.com\u002Fpsf\u002Fblack\n\n.. |CI\u002FCD| image:: https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Factions\u002Fworkflow\u002Fstatus\u002Fskfolio\u002Fskfolio\u002Frelease.yml.svg?logo=github\n   :target: https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fraw\u002Fmain\u002FLICENSE\n\n.. |Downloads| image:: https:\u002F\u002Fstatic.pepy.tech\u002Fbadge\u002Fskfolio\n   :target: https:\u002F\u002Fpepy.tech\u002Fproject\u002Fskfolio\n\n.. |Ruff| image:: https:\u002F\u002Fimg.shields.io\u002Fendpoint?url=https:\u002F\u002Fraw.githubusercontent.com\u002Fastral-sh\u002Fruff\u002Fmain\u002Fassets\u002Fbadge\u002Fv2.json\n   :target: https:\u002F\u002Fgithub.com\u002Fastral-sh\u002Fruff\n\n.. |Contribution| image:: https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FContributions-Welcome-blue\n   :target: https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fblob\u002Fmain\u002FCONTRIBUTING.md\n\n.. |Website| image:: https:\u002F\u002Fimg.shields.io\u002Fwebsite.svg?down_color=red&down_message=down&up_color=53cc0d&up_message=up&url=https:\u002F\u002Fskfolio.org\n   :target: https:\u002F\u002Fskfolio.org\n\n.. |JupyterLite| image:: https:\u002F\u002Fjupyterlite.rtfd.io\u002Fen\u002Flatest\u002F_static\u002Fbadge.svg\n   :target: https:\u002F\u002Fskfolio.org\u002Flite\n\n.. |Discord| image:: https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FDiscord-Join%20Chat-5865F2?logo=discord&logoColor=white\n   :target: https:\u002F\u002Fdiscord.gg\u002FBu7EtNYugS\n\n.. |DOI| image:: https:\u002F\u002Fzenodo.org\u002Fbadge\u002F731792488.svg\n   :target: https:\u002F\u002Fdoi.org\u002F10.5281\u002Fzenodo.16148630\n\n.. |PythonMinVersion| replace:: 3.10\n.. |NumpyMinVersion| replace:: 1.23.4\n.. |ScipyMinVersion| replace:: 1.8.0\n.. |PandasMinVersion| replace:: 1.4.1\n.. |CvxpyBaseMinVersion| replace:: 1.5.0\n.. |ClarabelMinVersion| replace:: 0.9.0\n.. |SklearnMinVersion| replace:: 1.6.0\n.. |JoblibMinVersion| replace:: 1.3.2\n.. |PlotlyMinVersion| replace:: 5.22.0\n\n\n===============\n|icon|  skfolio\n===============\n.. |icon| image:: https:\u002F\u002Fraw.githubusercontent.com\u002Fskfolio\u002Fskfolio\u002Fmaster\u002Fdocs\u002F_static\u002Flogo_animate.svg\n    :width: 100\n    :alt: skfolio documentation\n    :target: https:\u002F\u002Fskfolio.org\u002F\n\n\n**skfolio** 是一个基于 scikit-learn（一个流行的 Python 机器学习库）构建的投资组合优化和风险管理 Python 库。它提供与 scikit-learn 兼容的统一接口和工具，用于构建、微调、交叉验证和压力测试投资组合模型。\n\n该项目采用开源的 3-Clause BSD 许可证分发。\n\n**skfolio** 由 `Skfolio Labs \u003Chttps:\u002F\u002Fskfoliolabs.com>`_ 支持，后者为机构提供企业支持和 SLA（服务等级协议）。\n\n.. image:: https:\u002F\u002Fraw.githubusercontent.com\u002Fskfolio\u002Fskfolio\u002Fmaster\u002Fdocs\u002F_static\u002Fexpo.jpg\n    :target: https:\u002F\u002Fskfolio.org\u002Fauto_examples\u002F\n    :alt: examples\n\n重要链接\n~~~~~~~~~~~~~~~\n\n- `文档 \u003Chttps:\u002F\u002Fskfolio.org\u002F>`_\n- `示例 \u003Chttps:\u002F\u002Fskfolio.org\u002Fauto_examples\u002F>`_\n- `用户指南 \u003Chttps:\u002F\u002Fskfolio.org\u002Fuser_guide\u002F>`_\n- `GitHub 仓库 \u003Chttps:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio>`_\n- `企业支持 \u003Chttps:\u002F\u002Fskfoliolabs.com>`_\n\n收录于\n~~~~~~~~~~~\n\n* Daniel P. Palomar 所著的《投资组合优化：理论与实践》（`Portfolio Optimization: Theory and Application \u003Chttps:\u002F\u002Fportfoliooptimizationbook.com\u002F>`_），其中包含使用 skfolio 的 Python 代码示例。\n\n安装\n~~~~~~~~~~~~\n\n`skfolio` 可在 PyPI 上获取，并使用以下命令安装：::\n\n    pip install -U skfolio\n\n\n依赖项\n~~~~~~~~~~~~\n\n`skfolio` 需要：\n\n- python (>= |PythonMinVersion|)\n- numpy (>= |NumpyMinVersion|)\n- scipy (>= |ScipyMinVersion|)\n- pandas (>= |PandasMinVersion|)\n- cvxpy-base (>= |CvxpyBaseMinVersion|)\n- clarabel (>= |ClarabelMinVersion|)\n- scikit-learn (>= |SklearnMinVersion|)\n- joblib (>= |JoblibMinVersion|)\n- plotly (>= |PlotlyMinVersion|)\n\nDocker\n~~~~~~\n\n您还可以使用 Docker 启动可复现的 JupyterLab 环境：\n\n构建镜像：::\n\n    docker build -t skfolio-jupyterlab .\n\n运行容器：::\n\n    docker run -p 8888:8888 -v \u003Cpath-to-your-folder-containing-data>:\u002Fapp\u002Fdata -it skfolio-jupyterlab\n\n浏览：\n\n打开 localhost:8888\u002Flab 并开始使用 `skfolio`\n\n核心概念\n~~~~~~~~~~~~\n自 Markowitz（1952）提出现代投资组合理论以来，均值 - 方差优化（MVO）受到了广泛关注。\n\n不幸的是，它面临许多缺点，包括对输入参数（预期收益和协方差）的高度敏感性、权重集中、高换手率以及样本外表现不佳。\n\n众所周知，朴素配置（如 1\u002FN、反波动率等）往往在样本外优于 MVO（DeMiguel, 2007）。\n\n为了缓解这些缺点，人们开发了许多方法（收缩估计、额外约束、正则化、不确定性集、高阶矩、贝叶斯方法、相干风险度量、左尾风险优化、分布鲁棒优化、因子模型、风险平价、层次聚类、集成方法、预筛选等）。\n\n鉴于方法数量众多，且它们可以组合使用，因此需要一个统一的框架，采用机器学习方法进行模型选择、验证和参数调优，同时降低数据泄露和过拟合的风险。\n\n该框架建立在 scikit-learn 的应用程序接口（API）之上。\n\n可用模型\n~~~~~~~~~~~~~~~~\n\n* 投资组合优化：\n    * 朴素：\n        * 等权重\n        * 反波动率\n        * 随机（狄利克雷）\n    * 凸优化：\n        * 均值 - 风险\n        * 风险预算\n        * 最大分散化\n        * 分布鲁棒条件风险价值（CVaR）\n        * 基准跟踪\n    * 聚类：\n        * 层次风险平价\n        * 层次等风险贡献\n        * 舒尔补分配\n        * 嵌套簇优化\n    * 集成方法：\n        * 堆叠优化\n\n* 预期收益估计器：\n    * 经验估计\n    * 指数加权\n    * 均衡\n    * 收缩\n\n* 协方差估计器：\n    * 经验估计\n    * Gerber\n    * 去噪\n    * Detoning\n    * 指数加权\n    * Ledoit-Wolf\n    * Oracle 近似收缩\n    * 收缩协方差\n    * Graphical Lasso CV\n    * 隐含协方差\n\n* 距离估计器：\n    * 皮尔逊距离\n    * 肯德尔距离\n    * 斯皮尔曼距离\n    * 协方差距离（基于上述任意一种协方差估计器）\n    * 距离相关系数\n    * 信息变异\n\n* 分布估计器：\n    * 单变量：\n        * 高斯\n        * 学生 t\n        * Johnson Su\n        * 正态逆高斯\n    * 二元 Copula（相依结构）\n        * 高斯 Copula\n        * 学生 t Copula\n        * Clayton Copula\n        * Gumbel Copula\n        * Joe Copula\n        * 独立 Copula\n    * 多变量\n        * Vine Copula（藤结构 Copula）（规则、中心化、聚类、条件采样）\n\n* 先验估计器：\n    * 经验估计\n    * Black & Litterman\n    * 因子模型\n    * 合成数据（压力测试、因子压力测试）\n    * 熵池法\n    * 意见池法\n\n* 不确定性集估计器：\n    * 关于预期收益：\n        * 经验估计\n        * 循环 Bootstrap（自助法）\n    * 关于协方差：\n        * 经验估计\n        * 循环 Bootstrap（自助法）\n\n* 预选择转换器：\n    * 非支配选择\n    * 选择 K 个极值（最佳或最差）\n    * 剔除高相关性资产\n    * 选择不即将到期的资产\n    * 选择完整资产（处理晚成立、退市等）\n    * 剔除零方差\n\n* 交叉验证与模型选择：\n    * 兼容所有 `sklearn` 方法（如 KFold 等）\n    * 向前滚动\n    * 组合净化交叉验证\n    * 多次随机交叉验证\n\n* 超参数调优：\n    * 兼容所有 `sklearn` 方法（如 GridSearchCV、RandomizedSearchCV）\n\n* 风险度量：\n    * 方差\n    * 半方差\n    * 平均绝对偏差\n    * 一阶下偏矩\n    * CVaR（条件在险价值）\n    * EVaR（熵在险价值）\n    * 最差实现\n    * CDaR（条件回撤风险）\n    * 最大回撤\n    * 平均回撤\n    * EDaR（熵回撤风险）\n    * 溃疡指数\n    * 基尼平均差\n    * 在险价值 (VaR)\n    * 回撤风险\n    * 熵风险度量\n    * 四阶中心矩\n    * 四阶下偏矩\n    * 偏度\n    * 峰度\n\n* 优化特性：\n    * 最小化风险\n    * 最大化收益\n    * 最大化效用\n    * 最大化比率\n    * 交易成本\n    * 管理费\n    * L1 和 L2 正则化\n    * 权重约束\n    * 组约束\n    * 预算约束\n    * 跟踪误差约束\n    * 换手率约束\n    * 基数和组基数约束\n    * 阈值（做多和做空）约束\n\n快速开始\n~~~~~~~~~~\n以下代码片段旨在介绍 `skfolio` 的功能，以便您能快速开始使用。它遵循与 scikit-learn 相同的 API。\n\n导入\n-------\n.. code-block:: python\n\n    from sklearn import set_config\n    from sklearn.model_selection import (\n        GridSearchCV,\n        KFold,\n        RandomizedSearchCV,\n        train_test_split,\n    )\n    from sklearn.pipeline import Pipeline\n    from scipy.stats import loguniform\n\n    from skfolio import RatioMeasure, RiskMeasure\n    from skfolio.datasets import load_factors_dataset, load_sp500_dataset\n    from skfolio.distribution import VineCopula\n    from skfolio.model_selection import (\n        CombinatorialPurgedCV,\n        WalkForward,\n        cross_val_predict,\n    )\n    from skfolio.moments import (\n        DenoiseCovariance,\n        DetoneCovariance,\n        EWMu,\n        GerberCovariance,\n        ShrunkMu,\n    )\n    from skfolio.optimization import (\n        MeanRisk,\n        HierarchicalRiskParity,\n        NestedClustersOptimization,\n        ObjectiveFunction,\n        RiskBudgeting,\n    )\n    from skfolio.pre_selection import SelectKExtremes\n    from skfolio.preprocessing import prices_to_returns\n    from skfolio.prior import (\n        BlackLitterman,\n        EmpiricalPrior,\n        EntropyPooling,\n        FactorModel,\n        OpinionPooling,\n        SyntheticData,\n     )\n    from skfolio.uncertainty_set import BootstrapMuUncertaintySet\n\n加载数据集\n------------\n.. code-block:: python\n\n    prices = load_sp500_dataset()\n\n训练\u002F测试集划分\n----------------\n.. code-block:: python\n\n    X = prices_to_returns(prices)\n    X_train, X_test = train_test_split(X, test_size=0.33, shuffle=False)\n\n\n最小方差\n----------------\n.. code-block:: python\n\n    model = MeanRisk()\n\n在训练集上拟合\n-------------------\n.. code-block:: python\n\n    model.fit(X_train)\n\n    print(model.weights_)\n\n在测试集上预测\n-------------------\n.. code-block:: python\n\n    portfolio = model.predict(X_test)\n\n    print(portfolio.annualized_sharpe_ratio)\n    print(portfolio.summary())\n\n\n\n最大索提诺比率\n---------------------\n.. code-block:: python\n\n    model = MeanRisk(\n        objective_function=ObjectiveFunction.MAXIMIZE_RATIO,\n        risk_measure=RiskMeasure.SEMI_VARIANCE,\n    )\n\n\n去噪协方差与收缩预期收益\n---------------------------------------------\n.. code-block:: python\n\n    model = MeanRisk(\n        objective_function=ObjectiveFunction.MAXIMIZE_RATIO,\n        prior_estimator=EmpiricalPrior(\n            mu_estimator=ShrunkMu(), covariance_estimator=DenoiseCovariance()\n        ),\n    )\n\n预期收益的不确定性集\n-----------------------------------\n.. code-block:: python\n\n    model = MeanRisk(\n        objective_function=ObjectiveFunction.MAXIMIZE_RATIO,\n        mu_uncertainty_set_estimator=BootstrapMuUncertaintySet(),\n    )\n\n\n权重约束与交易成本\n--------------------------------------\n.. code-block:: python\n\n    model = MeanRisk(\n        min_weights={\"AAPL\": 0.10, \"JPM\": 0.05},\n        max_weights=0.8,\n        transaction_costs={\"AAPL\": 0.0001, \"RRC\": 0.0002},\n        groups=[\n            [\"Equity\"] * 3 + [\"Fund\"] * 5 + [\"Bond\"] * 12,\n            [\"US\"] * 2 + [\"Europe\"] * 8 + [\"Japan\"] * 10,\n        ],\n        linear_constraints=[\n            \"Equity \u003C= 0.5 * Bond\",\n            \"US >= 0.1\",\n            \"Europe >= 0.5 * Fund\",\n            \"Japan \u003C= 1\",\n        ],\n    )\n    model.fit(X_train)\n\n\n基于 CVaR 的风险平价\n-------------------\n.. code-block:: python\n\n    model = RiskBudgeting(risk_measure=RiskMeasure.CVAR)\n\n风险平价与 Gerber 协方差\n-------------------------------\n.. code-block:: python\n\n    model = RiskBudgeting(\n        prior_estimator=EmpiricalPrior(covariance_estimator=GerberCovariance())\n    )\n\n带交叉验证和平行化的嵌套聚类优化\n---------------------------------------------------------------------\n.. code-block:: python\n\n    model = NestedClustersOptimization(\n        inner_estimator=MeanRisk(risk_measure=RiskMeasure.CVAR),\n        outer_estimator=RiskBudgeting(risk_measure=RiskMeasure.VARIANCE),\n        cv=KFold(),\n        n_jobs=-1,\n    )\n\nL2 范数的随机搜索\n--------------------------------\n.. code-block:: python\n\n    randomized_search = RandomizedSearchCV(\n        estimator=MeanRisk(),\n        cv=WalkForward(train_size=252, test_size=60),\n        param_distributions={\n            \"l2_coef\": loguniform(1e-3, 1e-1),\n        },\n    )\n    randomized_search.fit(X_train)\n\n    best_model = randomized_search.best_estimator_\n\n    print(best_model.weights_)\n\n嵌入参数的网格搜索\n----------------------------------\n.. code-block:: python\n\n    model = MeanRisk(\n        objective_function=ObjectiveFunction.MAXIMIZE_RATIO,\n        risk_measure=RiskMeasure.VARIANCE,\n        prior_estimator=EmpiricalPrior(mu_estimator=EWMu(alpha=0.2)),\n    )\n\n    print(model.get_params(deep=True))\n\n    gs = GridSearchCV(\n        estimator=model,\n        cv=KFold(n_splits=5, shuffle=False),\n        n_jobs=-1,\n        param_grid={\n            \"risk_measure\": [\n                RiskMeasure.VARIANCE,\n                RiskMeasure.CVAR,\n                RiskMeasure.VARIANCE.CDAR,\n            ],\n            \"prior_estimator__mu_estimator__alpha\": [0.05, 0.1, 0.2, 0.5],\n        },\n    )\n    gs.fit(X)\n\n    best_model = gs.best_estimator_\n\n    print(best_model.weights_)\n\n\nBlack & Litterman 模型\n-----------------------\n.. code-block:: python\n\n    views = [\"AAPL - BBY == 0.03 \", \"CVX - KO == 0.04\", \"MSFT == 0.06 \"]\n    model = MeanRisk(\n        objective_function=ObjectiveFunction.MAXIMIZE_RATIO,\n        prior_estimator=BlackLitterman(views=views),\n    )\n\n因子模型\n------------\n.. code-block:: python\n\n    factor_prices = load_factors_dataset()\n\n    X, factors = prices_to_returns(prices, factor_prices)\n    X_train, X_test, factors_train, factors_test = train_test_split(\n        X, factors, test_size=0.33, shuffle=False\n    )\n\n    model = MeanRisk(prior_estimator=FactorModel())\n    model.fit(X_train, factors_train)\n\n    print(model.weights_)\n\n    portfolio = model.predict(X_test)\n\n    print(portfolio.calmar_ratio)\n    print(portfolio.summary())\n\n因子模型与协方差去噪\n----------------------------------\n.. code-block:: python\n\n    model = MeanRisk(\n        prior_estimator=FactorModel(\n            factor_prior_estimator=EmpiricalPrior(covariance_estimator=DetoneCovariance())\n        )\n    )\n\nBlack & Litterman 因子模型\n------------------------------\n.. code-block:: python\n\n    factor_views = [\"MTUM - QUAL == 0.03 \", \"VLUE == 0.06\"]\n    model = MeanRisk(\n        objective_function=ObjectiveFunction.MAXIMIZE_RATIO,\n        prior_estimator=FactorModel(\n            factor_prior_estimator=BlackLitterman(views=factor_views),\n        ),\n    )\n\n预选择管道\n----------------------\n.. code-block:: python\n\n    set_config(transform_output=\"pandas\")\n    model = Pipeline(\n        [\n            (\"pre_selection\", SelectKExtremes(k=10, highest=True)),\n            (\"optimization\", MeanRisk()),\n        ]\n    )\n    model.fit(X_train)\n\n    portfolio = model.predict(X_test)\n\n\n\n\nK 折交叉验证\n-----------------------\n.. code-block:: python\n\n    model = MeanRisk()\n    mmp = cross_val_predict(model, X_test, cv=KFold(n_splits=5))\n    # mmp is the predicted MultiPeriodPortfolio object composed of 5 Portfolios (1 per testing fold)\n\n    mmp.plot_cumulative_returns()\n    print(mmp.summary())\n\n\n组合净化交叉验证\n-------------------------------------\n.. code-block:: python\n\n    model = MeanRisk()\n\n    cv = CombinatorialPurgedCV(n_folds=10, n_test_folds=2)\n\n    print(cv.summary(X_train))\n\n    population = cross_val_predict(model, X_train, cv=cv)\n\n    population.plot_distribution(\n        measure_list=[RatioMeasure.SHARPE_RATIO, RatioMeasure.SORTINO_RATIO]\n    )\n    population.plot_cumulative_returns()\n    print(population.summary())\n\n\n合成收益上的最小 CVaR 优化\n----------------------------------------------\n.. code-block:: python\n\n    vine = VineCopula(log_transform=True, n_jobs=-1)\n    prior = SyntheticData(distribution_estimator=vine, n_samples=2000)\n    model = MeanRisk(risk_measure=RiskMeasure.CVAR, prior_estimator=prior)\n    model.fit(X)\n    print(model.weights_)\n\n\n压力测试\n-----------\n.. code-block:: python\n\n    vine = VineCopula(log_transform=True, central_assets=[\"BAC\"], n_jobs=-1)\n    vine.fit(X)\n    X_stressed = vine.sample(n_samples=10_000, conditioning = {\"BAC\": -0.2})\n    ptf_stressed = model.predict(X_stressed)\n\n\n合成因子上的最小 CVaR 优化\n----------------------------------------------\n.. code-block:: python\n\n    vine = VineCopula(central_assets=[\"QUAL\"], log_transform=True, n_jobs=-1)\n    factor_prior = SyntheticData(\n        distribution_estimator=vine,\n        n_samples=10_000,\n        sample_args=dict(conditioning={\"QUAL\": -0.2}),\n    )\n    factor_model = FactorModel(factor_prior_estimator=factor_prior)\n    model = MeanRisk(risk_measure=RiskMeasure.CVAR, prior_estimator=factor_model)\n    model.fit(X, factors)\n    print(model.weights_)\n\n\n因子压力测试\n------------------\n.. code-block:: python\n\n    factor_model.set_params(factor_prior_estimator__sample_args=dict(\n        conditioning={\"QUAL\": -0.5}\n    ))\n    factor_model.fit(X, factors)\n    stressed_dist = factor_model.return_distribution_\n    stressed_ptf = model.predict(stressed_dist)\n\n熵池\n---------------\n.. code-block:: python\n\n    entropy_pooling = EntropyPooling(\n        mean_views=[\n            \"JPM == -0.002\",\n            \"PG >= LLY\",\n            \"BAC >= prior(BAC) * 1.2\",\n        ],\n        cvar_views=[\n            \"GE == 0.08\",\n        ],\n    )\n    entropy_pooling.fit(X)\n    print(entropy_pooling.relative_entropy_)\n    print(entropy_pooling.effective_number_of_scenarios_)\n    print(entropy_pooling.return_distribution_.sample_weight)\n\n基于熵池的 CVaR 层次风险平价优化\n-------------------------------------------------------------\n.. code-block:: python\n\n    entropy_pooling = EntropyPooling(cvar_views=[\"GE == 0.08\"])\n    model = HierarchicalRiskParity(\n        risk_measure=RiskMeasure.CVAR,\n        prior_estimator=entropy_pooling\n    )\n    model.fit(X)\n    print(model.weights_)\n\n基于因子合成数据的熵池压力测试\n---------------------------------------------------------\n.. code-block:: python\n\n    # Regular Vine Copula and sampling of 100,000 synthetic factor returns\n    factor_synth = SyntheticData(\n        n_samples=100_000,\n        distribution_estimator=VineCopula(log_transform=True, n_jobs=-1, random_state=0)\n    )\n\n    # Entropy Pooling by imposing a CVaR-95% of 10% on the Quality factor\n    factor_entropy_pooling = EntropyPooling(\n        prior_estimator=factor_synth,\n        cvar_views=[\"QUAL == 0.10\"],\n    )\n\n    factor_entropy_pooling.fit(X, factors)\n\n    # We retrieve the stressed distribution:\n    stressed_dist = factor_model.return_distribution_\n\n    # We stress-test our portfolio:\n    stressed_ptf = model.predict(stressed_dist)\n\n意见池化\n---------------\n.. code-block:: python\n\n    # We consider two expert opinions, each generated via Entropy Pooling with\n    # user-defined views.\n    # We assign probabilities of 40% to Expert 1, 50% to Expert 2, and by default\n    # the remaining 10% is allocated to the prior distribution:\n    opinion_1 = EntropyPooling(cvar_views=[\"AMD == 0.10\"])\n    opinion_2 = EntropyPooling(\n        mean_views=[\"AMD >= BAC\", \"JPM \u003C= prior(JPM) * 0.8\"],\n        cvar_views=[\"GE == 0.12\"],\n    )\n\nopinion_pooling = OpinionPooling(\n        estimators=[(\"opinion_1\", opinion_1), (\"opinion_2\", opinion_2)],\n        opinion_probabilities=[0.4, 0.5],\n    )\n\n    opinion_pooling.fit(X)\n\n\n致谢\n~~~~~~~~~~~\n\n我们要感谢所有直接依赖项（dependencies）的贡献者，例如\n`scikit-learn \u003Chttps:\u002F\u002Fgithub.com\u002Fscikit-learn\u002Fscikit-learn>`_ 和 `cvxpy \u003Chttps:\u002F\u002Fgithub.com\u002Fcvxpy\u002Fcvxpy>`_，以及以下资源的贡献者：\n\n    * PyPortfolioOpt\n    * Riskfolio-Lib\n    * scikit-portfolio\n    * statsmodels\n    * rsome\n    * `Microprediction \u003Chttps:\u002F\u002Fgithub.com\u002Fmicroprediction>`_ (Peter Cotton)\n    * `Portfolio Optimization Book \u003Chttps:\u002F\u002Fportfoliooptimizationbook.com\u002F>`_ (Daniel P. Palomar)\n    * `quantresearch.org \u003Chttps:\u002F\u002Fquantresearch.org>`_ (Marcos López de Prado)\n    * gautier.marti.ai (Gautier Marti)\n\n\n引用\n~~~~~~~~\n\n如果您在科学出版物中使用 `skfolio`，我们将感激您的引用：\n\n**该库：**\n\n.. code-block:: bibtex\n\n        @software{skfolio,\n          title     = {skfolio},\n          author    = {Delatte, Hugo and Nicolini, Carlo and Manzi, Matteo},\n          year      = {2024},\n          doi       = {10.5281\u002Fzenodo.16148630},\n          url       = {https:\u002F\u002Fdoi.org\u002F10.5281\u002Fzenodo.16148630}\n        }\n\n上述使用了 DOI（数字对象标识符）概念，它始终解析为最新版本。\n如果您需要精确的可复现性（reproducibility），特别是对于要求此特性的期刊或会议，您可以引用您所用确切版本的特定版本 DOI。要查找它，\n请访问我们的 `Zenodo 项目页面 \u003Chttps:\u002F\u002Fdoi.org\u002F10.5281\u002Fzenodo.16148630>`_，找到您希望引用的版本（例如 \"v0.10.2\"），并复制该版本旁边列出的 DOI。\n\n**论文：**\n\n.. code-block:: bibtex\n\n        @article{nicolini2025skfolio,\n          title         = {skfolio: Portfolio Optimization in Python},\n          author        = {Nicolini, Carlo and Manzi, Matteo and Delatte, Hugo},\n          journal       = {arXiv preprint arXiv:2507.04176},\n          year          = {2025},\n          eprint        = {2507.04176},\n          archivePrefix = {arXiv},\n          url           = {https:\u002F\u002Farxiv.org\u002Fabs\u002F2507.04176}\n        }","# skfolio 快速上手指南\n\n**skfolio** 是一个基于 scikit-learn 构建的 Python 库，用于投资组合优化和风险管理。它提供统一的接口，支持模型的构建、微调、交叉验证和压力测试。\n\n## 环境准备\n\n在使用 skfolio 之前，请确保您的开发环境满足以下要求：\n\n- **Python 版本**: 3.10 及以上\n- **核心依赖**:\n  - numpy (>= 1.23.4)\n  - scipy (>= 1.8.0)\n  - pandas (>= 1.4.1)\n  - scikit-learn (>= 1.6.0)\n  - cvxpy-base (>= 1.5.0)\n  - clarabel (>= 0.9.0)\n  - joblib (>= 1.3.2)\n  - plotly (>= 5.22.0)\n\n> **提示**: 大多数依赖可以通过 `pip` 自动安装。如果遇到编译问题，请确保系统已安装 C\u002FC++ 编译器。\n\n## 安装步骤\n\n推荐使用 PyPI 官方源进行安装。为了提升国内下载速度，建议配置国内镜像源。\n\n### 1. 基础安装\n\n```bash\npip install -U skfolio\n```\n\n### 2. 使用国内镜像（可选）\n\n```bash\npip install -U skfolio -i https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple\n```\n\n### 3. Docker 环境（可选）\n\n如需可复现的 JupyterLab 环境，可使用 Docker：\n\n```bash\ndocker build -t skfolio-jupyterlab .\ndocker run -p 8888:8888 -v \u003Cpath-to-your-folder-containing-data>:\u002Fapp\u002Fdata -it skfolio-jupyterlab\n```\n\n## 基本使用\n\nskfolio 遵循 scikit-learn 的 API 风格，以下是从数据加载到模型预测的最小化示例。\n\n### 1. 导入必要的库\n\n```python\nfrom sklearn import set_config\nfrom sklearn.model_selection import (\n    GridSearchCV,\n    KFold,\n    RandomizedSearchCV,\n    train_test_split,\n)\nfrom sklearn.pipeline import Pipeline\nfrom scipy.stats import loguniform\n\nfrom skfolio import RatioMeasure, RiskMeasure\nfrom skfolio.datasets import load_factors_dataset, load_sp500_dataset\nfrom skfolio.distribution import VineCopula\nfrom skfolio.model_selection import (\n    CombinatorialPurgedCV,\n    WalkForward,\n    cross_val_predict,\n)\nfrom skfolio.moments import (\n    DenoiseCovariance,\n    DetoneCovariance,\n    EWMu,\n    GerberCovariance,\n    ShrunkMu,\n)\nfrom skfolio.optimization import (\n    MeanRisk,\n    HierarchicalRiskParity,\n    NestedClustersOptimization,\n    ObjectiveFunction,\n    RiskBudgeting,\n)\nfrom skfolio.pre_selection import SelectKExtremes\nfrom skfolio.preprocessing import prices_to_returns\nfrom skfolio.prior import (\n    BlackLitterman,\n    EmpiricalPrior,\n    EntropyPooling,\n    FactorModel,\n    OpinionPooling,\n    SyntheticData,\n )\nfrom skfolio.uncertainty_set import BootstrapMuUncertaintySet\n```\n\n### 2. 加载数据集与划分\n\n```python\nprices = load_sp500_dataset()\n\nX = prices_to_returns(prices)\nX_train, X_test = train_test_split(X, test_size=0.33, shuffle=False)\n```\n\n### 3. 模型构建与训练\n\n以最小方差策略为例：\n\n```python\nmodel = MeanRisk()\n\nmodel.fit(X_train)\n\nprint(model.weights_)\n```\n\n### 4. 预测与评估\n\n在测试集上进行预测并查看结果：\n\n```python\nportfolio = model.predict(X_test)\n\nprint(portfolio.annualized_sharpe_ratio)\nprint(portfolio.summary())\n```\n\n更多高级用法（如最大化 Sortino 比率、去噪协方差、不确定性集等）请参考官方文档。","某中型资产管理公司的量化研究员负责管理一个包含股票、债券和商品的混合投资组合，需每周根据市场数据动态调整权重。\n\n### 没有 skfolio 时\n- 需要从零编写凸优化求解代码，数学公式实现复杂且极易引入数值误差\n- 风险模型与预期收益的整合缺乏统一框架，不同策略间难以横向对比\n- 策略参数调整依赖手动循环脚本，无法利用 scikit-learn 生态的并行计算加速\n- 缺乏内置的压力测试模块，难以在极端行情下快速评估组合的稳健性\n\n### 使用 skfolio 后\n- 采用类似 scikit-learn 的统一 estimator 接口，快速搭建从数据清洗到优化的完整管道\n- 内置多种成熟的风险估计器和优化器，大幅减少底层数学库的重复开发工作\n- 支持 GridSearchCV 等标准方法，自动化筛选最优策略参数并验证泛化能力\n- 提供便捷的应力测试模块，一键模拟市场崩盘情景并可视化风险敞口变化\n\nskfolio 通过将复杂的金融工程问题转化为标准化的机器学习流程，显著提升了投资组合管理的研发效率与可靠性。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fskfolio_skfolio_501baeea.png","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002Fskfolio_dd685937.png",null,"https:\u002F\u002Fgithub.com\u002Fskfolio",[79,83,87],{"name":80,"color":81,"percentage":82},"Python","#3572A5",99.9,{"name":84,"color":85,"percentage":86},"Dockerfile","#384d54",0.1,{"name":88,"color":89,"percentage":90},"Makefile","#427819",0,1923,192,"2026-04-05T20:24:15","BSD-3-Clause",1,"未说明",{"notes":98,"python":99,"dependencies":100},"基于 scikit-learn 构建的投资组合优化与风险管理库；提供与 scikit-learn 兼容的统一接口；支持通过 Docker 运行可复现的 JupyterLab 环境。","3.10+",[101,102,103,104,105,106,107,108],"numpy>=1.23.4","scipy>=1.8.0","pandas>=1.4.1","cvxpy-base>=1.5.0","clarabel>=0.9.0","scikit-learn>=1.6.0","joblib>=1.3.2","plotly>=5.22.0",[14,13],[111,112,113,114,115,116,117,118,119,120,121,122,123,124,125],"asset-allocation","asset-management","convex-optimization","cvar-optimization","cvxpy","efficient-frontier","hierarchical-clustering","machine-learning","portfolio","portfolio-optimization","quantitative-finance","quantitative-investment","risk-parity","scikit-learn","trading-strategies","2026-03-27T02:49:30.150509","2026-04-06T11:32:02.344496",[129,134,138,143,148,152],{"id":130,"question_zh":131,"answer_zh":132,"source_url":133},3443,"如何处理证券数据长度不一致（如上市\u002F退市）的情况？","填充常数值会导致方差为零，建议直接在优化前移除该资产。此问题应在预处理阶段解决，可使用 Transformers 和 Imputers 进行处理。","https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fissues\u002F67",{"id":135,"question_zh":136,"answer_zh":137,"source_url":133},3444,"遇到 NonPositiveVarianceError 时能否强制继续运行？","不建议强制。如果某些资产方差非正，优化步骤最终也会失败。应通过预处理或 Transformer\u002FImputer 在前端处理缺失数据，避免进入优化阶段。",{"id":139,"question_zh":140,"answer_zh":141,"source_url":142},3445,"如何实现动态投资组合权重（例如每月再平衡）？","可以使用 MultiPeriodPortfolio 包装多个静态 Portfolio 对象。例如：`MultiPeriodPortfolio([Portfolio(X=X[i], weights=weights[i]) for i in range(len(weights))])`。","https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fissues\u002F68",{"id":144,"question_zh":145,"answer_zh":146,"source_url":147},3446,"skfolio 是否计划与 sktime 深度集成？","由于 skfolio 依赖 scikit-learn 的 API 和关键例程，引入额外依赖可能不是最优解。sktime 用户可以直接将估算器接入 skfolio。如有困难可提交 Issue 获取特定集成示例。","https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fissues\u002F22",{"id":149,"question_zh":150,"answer_zh":151,"source_url":147},3447,"如何使用 sktime 的预测器（如 GARCH）作为 skfolio 的协方差估计器？","可以继承 BaseCovariance 类创建自定义估计器。示例如下：\n```python\nimport numpy as np\nfrom sktime.forecasting.arch import StatsForecastGARCH\nfrom skfolio.moments import BaseCovariance\n\nclass MyCustomCovariance(BaseCovariance):\n    def __init__(self, p: int = 1, q: int = 1, nearest: bool = True):\n        super().__init__(nearest=nearest)\n        self.p = p\n        self.q = q\n\n    def fit(self, X, y=None):\n        X.index = X.index.to_period(freq=\"d\")\n        # ... 后续逻辑\n```",{"id":153,"question_zh":154,"answer_zh":155,"source_url":156},3448,"目前 skfolio 支持哪些跟踪误差优化方法？","目前主要有三种方式：1. 硬约束（`max_tracking_error` 参数）；2. 基于权重的跟踪（`target_weights` 参数）；3. 收益跟踪误差最小化（使用 `BenchmarkTracker` 类）。","https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fissues\u002F195",[158,163,168,173,178,183,188,193,198,203,208,213,218,223,228,233,238,243,248,253],{"id":159,"version":160,"summary_zh":161,"released_at":162},112724,"v0.17.0","## v0.17.0 (2026-04-05)\n\n### Chores\n\n- Add .gitattributes ([`223a1b6`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F223a1b606d26520d6666b533b9bb084953e35186))\n\n- Improve docstrings ([`66c2af8`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F66c2af8701e7f16eb48d424893c98fa19f1f1b00))\n\n### Continuous Integration\n\n- Bump actions\u002Fdeploy-pages from 4 to 5 (#226) [skip ci] ([`1d09142`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F1d09142a0e302b3ba50f15f4ce4f6879053db349))\n\n- Bump codecov\u002Fcodecov-action from 5 to 6 (#225) [skip ci] ([`f0d51a4`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002Ff0d51a469be4338c48b51bb10f17df49997eced0))\n\n### Features\n\n- **covariance**: Add regime-adjusted EW covariance estimator (RegimeAdjustedEWCovariance) ([`00c3eba`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F00c3ebade2585b8868636dce9ef0e236ded5839f))\n\n- **moments**: Add online (partial_fit) and NaN-aware support to EWMu and EWCovariance ([`1298177`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F1298177a4e125007b2022aa57c75811028290de0))\n\n- **variance**: Add empirical, EW, and regime-adjusted estimators (EmpiricalVariance, EWVariance, RegimeAdjustedEWVariance) ([`abe3f14`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002Fabe3f1449d8dba52c6267ffe0a574f7d8e30fa82))\n\n### Refactoring\n\n- **prior**: Deprecate FactorModel in favor of TimeSeriesFactorModel ([`e98cff9`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002Fe98cff9715268a8c723b99cbdfc08c0eaf8aba3b))\n\n---\n\n**Detailed Changes**: [v0.16.1...v0.17.0](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcompare\u002Fv0.16.1...v0.17.0)\n","2026-04-05T11:23:22",{"id":164,"version":165,"summary_zh":166,"released_at":167},112725,"v0.16.1","## v0.16.1 (2026-03-24)\n\n### Bug Fixes\n\n- **BaseOptimization**: Remove abstractmethod on __init__ ([`84c7945`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F84c7945f151bcebd3ca881dcb0d4d721b846ac7d))\n\n### Continuous Integration\n\n- Bump actions\u002Fcreate-github-app-token from 2 to 3 (#222) [skip ci] ([`4fee1bb`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F4fee1bb8762668e527d5d85bf3dba66fd34e095e))\n\n---\n\n**Detailed Changes**: [v0.16.0...v0.16.1](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcompare\u002Fv0.16.0...v0.16.1)\n","2026-03-24T22:25:21",{"id":169,"version":170,"summary_zh":171,"released_at":172},112726,"v0.16.0","## v0.16.0 (2026-03-22)\n\n### Features\n\n- **MultipleRandomizedCV**: Add get_n_splits in MultipleRandomizedCV ([`5638dd3`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F5638dd350366c9e07783f3e9538ecd819d1d2f8c))\n\n- **Population**: Add returns_df in Population ([`f538a68`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002Ff538a68004f3a011b832efe76f87592bfdc22674))\n\n---\n\n**Detailed Changes**: [v0.15.7...v0.16.0](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcompare\u002Fv0.15.7...v0.16.0)\n","2026-03-22T21:46:16",{"id":174,"version":175,"summary_zh":176,"released_at":177},112727,"v0.15.7","## v0.15.7 (2026-03-14)\n\n### Bug Fixes\n\n- BenchmarkTracker with dict-based weight constraints ([`802825a`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F802825a1e07451b1efba8626eaf163a9f9621c83))\n\n---\n\n**Detailed Changes**: [v0.15.6...v0.15.7](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcompare\u002Fv0.15.6...v0.15.7)\n","2026-03-14T23:35:14",{"id":179,"version":180,"summary_zh":181,"released_at":182},112728,"v0.15.6","## v0.15.6 (2026-03-08)\n\n### Bug Fixes\n\n- Add get_n_splits to CombinatorialPurgedCV ([#218](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fpull\u002F218), [`1e0ab64`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F1e0ab64619d7e506c550b48f931ec1c51f0ab815))\n\n### Continuous Integration\n\n- Bump actions\u002Fupload-artifact from 6 to 7 (#217) [skip ci] ([`80fd889`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F80fd889bc8b36d974be7bfe7d5821bea246d02c0))\n\n---\n\n**Detailed Changes**: [v0.15.5...v0.15.6](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcompare\u002Fv0.15.5...v0.15.6)\n","2026-03-08T21:04:44",{"id":184,"version":185,"summary_zh":186,"released_at":187},112729,"v0.15.5","## v0.15.5 (2026-02-10)\n\n### Bug Fixes\n\n- Add max combinations check to CombinatorialPurgedCV to fail fast on impractical configurations ([`db2d976`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002Fdb2d97650d49a58eaa4641adf321158853c036ed))\n\n- **datasets**: Simplify dataset caching to use csv.gz directly ([`bb9e3ac`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002Fbb9e3ac4f6f15300bb701a42d9c185a5b372118b))\n\n- **pandas**: Ensure compatibility with pandas >= 3.0 ([`3d0c25b`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F3d0c25b642e72f761e808439fd11afb1537ad2a6))\n\n### Documentation\n\n- **readme**: Add resources and links ([`895a1d5`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F895a1d5102351481a2c1741c4a6a1978be134c3e))\n\n---\n\n**Detailed Changes**: [v0.15.4...v0.15.5](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcompare\u002Fv0.15.4...v0.15.5)\n","2026-02-10T15:18:42",{"id":189,"version":190,"summary_zh":191,"released_at":192},112730,"v0.15.4","## v0.15.4 (2026-01-29)\n\n### Bug Fixes\n\n- **typing**: Update cvxpy trace type hint for v1.8+ ([`7851702`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F785170286bcbc80871b3ea7ad9eea1bd35b47737))\n\n- **typing**: Use cvxpy.Expression instead of trace\u002FTrace type hint ([`c50e8de`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002Fc50e8debf0ac291a7f7445f110431b0e72df3087))\n\n---\n\n**Detailed Changes**: [v0.15.3...v0.15.4](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcompare\u002Fv0.15.3...v0.15.4)\n","2026-01-29T10:37:47",{"id":194,"version":195,"summary_zh":196,"released_at":197},112731,"v0.15.3","## v0.15.3 (2025-12-19)\n\n### Bug Fixes\n\n- Handles NaNs gracefully in Portfolio ([`dd1ec2e`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002Fdd1ec2e5be4254fc20730b0dc12dab5df7fc025d))\n\n### Continuous Integration\n\n- Bump actions\u002Fupload-artifact from 5 to 6 (#208) [skip ci] ([`5a9e932`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F5a9e932ca0c34323aa459b8d6aaf47c162a9a3da))\n\n- Bump python-semantic-release\u002Fpython-semantic-release (#209) [skip ci] ([`0fd76b1`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F0fd76b1c96461d1dc15dc60681ec4c6430823272))\n\n### Documentation\n\n- Fix typo in prices_to_returns ([`37561c4`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F37561c403a854081d5404fa1183a6532353aba1b))\n\n- Improve documentation about weight drift in Portfolio ([`97a34d7`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F97a34d7d04d621154f490ea98fde5ea4b24fdb8f))\n\n---\n\n**Detailed Changes**: [v0.15.2...v0.15.3](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcompare\u002Fv0.15.2...v0.15.3)\n","2025-12-19T19:29:51",{"id":199,"version":200,"summary_zh":201,"released_at":202},112732,"v0.15.2","## v0.15.2 (2025-12-02)\n\n### Bug Fixes\n\n- EntropyPooling now uses prior values from prior_estimator ([#203](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fpull\u002F203), [`09c9813`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F09c9813c503a18a11146e2f22099db250aa128c6))\n\n### Testing\n\n- Mean views with prior_estimator ([`0db273d`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F0db273da361b6996327f10b57ca7682edd135a31))\n\n---\n\n**Detailed Changes**: [v0.15.1...v0.15.2](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcompare\u002Fv0.15.1...v0.15.2)\n","2025-12-02T12:22:46",{"id":204,"version":205,"summary_zh":206,"released_at":207},112733,"v0.15.1","## v0.15.1 (2025-12-02)\n\n### Bug Fixes\n\n- Add `n_eff` in Empirical Uncertainty Set estimators ([#205](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fpull\u002F205), [`8f5fea5`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F8f5fea5e127398f842d7d12a14c2efbebf8dc8b3))\n\n### Chores\n\n- Typo in pyproject [skip ci] ([`382293f`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F382293f5043876c1dc8c00af7ad58944e71d5b6a))\n\n### Continuous Integration\n\n- Bump actions\u002Fcheckout from 5 to 6 (#201) [skip ci] ([`4bbba9c`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F4bbba9cb9e141988de1bc83acf967df33901bcc3))\n\n- Bump python-semantic-release\u002Fpython-semantic-release (#200) [skip ci] ([`7028c49`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F7028c492ac4818eb204d20186d06c395af0ad3f3))\n\n---\n\n**Detailed Changes**: [v0.15.0...v0.15.1](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcompare\u002Fv0.15.0...v0.15.1)\n","2025-12-02T09:07:14",{"id":209,"version":210,"summary_zh":211,"released_at":212},112734,"v0.15.0","## v0.15.0 (2025-11-20)\n\n### Features\n\n- Add tracking error optimization ([#198](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fpull\u002F198), [`4a1c207`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F4a1c207fd5e040592be68303b5ff3aa55431b24b))\n\n---\n\n**Detailed Changes**: [v0.14.3...v0.15.0](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcompare\u002Fv0.14.3...v0.15.0)\n","2025-11-20T14:27:23",{"id":214,"version":215,"summary_zh":216,"released_at":217},112735,"v0.14.3","## v0.14.3 (2025-11-12)\n\n### Bug Fixes\n\n- Maximum diversification with negative expected returns ([#197](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fpull\u002F197), [`c2cc1ad`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002Fc2cc1adb60c759678ed872c943badeddb1977e21))\n\n### Continuous Integration\n\n- Bump actions\u002Fcheckout from 3 to 5 (#185) [skip ci] ([`ff1f912`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002Fff1f9129214266e1bb53673f80cde970a05cc3dc))\n\n- Bump actions\u002Fcreate-github-app-token from 1 to 2 (#192) [skip ci] ([`5d673e7`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F5d673e73b73c1da4db2c80a43819a20b0d82b899))\n\n- Bump actions\u002Fsetup-python from 5 to 6 (#189) [skip ci] ([`ed63413`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002Fed63413b33fbe94527a4c12bd59c10484520a729))\n\n- Bump actions\u002Fupload-artifact from 4 to 5 (#190) [skip ci] ([`bf0887c`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002Fbf0887c8a6822983e644279675f70699166d12d0))\n\n- Bump astral-sh\u002Fsetup-uv from 4 to 7 (#191) [skip ci] ([`699ed58`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F699ed58e7b1cf33e8878a8b5f838e6069f26363a))\n\n- Bump codecov-action from 4 to 5 (#186) [skip ci] ([`86082c4`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F86082c4cda3f75b09bb27646bb40f7c54a117ac6))\n\n---\n\n**Detailed Changes**: [v0.14.2...v0.14.3](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcompare\u002Fv0.14.2...v0.14.3)\n","2025-11-12T18:26:38",{"id":219,"version":220,"summary_zh":221,"released_at":222},112736,"v0.14.2","## v0.14.2 (2025-10-21)\n\n### Bug Fixes\n\n- Adds support for one-factor models using EmpiricalCovariance ([#188](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fpull\u002F188), [`fd38213`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002Ffd3821378d602b78d94f8d5afbc71f4713bd4fe6))\n\n---\n\n**Detailed Changes**: [v0.14.1...v0.14.2](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcompare\u002Fv0.14.1...v0.14.2)\n","2025-10-21T16:10:37",{"id":224,"version":225,"summary_zh":226,"released_at":227},112737,"v0.14.1","## v0.14.1 (2025-10-14)\n\n### Bug Fixes\n\n- Improved docstrings ([`b28846e`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002Fb28846eb6a6e572db69987f34fceef461baab9ff))\n\n---\n\n**Detailed Changes**: [v0.14.0...v0.14.1](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcompare\u002Fv0.14.0...v0.14.1)\n","2025-10-14T10:21:13",{"id":229,"version":230,"summary_zh":231,"released_at":232},112738,"v0.14.0","## v0.14.0 (2025-10-09)\n\n### Chores\n\n- Add unit tests for python 3.13 ([`365e6bd`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F365e6bd8ced3faf5a9b834277795bf34cac1a1d7))\n\n- Increase security checks in ci\u002Fcd ([`3f141cf`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F3f141cf81503fd886b2de377de7ccd8bac95072f))\n\n- Ruff format ([`dc224c7`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002Fdc224c7ac8aa5b0d744a5d31593020f2d9bcf538))\n\n### Continuous Integration\n\n- Add minimum deps tests in CI workflow ([`02b4878`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F02b48787387f83945e8a004a9afe9b354b21e5db))\n\n- Fix CI workflow ([`76fe043`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F76fe043149dff615ea9742d4ffe1bcc4b8902068))\n\n- Fix CI workflow ([`f2ad1cc`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002Ff2ad1cc6a18cc535d4f74f19566326506eb59c21))\n\n### Documentation\n\n- Add Enterprise Support to documentation ([`344eba2`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F344eba2cfd352697cf40fa9aa6e3c802fe32cb68))\n\n- Add Failure and Fallback tutorial ([`45a6354`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F45a6354df4164c9fa285832451b153c0d65597e8))\n\n- Add Skfolio Labs references ([`fe314c8`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002Ffe314c8d39b2607861ff53b87b52292c5251095e))\n\n- Improve code references ([`9eb7294`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F9eb7294c56f9bcf3f8e6634a7ca39487cdf0bf3f))\n\n- Simplify pull_request_template.md ([`b892f6d`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002Fb892f6d12ad7b3e4abced12737c6be69f76e0e07))\n\n### Features\n\n- Add fallback mechanism to the optimization classes ([`e45450c`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002Fe45450cdeefa5621a257aebdcff509a76f137448))\n\n- Add NaN support to risk measures ([`f0e8305`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002Ff0e830535777b763885decfafa852a7f4ffa1a63))\n\n- Cross_val_predict now propagates weights between consecutive folds for sequential CV strategies (e.g., WalkForward or MultipleRandomizedCV) ([`8c0ee99`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F8c0ee99d4df0a3af08636ed1a7fe8191479ed4ed))\n\n- **portfolio**: Add FailedPortfolio for failed optimizations ([`dd79cf7`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002Fdd79cf7308da116b9f5965fbea5453ee62a3716c))\n\n---\n\n**Detailed Changes**: [v0.13.0...v0.14.0](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcompare\u002Fv0.13.0...v0.14.0)\n","2025-10-09T11:46:25",{"id":234,"version":235,"summary_zh":236,"released_at":237},112739,"v0.13.0","# v0.13.0 (2025-09-08)\n\n## Breaking\n\n* fix: rebase compounded cumulative returns to start at 1.0\n\nCompounded cumulative returns are now expressed as a wealth index starting\nat 1.0 (i.e., the value of $1 invested), instead of 1000.0. This aligns the\nimplementation with standard quant finance libraries.\n\nBREAKING CHANGE: Users relying on compounded cumulative returns previously\nstarting at 1000.0 will now see outputs starting at 1.0. To restore the\nold behavior, explicitly pass `base=1000.0` to get_cumulative_returns(). ([`1ec1fcd`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F1ec1fcd1c21393e4047e1306055de0f5199b8409))\n\n## Documentation\n\n* docs: schur complementary doc and example improved ([`c9ac1c9`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002Fc9ac1c976bfc4798b6243dba4283c654901dfce5))\n\n* docs(WalkForward): add guidance on purged_size ([`03f594b`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F03f594bdc45f6ddc1a5babc6a19a77925650d4f4))\n\n* docs: add note in the Population summary method about interactive table solutions ([`8db914a`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F8db914a9ccf15d7c79ebf6d4165215c478cad4f7))\n\n* docs: docstring of Risk Budgeting improved ([`16385fb`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F16385fbe069f7335dc023e736cef14784ec42f7b))\n\n## Feature\n\n* feat(Population): added measure box plot ([`b504854`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002Fb504854c9670a6f542f1741a5c5a74508ef5e285))\n\n* feat: add plot_drawdowns in Portfolio and Population ([`c8fea08`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002Fc8fea08d3122f93f70b1e41dc5affc466aeefa19))\n\n## Fix\n\n* fix: Simplified Risk Budgeting formulation ([`296bb24`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F296bb2400c9d8cdb36d0276d3361254ff98cb900))\n\n## Unknown\n\n* Merge pull request #176\n\nThe following features and fixes have been implemented:\n\n- Simplified Risk Budgeting formulation\n- docstring of Risk Budgeting improved\n- add plot_drawdowns in Portfolio and Population\n- rebase compounded cumulative returns to start at 1.0\n- add note in the Population summary method about interactive tab\n- add guidance on purged_size in WalkForward\n- add measure box plot ([`af5ca55`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002Faf5ca55ad1f9665e9e0044d81918374be9d5310b))","2025-09-08T14:55:19",{"id":239,"version":240,"summary_zh":241,"released_at":242},112740,"v0.12.0","# v0.12.0 (2025-09-06)\n\n## Documentation\n\n* docs: improve documentation website ([`31ae042`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F31ae042a35e1215829e7f6cadf5839fc348888bd))\n\n* docs: add documentation website redirects ([`e32d2d2`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002Fe32d2d22c7e00b1f6ec1174523a104a64511409c))\n\n* docs: sitemap ([`64c27ec`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F64c27ecd42917f100e6267b912dcad7573e7ba37))\n\n* docs: documentation website improved ([`e41e2d9`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002Fe41e2d967fba6f6b4009753b77a2a5992b41628c))\n\n* docs: conf.py improved ([`b3e9381`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002Fb3e9381e0bf0faecf27b5b4b45a0951ffe6bcf21))\n\n## Feature\n\n* feat: Add Schur Complementary Allocation from Peter Cotton (#165) ([`aad9131`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002Faad9131cefa2df79fdc3e2096606924ca797b446))","2025-09-06T14:14:26",{"id":244,"version":245,"summary_zh":246,"released_at":247},112741,"v0.11.0","# v0.11.0 (2025-07-26)\n\n## Documentation\n\n* docs: Add DOI for citations [skip ci] ([`8341e50`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F8341e506c60c771a4188b5f414ba6c04d7ad3bbf))\n\n## Feature\n\n* feat:  Add Multiple Randomized Cross-Validation from Palomar (#162) ([`b7a10f1`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002Fb7a10f180e33775e43827cc27d34315b96908fb1))","2025-07-26T20:36:16",{"id":249,"version":250,"summary_zh":251,"released_at":252},112742,"v0.10.2","# v0.10.2 (2025-07-19)\n\n## Chore\n\n* chore: Added dockerfile and instructions to run jupyterlab inside docker (#157) [skip ci] ([`271055f`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F271055f20b81b49fcdc4ae49a53557b1601fc1b9))\n\n## Documentation\n\n* docs(readme): update citations (#159) ([`5fb1335`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F5fb1335d8a4d5ed469250847a79d15a8df04a826))\n\n## Fix\n\n* fix: fixed `mu` estimation in EmpiricalPrior when `is_log_normal` is True ([`6084170`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F60841707c3efdc0830745b876e67a6087eafe9bc))","2025-07-19T09:07:03",{"id":254,"version":255,"summary_zh":256,"released_at":257},112743,"v0.10.1","# v0.10.1 (2025-06-17)\n\n## Chore\n\n* chore: typo and formatting ([`645e6f7`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F645e6f72843560b847eec4810b7f0bd7efaf500f))\n\n* chore: typo README [skip ci] ([`82f029e`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F82f029e64494228604795a1536bccc5e24d57737))\n\n* chore: typo README [skip ci] ([`4a325f1`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F4a325f13f70b56a33d785f5c0aeec3ad25dd9451))\n\n* chore: typo README ([`de7113b`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002Fde7113b433cc524d4f3be0b8dfb7ca2688b9c1db))\n\n## Documentation\n\n* docs: fixing examples ([`4cfd09d`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002F4cfd09d480b09e171a790b5d5f1636de37ff3257))\n\n## Fix\n\n* fix(measures): variance with sample_weight ([`e7e60cb`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002Fe7e60cb1c6e1dcb6afe1317221ee31a4870c0d01))\n\n## Test\n\n* test: entropy_pooling ([`c7fadf3`](https:\u002F\u002Fgithub.com\u002Fskfolio\u002Fskfolio\u002Fcommit\u002Fc7fadf3227cc45ea867e7f45f7ef8d511a94b0bb))","2025-06-17T21:05:39"]