【邢不行|量化小讲堂系列13-Python量化入门】诺奖得主的仓位分配算法,有效吗?

本文主要是介绍【邢不行|量化小讲堂系列13-Python量化入门】诺奖得主的仓位分配算法,有效吗?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

引言:

邢不行的系列帖子“量化小讲堂”,通过实际案例教初学者使用python进行量化投资,了解行业研究方向,希望能对大家有帮助。

【历史文章汇总】请点击此处

【必读文章】EOS期现套利,一周时间,15%无风险收益

                     10年400倍策略分享(附视频逐行代码讲解)

个人微信:xbx9585,有问题欢迎交流。


诺奖得主的仓位分配算法,有效吗?

假设你有1千万准备投资股票,你从A股接近3000只股票当中挑选出了50只,准备把这50只股票作为一个投资组合打包购买。那么在这50只股票之间应该如何分配仓位才是最好的呢?是平均每个股票各买20万,还是有的股票多买点有的股票少买点?

如何在这些股票之间分配仓位?这个问题就是诺贝尔奖得主马克维茨(Harry Markowitz)在1952年通过数学方法解决的问题。他也为此而拿到了诺贝尔奖。

马克维茨提出的解决方案叫做资产组合理论。感兴趣的可以看看附件中的论文原文,也可以看又一斋主的这篇文章《马克维茨与投资组合理论》。

本文的主要目是和大家分享如何使用Python在A股市场实证资产组合理论。所以在这里简单的讲一下理论的具体原理。会尽量写的浅显,目标是让高中生也可以看懂。建议感兴趣的同学可以先看本篇文章,大概了解后再去阅读又一斋主的文章。


—策略介绍—

资产组合理论

假设现在有3只股票A、B、C。股票A,在一年后有一半概率上涨20%,一半的概率上涨10%。它的期望收益是15%(计算方法:20% 0.5 + 10% 0.5);股票B在一年后有一半概率上涨60%,一半概率下跌20%,期望收益20%;股票C有一半概率上涨100%,一半概率下跌50%,期望收益25%。具体如下:

在这三个股票中选择一个股票进行买卖,你会选择哪个呢?我觉得选择任何股票都是正常的。选择股票A的人比较保守,虽然赚的少一点,但是毕竟任何情况下都是稳赚(风险小)。选择股票B的话,差的情况下也就亏20%,好得情况下可以赚60%,相当高的收益了。选择股票C的人其实也能理解,毕竟富贵险中求(风险大),虽然可能亏一半,但是翻倍的诱惑还是巨大的。汝之蜜糖彼之砒霜,适合自己的才是最好的。

在从这3个股票当中进行选择的时候,你有没有发现其实你是在权衡每个股票的收益和风险。我们往往希望收益越高越好,风险越低越好。然而金融领域自打有宇宙以来的第一定律就是高收益和低风险不可兼得。收益高,往往风险也高,风险低往往收益也就低了。人生又何尝不是如此呢?所以我们只能根据自己的偏好在收益和风险之间进行权衡。那用什么方式来定量化的刻画股票的风险呢?——用方差。

对,就是初中课堂上学习过的方差。方差用来描述一组数据之间的离散程度,而收益的离散程度就是风险。比如对于股票A,它的方差就是[(0.2 – 0.15)^2 + (0.1 – 0.15)^2] / 2 = 0.0025。同理,股票B和股票C的方差分别是0.16和0.5625。股票的风险越大,它的方差也就越大,反之,方差大说明这个股票的风险也大。

了解了方差之后,我们回到从3个股票当中选择一个进行投资的话题上来。我估计大多数人会选择B股票,冒着亏不多钱的风险,赚取60%的收益。

这时候有的聪明人就会说,我能不能这样来投资:我将所有的钱平均分成两份,一份全部买股票A,一份全部买C形成一个组合,这个组合里面有A、C两只股票,那么这整个组合一年后的期望收益是20%,跟股票B是一样的,而我一年后收益的可能性是:

  • 25%的概率上涨60%(A涨20%,C涨100%)
  • 25%的概率上涨55%(A涨10%,C涨100%)
  • 25%的概率下跌15%(A涨20%,C跌50%)
  • 25%的概率下跌20%(A涨10%,C跌50%)

收益的方差是0.14125,比股票B的方差0.16小。也就是说我通过构建了一个组合,得到了一个和B期望收益一样,但是风险比B小的投资。相比于这个投资组合,全仓买股票B显然就是一个很蠢的选择。

更聪明的人这个时候又要问了:刚刚是在A、C两只股票里面平均分配50%的仓位购进组合,那么是不是存在另外的一种分配方式,使得这个组合在20%的期望收益下,风险(方差)可以更小呢?或者说我想要的期望收益是25%,怎么在3只股票里面分配仓位,保证组合方差最小呢?或者说我想要0.1的方差,怎么在3只股票里面分配仓位,保证我组合的期望收益最大呢?(感兴趣的话真的可以动笔算算,很有意思。)

其实以上这些就是马克维茨想要解决的问题:怎么才能在一堆股票当中通过分配仓位,来使整个组合的期望收益尽可能的高,风险(方差)尽可能的低。或者说,在一定的期望收益下,风险尽可能的低;在一定的风险条件下,期望收益尽可能的高。

这时候你可能会讲:这看上去也没什么难度嘛,就算是离诺奖无穷远的我,即使多花点时间也能算出最优的仓位呀。是的,以上的计算确实并不复杂。因为,因为,因为——

因为我们在计算当中想当然的多增加了一个条件:我们假设这些股票之间的收益是相互独立的。也就是股票和股票之间的收益不会相互影响。

然而现实中所有股票之间的收益都是相关的啊!!!

工商银行上涨的时候,农业银行大概率也会上涨吧?京东股票涨得时候,阿里的股票有可能会跌吧?2015年7月份千股跌停、千股涨停等现象,这些都是在说明股票之间会有相关性。所以上面A、B、C三只股票的问题,可能会变成股票A上涨的时候,股票B也有80%的概率上涨;股票A上涨的时候,股票C却有60%的概率下跌……这个时候想要算出个最优仓位比例,就比较麻烦了吧?

而人家马克维茨牛逼就牛逼在,即使考虑到股票之间的相关性,他也找到了计算的方法。

他使用相关系数来衡量股票之间的相关性。相关系数的取值范围是-1到1,越接近1代表这两个股票的收益越正相关(工行和农行),越接近-1代表这两个股票的收益越负相关(阿里和京东),接近0则代表不相关。他假设已知N个股票未来一段时间的期望收益、收益的方差,以及这些股票两两之间的相关系数,仅仅知道这些,就可以计算出最优的仓位比例,来保证我们的投资组合获得尽可能高的收益以及相应尽可能低的风险。

人家具体怎么算的我就不细说了,是个纯数学问题,归根到底是一个标准的凸二次规划问题。具体可以看论文原文或者又一斋主的文章。本文重点关注的是如何将马克维茨的理论真正的投入到实战中去。


—实战—

要把马克维茨的方案运用到投资实战中,最大的难点就是要确定模型的输入参数。必须得知道这些股票的期望收益、方差以及两两间的相关系数才能计算最终的仓位啊,可是到底怎么才能知道股票未来一年的期望收益、方差、以及相关系数呢?(这几乎不可能嘛)

实战中一般的做法就是拿股票过去一段时间的收益来估计这些参数。落实到具体的策略,我们是采用如下方法来构建的:在每月的最后一个交易日收盘后,根据过去6个月(这个数字可以自己设定)的历史数据计算出每个备选股票的收益、方差、相关系数,将这些数据作为参数,套入到马克维茨的方法中,计算出每个股票的最优仓位。按计算出来的仓位买入这些股票并持有整个下个月,在下月末再按照该方法,根据最新的过去6个月的数据重新计算仓位,进行调整,再持有一个月,如此往复。

其中,在采用马克维茨的方法计算最优仓位的时候,我们的优化目标是最优夏普比例,也就是最大化期望收益/方差。在程序中也可以调整为最优收益或者最优方差。

为了方便起见,我们以沪深300指数,中小板指数,还有创业板指数为例,假设我们是要投资这3个指数,并在这3个指数之间分配仓位。当然在程序中你也可以自己通过修改代码来尝试在更多的股票、指数之间进行分配仓位。

—程序—

要用三大指数构造投资组合,首先需要指数的原始数据。在yucezhe.com的历史日线数据中,可以下载到所有指数历史至今的数据。如下图所示,每一行是每一天的数据:

数据中有以下的字段:
【index_code】指数的代码
【date】 交易日期
【open】 开盘价
【high】 最高价
【low】 最低价
【close】 收盘价
【volume】 成交量
【money】 成交额
【change】 涨跌幅


下面是代码的截图,代码里面有详细的注释,有问题可以留言,需要代码可以加我微信xbx9585索要。

 

 

 

 

把代码和数据下载下来,运行代码,就可以看到输出的结果了。

 

数据的回测是从2011年开始的(因为创业板指数开始时间较晚)。从结果中可以看到,通过马克维茨的方法构建的投资组合的年化收益率是高于沪深300、中小板指数,但低于创业板指数。在风险方面,由于是采用的最大化夏普比的方法,所以最大回撤还是略大于沪深300和中小板的。

大家下载程序后,可以把3个指数改成其他的股票,尝试着在不同的股票之间进行仓位的配置,看看效果。

思考题:

是否能搞到余额宝的每日收益率,作为无风险利率,也作为组合中的一个备选资产。这样就能算出投资股票和投资余额宝的仓位比例的。

对本文研究有自己的想法的朋友,欢迎在评论区留言。关于文中的代码、数据,以及下期《量化小讲堂》想了解的内容,也可以加我个人微信xbx9585交流。

如果你想入门量化,但是始终找不到方向,可以加入我的知识星球。我会在里面解答你的问题,分享我的感悟,不论是投资、技术,还是职业选择、思维方式。 

                                                                         -- 学习和成长从来都不是一个人的事 --

 

这篇关于【邢不行|量化小讲堂系列13-Python量化入门】诺奖得主的仓位分配算法,有效吗?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/702673

相关文章

使用Python绘制蛇年春节祝福艺术图

《使用Python绘制蛇年春节祝福艺术图》:本文主要介绍如何使用Python的Matplotlib库绘制一幅富有创意的“蛇年有福”艺术图,这幅图结合了数字,蛇形,花朵等装饰,需要的可以参考下... 目录1. 绘图的基本概念2. 准备工作3. 实现代码解析3.1 设置绘图画布3.2 绘制数字“2025”3.3

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python

python 字典d[k]中key不存在的解决方案

《python字典d[k]中key不存在的解决方案》本文主要介绍了在Python中处理字典键不存在时获取默认值的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录defaultdict:处理找不到的键的一个选择特殊方法__missing__有时候为了方便起见,

使用Python绘制可爱的招财猫

《使用Python绘制可爱的招财猫》招财猫,也被称为“幸运猫”,是一种象征财富和好运的吉祥物,经常出现在亚洲文化的商店、餐厅和家庭中,今天,我将带你用Python和matplotlib库从零开始绘制一... 目录1. 为什么选择用 python 绘制?2. 绘图的基本概念3. 实现代码解析3.1 设置绘图画

Python pyinstaller实现图形化打包工具

《Pythonpyinstaller实现图形化打包工具》:本文主要介绍一个使用PythonPYQT5制作的关于pyinstaller打包工具,代替传统的cmd黑窗口模式打包页面,实现更快捷方便的... 目录1.简介2.运行效果3.相关源码1.简介一个使用python PYQT5制作的关于pyinstall

使用Python实现大文件切片上传及断点续传的方法

《使用Python实现大文件切片上传及断点续传的方法》本文介绍了使用Python实现大文件切片上传及断点续传的方法,包括功能模块划分(获取上传文件接口状态、临时文件夹状态信息、切片上传、切片合并)、整... 目录概要整体架构流程技术细节获取上传文件状态接口获取临时文件夹状态信息接口切片上传功能文件合并功能小

python实现自动登录12306自动抢票功能

《python实现自动登录12306自动抢票功能》随着互联网技术的发展,越来越多的人选择通过网络平台购票,特别是在中国,12306作为官方火车票预订平台,承担了巨大的访问量,对于热门线路或者节假日出行... 目录一、遇到的问题?二、改进三、进阶–展望总结一、遇到的问题?1.url-正确的表头:就是首先ur

基于Python实现PDF动画翻页效果的阅读器

《基于Python实现PDF动画翻页效果的阅读器》在这篇博客中,我们将深入分析一个基于wxPython实现的PDF阅读器程序,该程序支持加载PDF文件并显示页面内容,同时支持页面切换动画效果,文中有详... 目录全部代码代码结构初始化 UI 界面加载 PDF 文件显示 PDF 页面页面切换动画运行效果总结主