除了用蒙特卡洛模拟进行投资组合求解外,也可以通过python的scipy.optimize库进行最优化求解。接着上一篇文章,我们继续使用scipy.optimize进行投资组合最优化求解工作。

import scipy.optimize as sco# 定义计算投资组合的状态函数如下
def portfolio_status(weights):weights = array(weights)[:,newaxis]port_rets = weights.T @ array(returns.mean() * 250)[:,newaxis]port_vols = sqrt(multi_dot([weights.T, returns.cov()*250, weights]))# 返回组合收益率,组合波动率和夏普比率return array([port_rets, port_vols, port_rets/port_vols]).flatten()

用最优化module求解最大夏普比率对应的组合

# 定义夏普比率(取负号)函数
def sharpe_ratio(weights):return -portfolio_status(weights)[2]  #取return结果中的第3个数# 设置每一只股票权重范围为0<=x<=1
tuple((0,1) for x in range(numofasset))# 明确组合最优化约束条件和股票权重范围
cons = ({'type':'eq','fun': lambda x: sum(x)-1})
bnds = tuple((0,1) for x in range(numofasset))
initial_wts = numofasset*[1./numofasset]  #初始化weights的值便于优化算法快速完成计算# 用最优化module求解最大夏普比率,opt_sharpe(目标函数, 入参, 优化方法, 边界条件, 约束条件)
opt_sharpe = sco.minimize(sharpe_ratio, initial_wts, method='SLSQP',bounds = bnds, constraints = cons)
opt_sharpe# 最大夏普比率组合权重
list(zip(symbols, around(opt_sharpe['x']*100, 2)))  #两个list对应元素生成一个tuple# 最大夏普比率组合数
status = ['Returns', 'Volatility', 'Sharpe Ratio']
list(zip(status, around(portfolio_status(opt_sharpe['x']), 4)))

用最优化module求解最小波动率组合

# 定义波动率(方差)函数
def variance(weights):return portfolio_status(weights)[1]**2# 用最优化module求解最小方差
opt_var = sco.minimize(variance, initial_wts, method='SLSQP',bounds = bnds, constraints = cons)
opt_var# 最小方差组合权重
list(zip(symbols, around(opt_var['x']*100,2)))# status = ['Returns', 'Volatility', 'Sharp Ratio']
list(zip(status, around(portfolio_status(opt_var['x']),4)))

用最优化module求解有效边界(effective frontier)

# 定义波动率(标准差)函数
def volatility(weights):return portfolio_status(weights)[1]  #portfolio_status(weights)函数返回列表第2个元素为vol# 设定有效边界参数
targetrets = linspace(0.04, 0.42, 500)  # 将目标收益率进行500等分
targetvols_ = []for i in tqdm(targetrets):ef_cons = ({'type':'eq','fun': lambda x: sum(x)-1},{'type':'eq','fun': lambda x: portfolio_status(x)[0]-i})  #两个约束条件opt_ef = sco.minimize(volatility, initial_wts, method='SLSQP',bounds=bnds, constraints=ef_cons)targetvols_.append(opt_ef['fun'])targetvols = array(targetvols_)# 记录有效边界数据到DataFrame
ef_port = pd.DataFrame({'targetrets': around(targetrets*100, 2),'targetvols': around(targetvols*100, 2),'targetsharpe': around(targetrets/targetvols, 2)})ef_port.head()# 有效边界画图
fig = px.scatter(ef_port, x='targetvols', y='targetrets', color='targetsharpe',labels={'targetrets': '预期收益率', 'targetvols': '预期波动率','targetsharpe': '夏普比率'},title='投资组合有效边界').update_traces(mode='markers', marker=dict(symbol='circle'))# 标出最大夏普比率组合(市场组合)
fig.add_scatter(mode='markers',x=[100*portfolio_status(opt_sharpe['x'])[1]],  #[1]为volsy=[100*portfolio_status(opt_sharpe['x'])[0]],  #[0]为retsmarker=dict(color='Blue', size=14, symbol='square'),name = '市场组合').update(layout_showlegend=False)# 标出最小方差(波动率)组合
fig.add_scatter(mode='markers',x=[100*portfolio_status(opt_var['x'])[1]],  #[1]为volsy=[100*portfolio_status(opt_var['x'])[0]],  #[0]为retsmarker=dict(color='Red', size=14, symbol='square'),name = '最小波动率组合').update(layout_showlegend=False)fig.update_xaxes(showspikes=True)
fig.update_yaxes(showspikes=True)

最后可视化结果如下其中红色方块和蓝色方块分别为最小波动率组合和最大夏普比率组合所在的位置

投资组合--最优化求解(Python)相关推荐

  1. 最优化算法python实现篇(4)——无约束多维极值(梯度下降法)

    最优化算法python实现篇(4)--无约束多维极值(梯度下降法) 摘要 算法简介 注意事项 算法适用性 python实现 实例运行结果 算法过程可视化 摘要 本文介绍了多维无约束极值优化算法中的梯度 ...

  2. 最优化算法python实现篇(3)——无约束一维极值(黄金分割法)

    最优化算法python实现篇(3)--无约束一维极值(黄金分割法) 算法适用问题 python实现 示例运行结果 算法适用问题 搜索给定单峰区间的极值问题,一般对凸优化问题比较适用. python实现 ...

  3. 最优化算法python实现篇(2)—无约束一维极值(二分法)

    最优化算法python实现篇(2)--无约束一维极值(二分法) 算法适用问题 python实现 示例运行结果 算法适用问题 搜索给定单峰区间的极值问题,一般对凸优化问题比较适用. python实现 # ...

  4. SciPy 非线性方程求解 | Python技能树征题

    SciPy 非线性方程求解 | Python技能树征题 0. 前言 1. 第 1 题:一元非线性方程求解 2. 第 2 题:非线性方程组求解 试题代码地址 0. 前言 在自然科学和工程学科中,许多系统 ...

  5. python有效边界_Markowitz有效边界和投资组合优化基于Python(附代码)

    原标题:Markowitz有效边界和投资组合优化基于Python(附代码) 本期作者:Bernard Brenyah 本期翻译:Barry 未经授权,严禁转载 哈里马科维茨对金融和经济学的世界的贡献是 ...

  6. Matlab做投资组合最优化

    数据下载 https://download.csdn.net/download/moser_freshman/12301019 #Matlab做投资组合最优化 %% zuiyouhau.mat存放3只 ...

  7. python求解非线性多元方程_求解python中的colebrook(非线性)方程

    我想在MATLAB中的python what this guy did中做 . 我已经安装了anaconda,所以我有numpy和sympy库 . 到目前为止,我已尝试使用numpy nsolve,但 ...

  8. 运筹优化(十六)--排队论基础及其最优化求解

    排队过程的一般表示 下图1就是排队过程的一般模型.各个顾客由顾客源(总体)出发,到达服务机构 (服务台.服务员)前排队等候接受服务, 服务完成后就离开.排队结构指队列的数目和排列方式 , 排队规则和服 ...

  9. Matlab 最优化求解

    文章目录 @[toc] 1 线性规划 2 非线性规划 3 无约束问题matlab解法 3.1 符号解 3.2 数值解 4 求解零点与方程组的解 4.1 多项式 4.2 符号解 4.3 数值解 4.4 ...

最新文章

  1. 新年来临,给大家送上机器学习,人工智能相关书籍,这可能是中奖率最高的一次送书活动...
  2. shell+中sum的用法_shell高级用法
  3. 深度学习语义分割理论与实战指南
  4. 解除单个文件的与svn服务器的关联
  5. mysql存储引擎的一点学习心得总结
  6. 几何画板手机版_钉钉+几何画板+手写板,网络授课变简单
  7. 【软件项目管理】需求规格说明可以包括系统的运行环境
  8. 算法一看就懂之「 数组与链表 」
  9. Java线程池如何体现自己的用途
  10. html 文件 转换成mp4视频,[swf转视频]一个带有Play播放按钮的swf文件怎么转换成mp4视频...
  11. 用FCM函数实现模糊C均值聚类算法
  12. snmp-cmds:最简单的调用 Net-SNMP 二进制文件作为子进程的库可移植python SNMP 库
  13. 【微服务集成阿里SMS短信服务发送短信】
  14. Telegram被封禁的原因
  15. 七牛云这个API,让我轻松搞定Banner背景自动切换的功能
  16. 计算机用户名大小写,windows计算机名大小写
  17. 线性内插interp1函数用法
  18. 浅谈:支付结算系统的重要性
  19. 2018.电子系统综合设计报告
  20. STM32H743,基于LL库实现adc采样(ADC+DMA+TIM)

热门文章

  1. 【论文笔记】DSCN:基于深度孪生神经网络的光学航空图像变化检测模型
  2. Android Studio Chipmunk 同时打开多个项目的正确方法
  3. 怎么写一个高性能的导出接口
  4. PYTHON菜鸟指导
  5. Lucas定理扩展Lucas
  6. android高德地图demo,Android :高德地图demo
  7. 梅科尔工作室——HarmonyOS应用开发培训第三次作业
  8. 2.8 将一个整型变量的值赋给一个布尔型变量,再将这个布尔型变量的值赋给一个整型变量,得到的值是多少?
  9. 使用git同步本地和线上环境代码
  10. FPGA知识点汇总(verilog、数字电路、时序分析、跨时钟域、亚稳态)