当前位置:首页>python>Python明星包-PyPortfolioOpt:投资组合优化分析

Python明星包-PyPortfolioOpt:投资组合优化分析

  • 2026-07-02 14:55:26
Python明星包-PyPortfolioOpt:投资组合优化分析

👇 连享会 · 推文导航 | www.lianxh.cn

连享会:2026五一论文班 · 线上时间:5月2-4日嘉宾:郭士祺 (上海交通大学)、戚树森 (厦门大学)、李学恒 (中山大学)咨询:王老师 18903405450(微信)

 本次课程框架为:因果证据链的构建 → 在顶刊论文中感受和校准这套因果证据链判断 → AI Agent 辅助实现完成

  • 先导课报名后可看回放

  • 从「会跑回归」到「会做研究设计」。 从 RCT 出发,覆盖 DID、固定效应、工具变量的识别逻辑与论证策略,重点不在方法本身,而在于如何围绕一个研究问题构建完整的因果证据链——这是 AI 替代不了、也最值得花时间打磨的核心能力。

  • 顶刊论文,原作者精讲。 戚树森老师亲自讲解自己参与完成的 Review of Finance 论文,覆盖选题缘起、识别策略设计、审稿意见的回应过程——不只是呈现结果,而是还原论文背后真实的决策过程。

  • 用 AI Agent 真正解放执行环节。 学完这门课,你将掌握两套可以直接上手的 AI Agent 工作流——文献综述和论文修改——并理解如何把自己的研究方法论写成 Skill,让 Agent 按照你的标准自动执行,而不是每次重新解释。

温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」。或直接长按/扫描如下二维码,直达原文:

作者:吕卓阳 (宁波大学)邮箱:lvzy20@163.com

核心资料

  • 论文:Martin, R. (2021). PyPortfolioOpt: portfolio optimization in Python. Journal of Open Source Software, 6(61), 3066. Link, PDF, Google.
  • 项目主页: https://pyportfolioopt.readthedocs.io/
  • GitHub地址: https://github.com/robertmartin8/PyPortfolioOpt

1. PyPortfolioOpt 介绍

近期,由 Robert Martin 开发的一个开源 Python 库引起了量化投资界的广泛关注—— PyPortfolioOpt 投资组合优化库。 PyPortfolioOpt 是一个专门实现投资组合优化方法的Python工具包,涵盖了从马科维茨经典均值-方差优化到 Black-Litterman 模型的各类方法,以及分层风险平价(HRP)等前沿算法。该库构建了覆盖300多种优化技术的功能模块,这些方法涉及预期收益估计、风险建模、目标函数设计、约束条件设置等多个维度,并包含详细的理论基础和实际应用案例。

这一工具包覆盖了从传统资产配置到现代风险平价的全谱投资组合构建方法,提供了资产权重优化和风险控制的全面视角。它可以为量化研究人员提供跨资产类别、跨国比较和投资策略构建的基础工具。

GitHub地址: https://github.com/robertmartin8/PyPortfolioOpt

该项目已在《开源软件杂志》( Journal of Open Source Software )上发表论文,目前由 Tuan Tran 负责维护。项目在ReadTheDocs上提供了完整的技术文档,同时在 cookbook 中展示了从数据获取到组合构建的完整工作流程。

2. PyPortfolioOpt 安装与使用

PyPortfolioOpt 支持多种安装方式。最简单的方法是直接从 PyPI 安装,只需运行pip install PyPortfolioOpt。需要注意的是, macOS 用户需要安装命令行工具, Windows 用户需要先安装 C++ 。为了更好的依赖管理,推荐使用 Poetry ,运行poetry add PyPortfolioOpt即可。

该库还支持 Docker 部署,可以构建容器并运行 iPython 解释器、 Jupyter notebook 服务器或进行测试。对于开发用途,可以直接克隆 GitHub 仓库或在命令行终端执行如下命令:

pip install -e git+https://github.com/robertmartin8/PyPortfolioOpt.git

快速示例

本推送的全部代码 .ipynb 文件可以在连享会的Github仓库中查看。以下是一个使用 PyPortfolioOpt 使用文档页面的美股个股的示例数据的示例,展示了如何找到最大化夏普比率的多头投资组合:

import pandas as pdfrom pypfopt import EfficientFrontierfrom pypfopt import risk_modelsfrom pypfopt import expected_returns# Read in price datadata_url = "https://raw.githubusercontent.com/lianxhcn/data/refs/heads/main/B810_stock_prices.csv"df = pd.read_csv(data_url, parse_dates=True, index_col="date")# Calculate expected returns and sample covariancemu = expected_returns.mean_historical_return(df)S = risk_models.sample_cov(df)# Optimize for maximal Sharpe ratioef = EfficientFrontier(mu, S)raw_weights = ef.max_sharpe()cleaned_weights = ef.clean_weights()print(cleaned_weights)ef.portfolio_performance(verbose=True)

该代码输出的权重分配结果显示, MA (万事达卡)获得最高权重35.3%, FB (Meta)获得20.6%权重, PFE (辉瑞)获得19.6%权重,而许多股票权重为0。预期年化收益率为30.5%,年化波动率为22.2%,夏普比率为1.28。

OrderedDict({'GOOG': 0.0458, 'AAPL': 0.06743, 'FB': 0.2008, 'BABA': 0.08494, 'AMZN': 0.03525, 'GE': 0.0, 'AMD': 0.0, 'WMT': 0.0, 'BAC': 0.0, 'GM': 0.0, 'T': 0.0, 'UAA': 0.0, 'SHLD': 0.0, 'XOM': 0.0, 'RRC': 0.0, 'BBY': 0.01587, 'MA': 0.3287, 'PFE': 0.20394, 'JPM': 0.0, 'SBUX': 0.01726})Expected annual return: 29.9%Annual volatility: 21.8%Sharpe Ratio: 1.38(0.29944709161230304, 0.21764331681393406, 1.375861643701672)

更实用的功能是将连续权重转换为实际可购买的离散分配。通过输入最新价格和期望的投资组合规模,可以得到具体的股票购买数量:

from pypfopt.discrete_allocation import DiscreteAllocation, get_latest_priceslatest_prices = get_latest_prices(df)da = DiscreteAllocation(cleaned_weights, latest_prices, total_portfolio_value=10000)allocation, leftover = da.greedy_portfolio()print("Discrete allocation:", allocation)print("Funds remaining: ${:.2f}".format(leftover))

结果显示,在1万美元的投资组合中,应购买19股 MA 、57股PFE、12股 FB 、4股 BABA 、4股 AAPL 、1股 GOOG 、2股 SBUX 和2股 BBY ,剩余资金为17.46美元。

Discrete allocation: {'MA': 19, 'PFE': 57, 'FB': 12, 'BABA': 4, 'AAPL': 4, 'GOOG': 1, 'SBUX': 2, 'BBY': 2}Funds remaining: $17.46

3. 理论介绍

3.1 现代投资组合理论(MPT)

Markowitz (1952)提出的均值-方差优化是投资组合理论的基石。其核心定义是通过数学优化方法在投资组合的预期收益和风险之间寻找最优平衡。该理论将投资决策从传统的单一资产分析转向整体投资组合的系统性分析,强调资产间的相互作用对整体风险收益特征的决定性影响。

投资组合的预期收益和风险可以用数学表述如下:

其中  表示资产  的权重, 表示资产  的预期收益率。  是资产  和  的协方差,  是  的协方差矩阵。

寻找最优投资组合即可以使用数学中的优化问题进行求解。第一种是在给定目标收益率的约束下最小化风险:    subject to   。第二种是在给定风险容忍度的约束下最大化收益:   subject to   ,   ,其中  是风险厌恶参数。这两种表述在数学上是等价的,都属于凸二次规划问题,可以通过拉格朗日乘数法求得解析解。

求解过程涉及构建拉格朗日函数,对权重向量求偏导并令其为零,得到一阶必要条件。在没有不等式约束的情况下,最优权重的解析解为:(最小方差组合)或更一般的形式涉及两个基础组合的线性组合。通过改变目标收益率或风险厌恶参数,可以得到一系列最优投资组合,这些组合在均值-方差平面上构成一条向上凸的曲线,称为有效前沿。

传统 MPT 方法的主要缺点集中在参数估计和实际应用的困难上。首先是预期收益估计的高度不确定性,历史平均收益作为未来预期收益的代理变量具有巨大的估计误差,而优化过程会放大这些误差,导致所谓的"误差最大化"现象。优化器倾向于给那些历史收益率高但可能包含大量噪声的资产分配过高权重。其次是协方差矩阵估计的样本偏差,当资产数量接近或超过历史观测期数时,样本协方差矩阵变得奇异或近似奇异,导致数值不稳定。第三是模型假设的限制性,如正态分布假设、单期模型假设、交易成本忽略等都与现实相去甚远。第四是权重集中度问题,优化结果常常导致投资组合过度集中在少数几个资产上,违背了分散化投资的直觉。

3.2 Black-Litterman 模型

Black-Litterman模型由费舍尔·布莱克和罗伯特·利特曼在1990年提出,其核心是通过贝叶斯框架将市场均衡隐含的收益预期与投资者主观观点相结合,解决传统马科维茨优化中预期收益估计不稳定的问题。Black-Litterman公式的完整表述为: 

其中  是标量参数,   是观点矩阵,  是观点不确定性矩阵, 是观点向量。该模型的理论基础建立在市场有效性假设之上,认为观察到的市场资本化权重包含了所有市场参与者对各资产预期收益的集体智慧。

模型的核心原理是从市场均衡条件反推隐含预期收益作为先验信息。根据 CAPM 理论,市场组合代表均衡状态下的最优配置,因此可以通过公式  从市场权重反推出市场隐含的预期收益  ,其中是风险厌恶系数。这个隐含收益向量代表了市场对各资产的"共识预期",相比历史平均收益具有更好的稳定性。

投资者的主观观点通过观点矩阵  和观点向量  表达,可以是绝对观点(某资产的预期收益)或相对观点(某资产相对其他资产的超额收益)。模型通过贝叶斯更新将市场共识与投资者观点融合,得到调整后的预期收益  。关键参数包括  (控制对市场先验的信心)和 (反映对主观观点的信心)。

Black-Litterman 模型解决的核心问题是传统优化中的"估计误差最大化"现象。当投资者没有明确观点时,模型自动回归市场权重,避免了极端配置;当有强烈观点时,配置会相应偏离市场,偏离程度取决于观点的强度和置信度。

3.3 分层风险平价(HRP)

分层风险平价算法由马科斯·洛佩斯·德·普拉多在2016年提出,其核心是通过机器学习的层次聚类技术构建投资组合,完全避开传统优化中的矩阵求逆运算。该算法针对传统均值-方差优化的数值不稳定性问题提供了全新的解决思路。

HRP算法的核心原理基于对传统优化问题的深刻洞察:当资产数量增加或资产间高度相关时,协方差矩阵变得接近奇异,矩阵求逆过程会显著放大估计误差,导致权重的剧烈波动。 HRP 通过识别资产间的层次相关结构,采用自上而下的递归风险分配,在不进行矩阵求逆的情况下实现有效的风险分散。

算法包含三个核心步骤:首先使用相关性距离   对资产进行层次聚类,构建反映资产相似性的树状结构;其次根据聚类结果重新排列协方差矩阵,使其呈现块对角结构;最后从聚类树的根节点开始递归二分,对每层的两个子簇按风险平价原则分配权重:  , 确保各子簇的风险贡献相等。

HRP 算法解决的主要问题是传统优化方法对估计误差的敏感性和数值不稳定性。通过完全避免矩阵求逆,算法对协方差估计误差具有天然的鲁棒性。层次聚类结构有效利用了资产收益的相关性模式,在保持分散化的同时避免过度分散。从机器学习角度看, HRP 相当于一种结构化正则化方法,通过引入层次约束防止过拟合,提升样本外表现的稳定性。

4. 应用介绍

PyPortfolioOpt 的设计遵循模块化原则,用户可以灵活替换各个组件。该库提供四大核心功能模块,彼此紧密关联又相对独立。在这里我们使用 akshare 包调用中国的几只个股数据,关于 akshare 包的使用可以参考如下推文:

  • 张祖冲, 2025, akshare 与 Python:中国金融数据分析与获取的开源首选工具
  • 申维冰, 2022, 金融数据哪里找——Akshare数据平台

4.1 预期收益估计

预期收益的准确估计是投资组合优化的关键输入。 PyPortfolioOpt 提供多种估计方法,包含三个核心预测函数:

  • mean_historical_return 用于计算历史平均收益率,
  • ema_historical_return 实现指数加权移动平均收益率,
  • capm_return 基于资本资产定价模型计算预期收益。

此外,还包含一些辅助函数如  prices_from_returns  和  returns_from_prices  用于价格和收益率之间的转换,以及 _check_returns  等内部验证函数。

以历史收益率方法为例:

import pandas as pdfrom pypfopt import expected_returnsimport akshare as ak# 使用akshare包获取几只个股数据stock_codes = ['000002''600519''000858''600036''601318']price_data = {}for code in stock_codes:    df = ak.stock_zh_a_hist(symbol=code,                             period="daily"                            start_date="20200101"                            end_date='20250101'                            adjust="qfq")    price_data[code] = df.set_index('日期')['收盘']df = pd.DataFrame(price_data)df.index = pd.to_datetime(df.index)# 创建市场基准数据(这里用所有股票的等权重组合作为市场代理)market_prices = df.mean(axis=1).to_frame(name='market')# 使用CAPM方法估计预期收益mu_capm = expected_returns.capm_return(df, market_prices=market_prices, risk_free_rate=0.02)print(f"\n平均预期收益率: {mu_capm.mean():.4f}")print(f"收益率标准差: {mu_capm.std():.4f}")print(f"最高预期收益股票: {mu_capm.idxmax()} ({mu_capm.max():.4f})")print(f"最低预期收益股票: {mu_capm.idxmin()} ({mu_capm.min():.4f})")

得到如下输出:

平均预期收益率: 0.0690收益率标准差: 0.0199最高预期收益股票: 000858 (0.0938)最低预期收益股票: 000002 (0.0502)

运行这段代码后,会得到每只 A 股基于 CAPM 模型的预期年化收益率。结果显示,五只股票的平均预期收益率为6.90%,其中万科A(000002)预期收益率最低为5.02%,五粮液(000858)预期收益率最高达9.38%。这些数值反映了各股票相对于市场基准的风险调整收益水平。贝塔系数高的股票(与市场相关性强且波动更大)会显示更高的预期收益,而贝塔系数低的股票则显示相对保守的预期收益。从标准差0.0199可以看出,这五只股票的预期收益率分布较为集中,风险特征相对均衡。

4.2 风险模型

协方差矩阵不仅编码资产的波动性,还包含资产间的相关性信息。为了获得分散化收益,投资组合中的资产应尽可能不相关。样本协方差矩阵是最常用的标准方法,计算相对简单且无偏,但估计误差较大,在均值-方差优化中容易导致过度权重分配给错误估计。半方差专注于下行风险的度量,指数协方差对近期数据赋予更多权重。协方差收缩技术将样本协方差矩阵与结构化估计量结合,减少错误权重的影响。 PyPortfolioOpt 提供了基于 sklearn.covariance 的高效向量化实现,包括手动收缩、Ledoit-Wolf收缩(提供 constant_variance 、 single_factor 和 constant_correlation 三种目标)以及 Oracle 近似收缩。最小协方差行列式提供协方差的稳健估计。

from pypfopt import risk_modelsimport akshare as ak# 使用相同的股票数据stock_codes = ['000002''600519''000858''600036''601318']price_data = {}for code in stock_codes:    df = ak.stock_zh_a_hist(symbol=code,                             period="daily"                            start_date="20200101"                            end_date='20250101'                            adjust="qfq")    price_data[code] = df.set_index('日期')['收盘']df = pd.DataFrame(price_data)df.index = pd.to_datetime(df.index)# 计算样本协方差矩阵S = risk_models.sample_cov(df)# 显示相关性最高和最低的股票对correlation_matrix = S.div(S.index.to_series().apply(lambda x: S.loc[x,x]**0.5), axis=0).div(S.columns.to_series().apply(lambda x: S.loc[x,x]**0.5), axis=1)corr_values = correlation_matrix.where(correlation_matrix != 1).stack().dropna()print(f"\n最高相关性: {corr_values.max():.3f}")print(f"最低相关性: {corr_values.min():.3f}")

得到如下输出:

最高相关性: 0.835最低相关性: 0.325

样本协方差矩阵直接从历史价格数据计算得出,反映了各 A 股资产的历史波动特征和相互关系。结果显示,五只 A 股中相关性最高的是0.835;而相关性最低0.325。这些相关性信息为构建风险分散的投资组合提供了定量依据,低相关性的资产组合能更有效地降低整体投资风险。

4.3 投资组合优化目标

EfficientFrontier 类提供了多种优化目标函数,最常用的是最大夏普比率优化,它寻找单位风险下收益最高的投资组合:

from pypfopt import EfficientFrontier# 计算预期收益和协方差矩阵mu = expected_returns.mean_historical_return(df)S = risk_models.sample_cov(df)# 最大夏普比率优化ef = EfficientFrontier(mu, S)weights = ef.max_sharpe()cleaned_weights = ef.clean_weights()print("最大夏普比率组合权重:")for stock, weight in cleaned_weights.items():if weight > 0.01:  # 只显示权重大于1%的股票        print(f"{stock}{weight:.3f} ({weight*100:.1f}%)")# 显示组合表现指标performance = ef.portfolio_performance(verbose=False)print(f"\n预期年化收益: {performance[0]:.3f} ({performance[0]*100:.1f}%)")print(f"年化波动率: {performance[1]:.3f} ({performance[1]*100:.1f}%)")print(f"夏普比率: {performance[2]:.3f}")

得到以下输出:

最大夏普比率组合权重:600519: 1.000 (100.0%)预期年化收益: 0.106 (10.6%)年化波动率: 0.325 (32.5%)夏普比率: 0.326

最大夏普比率优化自动在收益和风险间找到最佳平衡点。从结果可以看出,基于2020年至2024年的历史数据,优化器将100%的资金配置给了贵州茅台(600519),这表明在该时期茅台的风险调整后收益率显著优于其他四只股票。该组合预期年化收益为10.6%,年化波动率为32.5%,夏普比率为0.326。需要注意的是,这种极端集中的配置虽然理论上最优,但在实际投资中缺乏分散性,可以通过添加权重约束来获得更加均衡的投资组合。

4.4 约束与扩展功能

实际投资中往往需要各种约束条件, PyPortfolioOpt 支持灵活的约束设置。以权重上限约束为例:

# 限制单个股票权重不超过30%ef_constrained = EfficientFrontier(mu, S, weight_bounds=(0, 0.3))weights_constrained = ef_constrained.max_sharpe()cleaned_weights_constrained = ef_constrained.clean_weights()print("带权重约束的组合(单股票≤30%):")for stock, weight in cleaned_weights_constrained.items():if weight > 0.01:print(f"{stock}: {weight:.3f} ({weight*100:.1f}%)")

得到以下输出:

带权重约束的组合(单股票≤30%):600519: 0.300 (30.0%)000858: 0.300 (30.0%)600036: 0.300 (30.0%)601318: 0.100 (10.0%)

约束条件能防止投资组合过度集中于单一资产。相比于无约束优化将100%资金配置给贵州茅台,添加30%权重上限后,资金被分散配置到四只股票:贵州茅台、五粮液和招商银行各占30%,中国平安占10%。虽然预期收益从10.6%略降至9.5%,但年化波动率从32.5%显著下降至26.8%,夏普比率反而从0.326提升至0.355,说明通过合理的分散化投资,在降低风险的同时提高了风险调整后的收益效率。这种约束使得投资组合更加稳健,更符合实际投资中的风险管理需求。

4.5. Black-Litterman 实际应用

Black-Litterman 模型的实现展示了 PyPortfolioOpt 的强大功能。该模型允许您将市场隐含收益的先验估计与自己的观点结合,形成后验估计,从而得到比单纯使用历史均值收益更好的预期收益估计。

from pypfopt import BlackLittermanModel# 构建投资者观点(使用A股代码)viewdict = {"600519"0.25,   # 贵州茅台:看涨25%"000858"0.15,   # 五粮液:看涨15%"000002"-0.05,  # 万科A:看跌5%"600036"0.20,   # 招商银行:看涨20%"601318"0.10# 中国平安:看涨10%}# 创建Black-Litterman模型bl = BlackLittermanModel(S, pi="equal", absolute_views=viewdict, omega="default")ret_bl = bl.bl_returns()print("\nBlack-Litterman调整后的预期收益:")for stock in ret_bl.index:    original_return = mu[stock]    bl_return = ret_bl[stock]    print(f"{stock}{bl_return:.4f} (原始: {original_return:.4f})")# 使用调整后收益进行优化ef_bl = EfficientFrontier(ret_bl, S)weights_bl = ef_bl.max_sharpe()cleaned_weights_bl = ef_bl.clean_weights()print("\nBlack-Litterman组合权重:")for stock, weight in cleaned_weights_bl.items():if weight > 0.01:        print(f"{stock}{weight:.3f}")# 输出组合绩效ef_bl.portfolio_performance(verbose=True)

得到输出:

Black-Litterman调整后的预期收益:000002: 0.0789 (原始: -0.2484)600519: 0.1989 (原始: 0.1058)000858: 0.1768 (原始: 0.0423)600036: 0.1595 (原始: 0.0523)601318: 0.1381 (原始: -0.0714)Black-Litterman组合权重:600519: 0.706600036: 0.161601318: 0.133Expected annual return: 18.4%Annual volatility: 28.9%Sharpe Ratio: 0.64(0.1844931540767792, 0.28942476710060755, 0.6374477067909228)

这个例子中,投资者对五只 A 股表达了明确的主观观点:对贵州茅台(600519)最为看好,预期25%的涨幅;对招商银行(600036)看涨20%;对五粮液(000858)和中国平安(601318)分别看涨15%和10%;而对万科A(000002)持谨慎态度,预期下跌5%。Black-Litterman模型将这些主观观点与市场隐含的均衡收益相结合,生成了调整后的预期收益率。可以看到,所有股票的调整后收益都比原始历史收益更加合理,特别是万科A从-24.84%的历史负收益调整为7.89%,中国平安从-7.14%调整为13.81%。最终的优化组合将70.6%配置给茅台,16.1%配置给招商银行,13.3%配置给中国平安,预期年化收益达18.4%,夏普比率0.64,显著优于单纯基于历史数据的优化结果。这展示了 Black-Litterman 模型在融合主观判断与客观数据方面的强大能力。

4.6 有效前沿可视化

在获得预期收益和风险估计后,我们可以通过可视化展示投资组合的有效前沿。有效前沿是现代投资组合理论的核心概念,它描绘了在给定风险水平下能够实现的最大预期收益,或在给定收益水平下承受的最小风险。 PyPortfolioOpt 提供了便捷的绘图函数来展示这一关键概念。

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom pypfopt import EfficientFrontier, risk_models, expected_returns, plottingimport warningswarnings.filterwarnings('ignore')# 读取股票数据df = pd.read_csv("https://raw.githubusercontent.com/robertmartin8/PyPortfolioOpt/master/tests/resources/stock_prices.csv"                 parse_dates=True, index_col="date")# 计算预期收益和协方差矩阵mu = expected_returns.mean_historical_return(df)S = risk_models.sample_cov(df)# 创建有效前沿对象ef = EfficientFrontier(mu, S)# 创建图表fig, ax = plt.subplots(figsize=(107))# 复制对象用于计算最大夏普比率点ef_max_sharpe = ef.deepcopy()# 绘制有效前沿曲线plotting.plot_efficient_frontier(ef, ax=ax, show_assets=False)# 计算并标注最大夏普比率点ef_max_sharpe.max_sharpe()ret_tangent, std_tangent, _ = ef_max_sharpe.portfolio_performance()ax.scatter(std_tangent, ret_tangent, marker="*", s=500, c="r"          label="Max Sharpe", edgecolors='darkred', linewidths=2, zorder=10)# 生成随机投资组合(蒙特卡洛模拟)n_samples = 10000w = np.random.dirichlet(np.ones(ef.n_assets), n_samples)rets = w.dot(ef.expected_returns)stds = np.sqrt(np.diag(w @ ef.cov_matrix @ w.T))sharpes = rets / stds# 绘制随机投资组合散点ax.scatter(stds, rets,            marker="."           c=sharpes,            cmap="viridis_r"           s=10           alpha=0.3           label="Random Portfolios")# 添加颜色条cbar = plt.colorbar(ax.collections[-1], ax=ax, label='Sharpe Ratio')# 设置图表属性ax.set_title("Efficient Frontier with Random Portfolios", fontsize=14, fontweight='bold')ax.set_xlabel("Annualised Volatility", fontsize=12)ax.set_ylabel("Annualised Returns", fontsize=12)ax.legend(fontsize=11)ax.grid(True, alpha=0.3)plt.tight_layout()plt.savefig("ef_scatter.png", dpi=200)plt.show()

得到如下有效前沿示意图:

图中展示了投资组合优化的核心要素。黑色虚线为有效前沿曲线,代表各风险水平下的最优组合;彩色散点云是10,000个随机组合,颜色深浅表示夏普比率高低。可以看到,多数随机组合落在有效前沿下方,证明了优化的必要性。红色星号标记最大夏普比率组合,位于有效前沿的切点位置,实现了风险收益的最佳平衡。

需要说明的是,使用真实股票数据绘制的有效前沿图往往不如理论示例图美观,因为实际数据存在噪声和异常值。若需绘制更完美的示例图,可以使用模拟数据。具体的有效前沿绘图方法和参数设置可参考PyPortfolioOpt 官方文档和示例代码。

5. 总结

PyPortfolioOpt 作为开源的投资组合优化工具包,在实际应用中展现了明显的优势和局限性。从优势来看,该库最大的贡献是将复杂的数学理论转化为简洁的 Python 接口,用户只需几行代码就能完成从数据输入到权重输出的完整优化流程。其模块化架构设计合理,预期收益估计、风险建模、优化求解和后处理各个环节相对独立,便于用户根据具体需求进行定制化改进。

然而,该库也存在一些不足。

  • 首先是对大规模投资组合的支持有限,当资产数量超过数百个时,计算效率明显下降。
  • 其次,虽然提供了多种风险模型,但对动态风险建模和时变参数的支持相对薄弱,主要适用于静态的单期优化问题。
  • 在实用性方面,库中的某些高级功能(如 Black-Litterman 模型的观点设定)对新手用户仍然存在一定的学习曲线。

总的来说, PyPortfolioOpt 更适合学术研究、小规模资产管理和个人投资者使用,对于大型机构的生产环境可能需要额外的性能优化和稳定性改进。尽管如此,其开源特性和持续的社区维护使其成为了解投资组合优化理论和进行初步实践的理想选择。

6. 参考文献

  • 张祖冲,2025, akshare 与 Python:中国金融数据分析与获取的开源首选工具, 连享会 No.1642.
  • Lopez de Prado, M. (2016). Building diversified portfolios that outperform out-of-sample. Journal of Portfolio Management.
  • Black, F., & Litterman, R. (1990). Asset allocation: combining investor views with market equilibrium. Goldman Sachs Fixed Income Research115(1), 7-18.
  • López de Prado, M. (2016). Building Diversified Portfolios that Outperform Out of Sample. The Journal of Portfolio Management, 42(4), 59–69.
  • Martin, R. A. (2021). PyPortfolioOpt: portfolio optimization in Python. Journal of Open Source Software6(61), 3066.

7. 相关推文

Note:产生如下推文列表的 Stata 命令为:lianxh 金融 Finance, md2 nocat安装最新版 lianxh 命令:ssc install lianxh, replace

  • 全禹澄, 2021, 机器学习如何用?金融+能源经济学文献综述.
  • 吴欣洋, 2025, 分享!数百个金融类机器学习仓库:financial-ML.
  • 唐雪梅, 2023, 金融面板数据估计:可检验假设和参数一致性.
  • 张祖冲, 2025, akshare 与 Python:中国金融数据分析与获取的开源首选工具.
  • 李坤在, 2022, 好书:相见恨晚的金融学或经济学书籍.
  • 李青塬, 2021, Stata:CHFS中国家庭金融调查数据库清洗和处理-D121.
  • 申维冰, 2022, 金融数据哪里找——Akshare数据平台.
  • 申维冰, 2021, 金融数据哪里找:Tushare数据平台.
  • 肖蕊, 2021, 知乎热议:经济-金融大佬从哪里获得数据?如何处理?.
  • 董涵敏, 2022, 投个JFE:你了解顶刊金融经济学(JFE)吗.
  • 连享会, 2021, 下载:金融领域中文情绪词典.
  • 连享会, 2020, 会计和金融领域Top期刊分类.
  • 连享会, 2023, 公开课:王菲菲-文本分析在经济金融领域的应用.
  • 连享会, 2020, 金融领域引用率最高的50篇论文.
  • 连小白, 2025, Python常用包盘点:经济与金融领域的必备工具包.
  • 连玉君, 2020, 公司财务-投资组合Stata实现-Berk-Corporate-Finance-Chapter-11-Examples.
  • 陈卓然, 2023, JF论文复现:金融学术圈的女性们系列-1:日期和时间变量的处理和转换.
  • 陈卓然, 2023, Python金融分析系列-2:数据可视化.
  • 陈卓然, 2023, Python金融分析系列-3:金融时间序列.
  • 陈卓然, 2023, Python金融分析系列-4:数学工具-近似、凸优化、积分和符号运算.
  • 陈春霞, 2025, 二叉树期权定价模型:从理论到 Python 实践.

连享会微信小店上线啦!

Note:扫一扫进入“连享会微信小店”,你想学的课程在这里······

New! Stata 搜索神器:lianxh 和 songblGIF 动图介绍搜: 推文、数据分享、期刊论文、重现代码 ……👉 安装:. ssc install lianxh. ssc install songbl👉  使用:. lianxh DID 倍分法. songbl all

🍏 关于我们

  • 连享会 ( www.lianxh.cn,推文列表) 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 直通车: 👉【百度一下:连享会】即可直达连享会主页。亦可进一步添加 「知乎」,「b 站」,「面板数据」,「公开课」 等关键词细化搜索。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-03 21:47:05 HTTP/2.0 GET : https://f.mffb.com.cn/a/489428.html
  2. 运行时间 : 0.110712s [ 吞吐率:9.03req/s ] 内存消耗:4,927.30kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=9a4efaee04f2367b537062271539895b
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000585s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000760s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.002287s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.008809s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000678s ]
  6. SELECT * FROM `set` [ RunTime:0.000214s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000515s ]
  8. SELECT * FROM `article` WHERE `id` = 489428 LIMIT 1 [ RunTime:0.000623s ]
  9. UPDATE `article` SET `lasttime` = 1783086425 WHERE `id` = 489428 [ RunTime:0.000962s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000234s ]
  11. SELECT * FROM `article` WHERE `id` < 489428 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.005949s ]
  12. SELECT * FROM `article` WHERE `id` > 489428 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000991s ]
  13. SELECT * FROM `article` WHERE `id` < 489428 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.003437s ]
  14. SELECT * FROM `article` WHERE `id` < 489428 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.003139s ]
  15. SELECT * FROM `article` WHERE `id` < 489428 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.003507s ]
0.114474s