基于Scipy的夏普比率优化代码中,数据传入路径是什么?
代码工作原理与数据传入环节解析
这段代码是用SciPy的优化工具实现最大化夏普比率的资产配置权重求解,属于量化投资里的均值-方差优化场景,下面逐段拆解并解答数据传入的问题:
代码各部分功能
导入优化模块
import scipy.optimize as sco引入SciPy的
optimize模块,用来调用数值优化算法。定义资产数量
n_assets = 7指定要进行配置的资产总数为7个。
优化目标函数
def min_func_sharpe(weights): return - port_ret(weights) / port_vol(weights)- 这是优化的核心目标:我们要最大化夏普比率(组合收益/组合波动率,默认无风险收益为0),但SciPy的优化器默认做最小化运算,所以返回负的夏普比率——最小化这个值就等价于最大化原夏普比率。
- 这里的
port_ret和port_vol是关键:你导入Jupyter的资产数据,就是通过这两个自定义函数传入优化流程的。这两个函数内部必然引用了你的资产历史收益数据,用来计算给定权重下的组合预期收益和波动率。
配置约束条件
cons = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1})设置等式约束:所有资产的权重之和必须等于1,保证是满仓配置(不允许空仓或加杠杆)。
lambda函数用来验证权重和是否符合要求,返回0时满足约束。设置权重边界
bnds = tuple((0, 1) for x in range(n_assets))给每个资产的权重设定范围:0到1之间,意味着不允许做空(权重不能为负),单个资产的配置比例最高为100%。
初始化权重
eweights = np.array(n_assets * [1. / n_assets,])给优化器提供一个初始的权重猜测值:所有资产等权分配,每个资产占比1/7。优化器会从这个点开始迭代寻找最优解。
执行优化计算
opts = sco.minimize(min_func_sharpe, eweights, method='SLSQP', bounds=bnds, constraints=cons)调用
sco.minimize函数,使用SLSQP(序列最小二乘规划)算法执行优化:- 传入目标函数、初始权重、权重边界和约束条件。
- 优化过程中,算法会不断调整权重值,每次调整后都会调用
min_func_sharpe,而这个函数会触发port_ret和port_vol计算对应权重下的组合指标——这两个函数会直接使用你导入的资产数据,让优化器判断当前权重的优劣,逐步迭代找到最优解。
数据传入的关键环节
你导入Jupyter的资产收益数据,是通过port_ret和port_vol这两个自定义函数接入优化流程的。这两个函数的定义里肯定引用了你的数据(比如一个存储资产历史收益率的DataFrame或NumPy数组)。
举个这两个函数的典型实现示例(你代码里应该有类似的定义):
import numpy as np # 假设这是你导入的资产历史收益率数据:100个交易日,7个资产的日收益率 returns = np.random.randn(100, 7) def port_ret(weights): # 计算组合预期年化收益率:权重与资产日均收益率的点积,乘以252(交易日数) return np.dot(weights, returns.mean(axis=0)) * 252 def port_vol(weights): # 计算组合年化波动率:权重协方差矩阵的二次型的平方根,乘以sqrt(252) return np.sqrt(np.dot(weights.T, np.dot(returns.cov() * 252, weights)))
在这个例子里,returns就是你导入的核心数据,port_ret和port_vol直接依赖它完成计算,当优化器调用目标函数时,就会间接把数据纳入优化过程。
内容的提问来源于stack exchange,提问作者Marlon Brando
相关产品推荐
相关产品推荐

