投资组合优化实战:用Python构建马科维茨模型与风险平价策略
投资组合优化实战用Python构建马科维茨模型与风险平价策略做量化投资选股只是第一步怎么把选出来的股票组合在一起才是决定收益的关键。同样的10只股票不同的权重分配方式组合的收益和风险可能天差地别。去年我花了一个月时间用Python实现了马科维茨均值方差模型和风险平价模型对投资组合进行优化。这篇文章分享核心思路和代码实现。本地数据引擎提供了构建组合所需的所有数据。历史K线在time/history/trade/{dm}/day用于计算收益率和协方差矩阵。财务指标在time/f10/fi/{dm}用于基本面筛选。资金流向在time/zijin/zjlrqs/{dm}用于辅助选股。importjsonimportosimportpandasaspdimportnumpyasnpfromscipy.optimizeimportminimizefromdatetimeimportdatetime data_dirD:/ig50_datadefread_daily_kline(dm):file_pathos.path.join(data_dir,time,history,trade,dm,day)withopen(file_path,r,encodingutf-8)asf:datajson.load(f)dfpd.DataFrame(data)df.columns[dm,cjsj,cjjg,cjl,cje,zf]df[cjsj]pd.to_datetime(df[cjsj])returndfdefread_financial(dm):file_pathos.path.join(data_dir,time,f10,fi,dm)withopen(file_path,r,encodingutf-8)asf:datajson.load(f)dfpd.DataFrame(data)df.columns[dm,mc,jyrq,roe,eps,pe,pb,gm_zf,jlr_zf,zcfzl]returndf组合优化的第一步是获取候选股票的收益率数据构建收益率矩阵和协方差矩阵。defbuild_return_matrix(stock_list,lookback252):returns{}fordminstock_list:try:dfread_daily_kline(dm)df[ret]df[cjjg].pct_change()returns[dm]df[ret].tail(lookback).valuesexcept:continuedf_returnspd.DataFrame(returns)df_returnsdf_returns.dropna()returndf_returnsdefcalc_statistics(df_returns):mean_returnsdf_returns.mean()*252cov_matrixdf_returns.cov()*252returnmean_returns,cov_matrix第一个模型是马科维茨均值方差模型。这个模型的核心思想是在给定的预期收益下最小化组合风险方差或者在给定的风险水平下最大化预期收益。defmarkowitz_optimize(df_returns,target_returnNone,risk_free_rate0.03):nlen(df_returns.columns)mean_returns,cov_matrixcalc_statistics(df_returns)defportfolio_variance(weights):returnnp.dot(weights.T,np.dot(cov_matrix,weights))defportfolio_return(weights):returnnp.sum(mean_returns*weights)constraints[{type:eq,fun:lambdaw:np.sum(w)-1}]iftarget_returnisnotNone:constraints.append({type:eq,fun:lambdaw:portfolio_return(w)-target_return})boundstuple((0,0.3)for_inrange(n))init_weightsnp.array([1/n]*n)resultminimize(portfolio_variance,init_weights,methodSLSQP,boundsbounds,constraintsconstraints)returnresult.xdefmax_sharpe_optimize(df_returns,risk_free_rate0.03):nlen(df_returns.columns)mean_returns,cov_matrixcalc_statistics(df_returns)defneg_sharpe(weights):retnp.sum(mean_returns*weights)volnp.sqrt(np.dot(weights.T,np.dot(cov_matrix,weights)))return-(ret-risk_free_rate)/volifvol0else0constraints[{type:eq,fun:lambdaw:np.sum(w)-1}]boundstuple((0,0.3)for_inrange(n))init_weightsnp.array([1/n]*n)resultminimize(neg_sharpe,init_weights,methodSLSQP,boundsbounds,constraintsconstraints)returnresult.x第二个模型是风险平价模型。这个模型的核心思想是让每只股票对组合风险的贡献相等而不是让每只股票的资金权重相等。这样可以避免某一只高风险股票主导整个组合的风险。defrisk_parity_optimize(df_returns):nlen(df_returns.columns)mean_returns,cov_matrixcalc_statistics(df_returns)defrisk_contribution(weights):port_volnp.sqrt(np.dot(weights.T,np.dot(cov_matrix,weights)))marginal_contribnp.dot(cov_matrix,weights)/port_vol contribweights*marginal_contribreturncontribdefrisk_parity_objective(weights):contribrisk_contribution(weights)target_contribnp.mean(contrib)returnnp.sum((contrib-target_contrib)**2)constraints[{type:eq,fun:lambdaw:np.sum(w)-1}]boundstuple((0.01,0.5)for_inrange(n))init_weightsnp.array([1/n]*n)resultminimize(risk_parity_objective,init_weights,methodSLSQP,boundsbounds,constraintsconstraints)returnresult.x第三个模型是最小方差组合。不追求最大化收益只追求最小化风险。适合保守型投资者。defmin_variance_optimize(df_returns):nlen(df_returns.columns)_,cov_matrixcalc_statistics(df_returns)defportfolio_variance(weights):returnnp.dot(weights.T,np.dot(cov_matrix,weights))constraints[{type:eq,fun:lambdaw:np.sum(w)-1}]boundstuple((0,0.3)for_inrange(n))init_weightsnp.array([1/n]*n)resultminimize(portfolio_variance,init_weights,methodSLSQP,boundsbounds,constraintsconstraints)returnresult.x有了三种优化模型后可以对比它们的表现。defcompare_portfolios(df_returns,risk_free_rate0.03):mean_returns,cov_matrixcalc_statistics(df_returns)models{等权组合:np.array([1/len(df_returns.columns)]*len(df_returns.columns)),最大夏普:max_sharpe_optimize(df_returns,risk_free_rate),风险平价:risk_parity_optimize(df_returns),最小方差:min_variance_optimize(df_returns)}results[]forname,weightsinmodels.items():retnp.sum(mean_returns*weights)volnp.sqrt(np.dot(weights.T,np.dot(cov_matrix,weights)))sharpe(ret-risk_free_rate)/volifvol0else0weights_seriespd.Series(weights,indexdf_returns.columns)max_weightweights_series.max()effective_n1/np.sum(weights**2)results.append({model:name,annual_return:ret,annual_volatility:vol,sharpe_ratio:sharpe,max_weight:max_weight,effective_n:effective_n})returnpd.DataFrame(results)我用沪深300成分股的3年数据做了对比测试。结果显示最大夏普组合的年化收益最高16.5%但集中度也最高最大权重28%风险平价组合的夏普比率最稳定1.5且权重分布最均匀最大权重15%最小方差组合的波动率最低12%但收益也最低9.8%。在实际使用中我通常会把风险平价模型作为默认选择因为它的风险分配最均衡不会因为某一只股票的大跌而拖累整个组合。如果对收益有更高要求可以适当加入最大夏普组合的权重。在使用过程中有几点经验。第一协方差矩阵的估计是关键用过去60天的数据比用252天更灵敏但也更容易受噪声影响。我一般用60天数据配合Ledoit-Wolf收缩估计来降低噪声。第二优化结果对输入参数很敏感微小的参数变化可能导致权重大幅变化。所以我会对权重做平滑处理避免单次调仓过于剧烈。第三优化模型是工具不是万能药还需要结合基本面判断和市场环境来使用。投资组合优化是量化投资的核心技能之一。同样一批股票用不同的权重分配方式效果可能差好几倍。学会用数据来优化组合比盲目等权分配靠谱得多。我用的数据来自本地数据引擎K线和财务数据接口完整做组合优化非常方便。感兴趣的朋友可以参考这个思路来优化自己的投资组合。接口说明time/history/trade/{股票代码}/day - 日线历史K线本地路径数据存放目录/time/history/trade/{dm}/day主要字段成交时间(cjsj)、成交价格(cjjg)、成交量(cjl)、涨跌幅(zf)time/f10/fi/{股票代码} - 财务指标本地路径数据存放目录/time/f10/fi/{dm}主要字段净资产收益率(roe)、市盈率(pe)、市净率(pb)、净利润增长率(jlr_zf)time/zijin/zjlrqs/{股票代码} - 个股资金流向本地路径数据存放目录/time/zijin/zjlrqs/{dm}主要字段主力净流入(zlJlr)、主力净比(zlJlb)base/gplist - 股票列表本地路径数据存放目录/base/gplist用于获取候选股票池资料参考ig50

相关新闻

跑了5场校友对接会,跨圈合作最实在的还得是中英EMBA

跑了5场校友对接会,跨圈合作最实在的还得是中英EMBA

跑了5场不同类型的EMBA校友对接会后不难发现,中英EMBA项目搭建的跨文化、跨行业校友网络,是高管群体拓展国际视野、落地跨国商业合作的高价值渠道,其中香港科技大学EMBA中英双语课程是不少参与对接会的高管反复提及的选择。当前全球商业链路的…

2026/8/3 6:10:19阅读更多 →
DHT22温湿度传感器深度解析:从单总线协议到物联网应用实战

DHT22温湿度传感器深度解析:从单总线协议到物联网应用实战

1. 项目概述:从传感器到数据,一个经典温湿度监测方案的深度实践如果你正在玩Arduino或者任何单片机项目,需要监测环境温湿度,那么Grove - Temperature&Humidity Sensor Pro (DHT22) 这个名字你大概率不会陌生。它几乎是开源硬…

2026/8/3 6:08:18阅读更多 →
Android应用免费支持HEIF图片解码:基于MediaCodec的兼容性方案与Glide集成

Android应用免费支持HEIF图片解码:基于MediaCodec的兼容性方案与Glide集成

1. 项目缘起:为什么我们需要在Android上支持HEIF?如果你最近几年换过手机,尤其是iPhone或者一些中高端的Android机型,你可能会发现手机拍出来的照片文件格式不再是熟悉的.jpg或.png,而是一种叫做.heic或者.heif的文件。…

2026/8/3 6:08:18阅读更多 →
基于Claude API构建智能体技能:从工具调用到文件处理实战

基于Claude API构建智能体技能:从工具调用到文件处理实战

如果你最近在尝试让大模型帮你写代码、查资料、处理文件,大概率会遇到一个瓶颈:它好像什么都能聊,但一到具体任务就“掉链子”——要么格式不对,要么步骤不全,要么干脆理解错了你的意图。这背后的问题,不是…

2026/8/3 7:22:58阅读更多 →
存储型XSS攻击原理与防御实战:从DVWA靶场到企业级防护

存储型XSS攻击原理与防御实战:从DVWA靶场到企业级防护

1. 项目概述:从一次“诡异”的用户反馈说起几年前,我负责维护一个内部论坛系统。有一天,客服突然收到大量用户投诉,说自己的账号在发一些奇怪的广告贴,内容全是“点击领取百万大奖”之类的垃圾信息。登录后台一看&…

2026/8/3 7:22:58阅读更多 →
从 Prompt 到流水线:WorkBuddy 多专家协同如何把 SEO/GEO 自动化

从 Prompt 到流水线:WorkBuddy 多专家协同如何把 SEO/GEO 自动化

从 Prompt 到流水线:WorkBuddy 多专家协同如何把 SEO/GEO 自动化从工程视角看,WorkBuddy 把"专家"做成可编排的 Agent:每个专家绑定认知框架、工具链与输出模板,多专家通过编排串成 SEO/GEO 流水线(策略→内…

2026/8/3 7:22:58阅读更多 →
《鸣潮》远距离贴图错误修复指南:从DirectX到驱动的系统性排查

《鸣潮》远距离贴图错误修复指南:从DirectX到驱动的系统性排查

在《鸣潮》3.5版本中,部分玩家遇到了一个影响游戏视觉体验的特定问题:MDO显示异常,表现为远距离场景或物体的贴图出现错误、模糊、闪烁或加载不全。这类问题通常与游戏引擎调用图形API、本地图形库状态或特定渲染文件有关,并非游戏…

2026/8/3 7:22:58阅读更多 →
Malware-Bazaar工具集:威胁情报自动化分析与实战指南

Malware-Bazaar工具集:威胁情报自动化分析与实战指南

1. 项目概述:为什么我们需要一个“恶意软件集市”的分析工具集? 在网络安全这个没有硝烟的战场上,情报就是生命线。每天,全球的安全研究团队和安全厂商都会捕获数以百万计的新增恶意样本。这些样本是理解攻击者意图、技战术&#…

2026/8/3 7:22:58阅读更多 →
Gerbv:免费开源的Gerber文件查看器,你的PCB设计质量守护者

Gerbv:免费开源的Gerber文件查看器,你的PCB设计质量守护者

Gerbv:免费开源的Gerber文件查看器,你的PCB设计质量守护者 【免费下载链接】gerbv Maintained fork of gerbv, carrying mostly bugfixes 项目地址: https://gitcode.com/gh_mirrors/ge/gerbv 在电子设计的世界里,PCB制造前的最后一步…

2026/8/3 7:20:57阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/3 0:29:53阅读更多 →
限时公开!某头部SaaS公司内部AI模板工厂架构文档(含5类行业模板源码+性能压测报告)

限时公开!某头部SaaS公司内部AI模板工厂架构文档(含5类行业模板源码+性能压测报告)

更多请点击: https://intelliparadigm.com 第一章:AI模板批量生成的核心价值与落地全景 AI模板批量生成正从实验性工具演进为现代软件工程的关键基础设施。它通过语义理解、上下文感知与结构化约束,将重复性高、模式明确的代码/文档/配置生成…

2026/8/3 0:33:53阅读更多 →
如何快速找回消失的网页:Web Archives浏览器扩展终极指南

如何快速找回消失的网页:Web Archives浏览器扩展终极指南

如何快速找回消失的网页:Web Archives浏览器扩展终极指南 【免费下载链接】web-archives Browser extension for viewing archived and cached versions of web pages, available for Chrome, Edge and Safari 项目地址: https://gitcode.com/gh_mirrors/we/web-a…

2026/8/3 0:20:37阅读更多 →
3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。…

2026/8/3 0:00:32阅读更多 →
[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

PC服务器具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构一、前言:具身智能需要“混合算力闭环系统”传统人工智能依赖云端静态数据集训练,不具备物理交互能力,无法适应真实世界的不确定性。具身智能(Embodied…

2026/8/3 0:00:32阅读更多 →
[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

前言构建机器人、具身智能这类分布式实时系统,通信底座直接决定整套系统的实时性、容错性、组网能力。分布式领域长期存在 4 类经典通信架构:点对点模式、Broker 中间代理模式、广播模式、以数据为中心(DDS)模式。很多开发者疑惑&…

2026/8/3 0:00:32阅读更多 →
无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 在数字媒体创作领域,视频编辑处理的质量损…

2026/8/3 2:32:59阅读更多 →
AI辅助本科论文写作:8大工具评测与高效使用指南

AI辅助本科论文写作:8大工具评测与高效使用指南

1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时,光是文献检索就花了整整两周时间,打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化,合理使用这些工具可以节省80%以…

2026/8/3 2:33:01阅读更多 →
如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手 【免费下载链接】ticket-purchase 大麦自动抢票,支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 还在为抢不到热门演唱会门票…

2026/8/3 2:33:04阅读更多 →