You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用Python优化函数参数?替代Excel Solver处理投资组合等优化问题

嘿,我刚好在量化投资项目里频繁处理这类优化问题,从Excel Solver转Python绝对是提升效率和扩展性的正确选择!下面给你梳理几个最实用的方案,都是我实际落地过的:

一、通用优化工具:scipy.optimize

这是Python生态里最基础也最灵活的优化模块,能覆盖你提到的资产权重、策略参数调优这类常规需求,对应Excel Solver里的GRG非线性求解器。

举个最经典的投资组合方差最小化例子:

import numpy as np
from scipy.optimize import minimize

# 假设我们有资产收益率的协方差矩阵
cov_matrix = np.array([[0.005, -0.010, 0.004],
                       [-0.010, 0.040, -0.002],
                       [0.004, -0.002, 0.023]])

# 目标函数:最小化投资组合方差
def portfolio_variance(weights):
    return np.dot(weights.T, np.dot(cov_matrix, weights))

# 约束条件:权重和为1,且权重非负(可以根据需求调整,比如允许做空就去掉非负约束)
constraints = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1})
bounds = tuple((0, 1) for _ in range(3))

# 初始权重(均匀分配)
initial_weights = np.array([1/3, 1/3, 1/3])

# 求解
result = minimize(portfolio_variance, initial_weights, method='SLSQP', bounds=bounds, constraints=constraints)

print("最优权重:", result.x)

这个例子里你可以轻松替换目标函数(比如改成最大化夏普比率),或者添加更多约束(比如单资产仓位上限、行业仓位限制)。

二、凸优化专用工具:CVXPY

如果你的问题涉及复杂的线性/凸约束(比如交易成本、滑点限制、多目标优化),CVXPYscipy更直观,语法接近数学公式,不用纠结求解器的参数调优,对应Excel Solver里的线性规划求解器。

比如带交易成本的最大夏普比率优化:

import cvxpy as cp
import numpy as np

# 资产预期收益率、协方差矩阵
expected_returns = np.array([0.12, 0.08, 0.15])
cov_matrix = np.array([[0.005, -0.010, 0.004],
                       [-0.010, 0.040, -0.002],
                       [0.004, -0.002, 0.023]])
risk_free_rate = 0.02

n_assets = len(expected_returns)
weights = cp.Variable(n_assets)

# 目标函数:最大化夏普比率(等价于最大化超额收益/波动率)
objective = cp.Maximize((expected_returns @ weights - risk_free_rate) / cp.sqrt(cp.quad_form(weights, cov_matrix)))

# 约束:权重和为1,非负,单资产仓位不超过30%
constraints = [cp.sum(weights) == 1, weights >= 0, weights <= 0.3]

prob = cp.Problem(objective, constraints)
prob.solve()

print("最优权重:", weights.value.round(4))

CVXPY会自动选择合适的求解器,而且很容易扩展多目标优化(比如在最小化方差的同时控制最大回撤)。

三、金融专用优化库:PyPortfolioOpt

如果你聚焦于投资组合的核心问题(均值-方差、最大夏普、最小回撤等),这个库是天花板级的选择——它封装了所有常见的投资组合优化逻辑,不用自己写底层的目标函数和约束,开箱即用。

比如快速计算最大夏普比率组合:

from pypfopt import EfficientFrontier
from pypfopt import risk_models
from pypfopt import expected_returns
import pandas as pd

# 假设你有资产的历史价格数据(pandas DataFrame)
prices = pd.read_csv("asset_prices.csv", index_col="date")

# 计算预期收益率和协方差矩阵
mu = expected_returns.mean_historical_return(prices)
S = risk_models.sample_cov(prices)

# 初始化有效前沿,求解最大夏普比率组合
ef = EfficientFrontier(mu, S)
weights = ef.max_sharpe(risk_free_rate=0.02)

# 清理权重(去掉极小的仓位)
cleaned_weights = ef.clean_weights()
print(cleaned_weights)

# 还可以直接输出组合绩效指标
ef.portfolio_performance(verbose=True)

这个库甚至支持黑箱优化、因子约束、交易成本调整,完全覆盖专业投资组合的需求,比Excel Solver高效N倍。

四、方案选择建议
  • 如果你需要高度自定义的优化逻辑(比如策略参数调优,目标函数是非线性且没有现成封装):用scipy.optimize
  • 如果你有复杂的线性/凸约束:用CVXPY
  • 如果你只关注投资组合核心优化问题:直接上PyPortfolioOpt,节省大量代码时间

内容的提问来源于stack exchange,提问作者vestland

火山引擎 最新活动