从均值方差到有效前沿

2023-11-18

这篇文章的主要目的是介绍有效前沿这个理论工具和分析框架。我们由均值方差分析展开,逐步推演到有效前沿。然后,我们又说到有效前沿在投资或者量化中的应用场景,最后我们也总结了有效前沿的一些问题,尤其是敏感性问题。在教程中,特意加入了一些实验代码,可以让大家在阅读的过程中有更好的理解。

有效前沿

说到有效前沿(有些叫效率边界),就要提到马科维茨的投资组合理论了。

首先介绍下它的三大假设:

单一投资期,比如一年
流动性很高,无交易成本
投资者的选择基于最优均值方差
于是,我们可以开始推导有效前沿,在这之前,我们先约定一些数学符号:

  • rf:无风险利率
  • μ:风险资产预期收益率向量
  • f:风险资产预期超额收益率向量,即μ−rfμ−rf
  • Σ:风险资产协方差矩阵
  • w:风险资产组合权重向量

我们采用三个步骤来得到我们的有效市场前沿,分别是最小方差组合、最优均值方差组合(夏普组合)以及有效前沿。当我们推导完,大家就会发现有效前沿与前两个组合之间存在有趣的关系,最后我们将用python代码的方式来实现并检验我们得到的结果。

在下面我们模拟了三个风险资产,并用python画出了有效前沿曲线。图1还标注了最小方差组合(C组合)、最优夏普组合(Q组合)以及全额等权组合(E组合)。
图1
图1

有效前沿的应用

有效前沿曲线告诉我们,在全额投资的条件下,所有基于风险厌恶型的投资者都应该选择有效前沿曲线上投资组合,它们是均值方差最优的。那么这个理论工具怎么能够帮助我们做投资决策呢?

首先我们应用这个理论工具的基本条件是要有市场中所有风险资产或者可投资风险资产的预期收益率和预期协方差矩阵。但是这个可能就是最大的问题,怎么定义预期收益率和预期协方差矩阵?如果用一致预期(基于券商分析师的调查)代表市场对某风险资产的预期的话,并不是所有风险资产都能够有一致预期数据,另外也不太可能有一致预期协方差吧。还有一种解释,就是基于个人投资者的预期或者信念,这种方式和一致预期一样,至少都假设预期或者预测是无偏的或者很小,实际中难以做到,同时对于庞大的协方差矩阵也没有办法(协方差矩阵需要估计2/N(N+1)个参数)。那么,最后就只剩下用历史数据经验估计了,这也带来了一定的问题,股票市场是动态的,历史不一定代表未来;这还不是最大的问题,最大的问题是当估计协方差矩阵时,在实际中往往超出了我们的计算能力,而且估计所带来的误差也让后验协方差矩阵失去意义。

当然,后面的CAPM模型从某种角度拯救了它。不过,当前我们先不讨论CAPM,把话题回到量化交易上。当我们开发一个策略时(为方便分析,这里的策略假设投资决策都是固定投资期,比如一年或一个月换仓),一般都会有预测模型,对每一次资产标的做收益预测,然后我们可能会全额等额购买top10,或者根据一个固定的仓位规则。然而,有效前沿告诉我们,这种策略往往不是最优的,哪怕你的预测模型做得再好。在均值方差的框架下,你应该根据你的预测收益向量和协方差估计(往往基于后验统计),选择位于有效前沿上的组合。尤其是在有一些证券池数量不多的策略中,这种资产配置方法是实际可行的。

在下面的实验中,我们模拟了三组风险资产,他们的收益率和价格序列可以从图2的上面两个图中看到。我们对这三个资产只知道他们的收益率和价格,其他的都不可观测。然后有一个预测模型,那就是下一个周期的预测收益率等于近20期的平均值,即20期滑动平均,同时我们在图中添加了预测值和95%的置信区间。我们的策略就是全额等额买入预测收益率前50%的资产,在这个例子里就是排名前两个的资产,实际上这是一个完整的策略,有预测模型、选股模型以及仓位策略。在下左图,我们画出了这个场景下的有效前沿,其中黑色的点就是我们的策略组合(S组合),我们可以看到它并不在我们的有效前沿上,并且是否位于有效前沿,和我们的预测模型没有关系,完全取决于组合管理,或者说就是我们的头寸策略。右下图更能说明这一点,我们对这个策略向后模拟100个时间周期,并模拟了200次循环,从而得到关于S组合与Q组合的夏普比率分布,从这个箱型图中我们可以看到Q组合的夏普比率明显高于S组合。
在这里插入图片描述
图2

有效前沿的敏感性

下图是基于前面那个案例的预测有效前沿(上面的左下图)做了一个蒙特卡洛模拟从而得到的后验分布(方便点的话,理论上可以得到有效前沿的抛物线解析表达式,从而直接得到置信区间)。具体的,我们根据之前的资产收益率和协方差的估计,作为我们风险资产的后验分布,然后我们根据资产后验分布模拟得到一组序列,并通过这组序列得到我们的有效前沿样本集。

我们看到,我们的有效前沿模拟样本分布在一个较“宽阔”的区间,问题我们想知道这个估计误差会对我们的投资决策产生什么样的重要影响?于是,在下图中还添加了Q、C的样本集。我们观察到,它们共同的特征是在估计方差上的离散程度远大于估计收益率的离散程度。而Q组合最终要的性质莫过于与CML资本市场线相切(不展开,在下次的教程中会有更详细介绍),不用可视化我们也能看出来将会对CML曲线造成非常大的影响,即CML对Q组合非常敏感。

我们上述分析揭示了有效前沿的敏感性问题,但并不是说我们要抛弃这个工具。基于有效前沿做组合优化,选择有效前沿上的资产组合仍然是一个明智的选择。因为不管有效前沿有多敏感,我们的估计误差已经 深入到资产预测与资产配置的整个流程当中,抛弃或偏离有效前沿工具并不能缩小我们的估计误差,并且偏离有效前沿的组合会在概率意义上始终劣于有效前沿上的组合。
在这里插入图片描述
图3

完整策略实验

在下面实现了一个完整的交易策略,因为回测平台暂不支持做空(注:即将上线的新版是支持做空的),所以我写了一个简单的策略回测,交易策略细节如下:

  • 股票池:‘601601.SHA’, ‘600030.SHA’, ‘601668.SHA’, ‘600036.SHA’, ‘601098.SHA’
  • 数据时间段:2014-01-01 至 2017-12-30
  • 交易时间段:2016-01-01 至 2017-12-30
  • 数据尺度:月
  • 收益预测:计算5日滑动平均收益率作为下个周期的收益率预测
  • 仓位策略:每个周期期初得到夏普组合权重,然后建仓或者换仓,其中协方差矩阵根据历史数据估计
  • 交易成本:交易成本为每次建仓或调仓的总仓位的1%,在这里包含了交易佣金、手续费、交易滑差等
  • 杠杆/做空:因为是多空策略,所以我们不对做空和杠杆做限制 初始资金:我们假设为1,方便比较

图4开始的两张图展示了当前头寸(基于最新市场数据)的有效前沿及夏普组合权重。我们可以看出对于方差大预期收益小的股票(601601)倾向于给与较小的头寸,对于方差小预期收益大的股票(600030)倾向于给与较大的头寸。
图4

最后图5展示了我们模拟了回测的资金曲线,可以看到夏普组合在收益上要远高于等权组合。
图5

总结

在总结之前,我再重述下有效前沿或者均值方差分析的假设和限制:

  • 我们这里假设的是单期投资的情况,这个假设可以被放宽,大致不影响我们的结论和分析过程;
  • 我们虽然做了无交易成本假设,但是在实践中是需要考虑的,也是可以被建模的;
  • 我们上述分析暗含了自融假设,即可以通过建立空头头寸为多头融资,这个在实践中往往是有限制和不允许的;
  • 交易者是风险厌恶的,只基于均值方差来做投资决策; 假设股票是iid正太分布,这个假设有待商榷;

最后,总结一下我的观点:

  • 有效前沿是有用的工具,所有风险厌恶的投资者都应该考虑它;
  • 有效前沿是均值方差最优的机会集,是最小风险组合与最优夏普组合的线性组合;
  • 有效前沿有敏感性问题,尤其是最优夏普组合的估计误差会对CML及CAPM造成较大影响;
  • 在多资产、多策略的情境下,有效前沿是一个资产配置或者头寸管理的一个较好的出发点;
  • 有效前沿在大量数据、大量资产的情况下,参数估计误差影响非常显著;

开放性问题

真实有效前沿、估计有效前沿与实际有效前沿有什么样的关系或经验规律?
有效前沿要在实践中得到应用需要克服哪些困难?
有效前沿与组合再平衡有哪些权衡因素?

附录

策略完整代码:《从均值方差到有效沿【完整代码版】》

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从均值方差到有效前沿 的相关文章

  • 如何在python中读取多个文件中的文本

    我的文件夹中有许多文本文件 大约有 3000 个文件 每个文件中第 193 行是唯一包含重要信息的行 我如何使用 python 将所有这些文件读入 1 个文本文件 os 模块中有一个名为 list dir 的函数 该函数返回给定目录中所有文
  • 如何在刻度标签和轴之间添加空间

    我已成功增加刻度标签的字体 但现在它们距离轴太近了 我想在刻度标签和轴之间添加一点呼吸空间 如果您不想全局更改间距 通过编辑 rcParams 并且想要更简洁的方法 请尝试以下操作 ax tick params axis both whic
  • 导入错误:没有名为 _ssl 的模块

    带 Python 2 7 的 Ubuntu Maverick 我不知道如何解决以下导入错误 gt gt gt import ssl Traceback most recent call last File
  • 如何打印没有类型的defaultdict变量?

    在下面的代码中 from collections import defaultdict confusion proba dict defaultdict float for i in xrange 10 confusion proba di
  • Python 多处理示例不起作用

    我正在尝试学习如何使用multiprocessing但我无法让它发挥作用 这是代码文档 http docs python org 2 library multiprocessing html from multiprocessing imp
  • pandas 替换多个值

    以下是示例数据框 gt gt gt df pd DataFrame a 1 1 1 2 2 b 11 22 33 44 55 gt gt gt df a b 0 1 11 1 1 22 2 1 33 3 2 44 4 3 55 现在我想根据
  • 打破嵌套循环[重复]

    这个问题在这里已经有答案了 有没有比抛出异常更简单的方法来打破嵌套循环 在Perl https en wikipedia org wiki Perl 您可以为每个循环指定标签 并且至少继续一个外循环 for x in range 10 fo
  • 为 pandas 数据透视表中的每个值列定义 aggfunc

    试图生成具有多个 值 列的数据透视表 我知道我可以使用 aggfunc 按照我想要的方式聚合值 但是如果我不想对两列求和或求平均值 而是想要一列的总和 同时求另一列的平均值 该怎么办 那么使用 pandas 可以做到这一点吗 df pd D
  • 安装后 Anaconda 提示损坏

    我刚刚安装张量流GPU创建单独的后环境按照以下指示here https github com antoniosehk keras tensorflow windows installation 但是 安装后当我关闭提示窗口并打开新航站楼弹出
  • python 集合可以包含的值的数量是否有限制?

    我正在尝试使用 python 设置作为 mysql 表中 ids 的过滤器 python集存储了所有要过滤的id 现在大约有30000个 这个数字会随着时间的推移慢慢增长 我担心python集的最大容量 它可以包含的元素数量有限制吗 您最大
  • Python:字符串不会转换为浮点数[重复]

    这个问题在这里已经有答案了 我几个小时前写了这个程序 while True print What would you like me to double line raw input gt if line done break else f
  • Pandas Dataframe 中 bool 值的条件前向填充

    问题 如何转发 fill boolTruepandas 数据框中的值 如果是当天的第一个条目 True 到一天结束时 请参阅以下示例和所需的输出 Data import pandas as pd import numpy as np df
  • Python 3 中“map”类型的对象没有 len()

    我在使用 Python 3 时遇到问题 我得到了 Python 2 7 代码 目前我正在尝试更新它 我收到错误 类型错误 map 类型的对象没有 len 在这部分 str len seed candidates 在我像这样初始化它之前 se
  • Nuitka 未使用 nuitka --recurse-all hello.py [错误] 编译 exe

    我正在尝试通过 nuitka 创建一个简单的 exe 这样我就可以在我的笔记本电脑上运行它 而无需安装 Python 我在 Windows 10 上并使用 Anaconda Python 3 我输入 nuitka recurse all h
  • 为美国东部以外地区的 Cloudwatch 警报发送短信?

    AWS 似乎没有为美国东部以外的 SNS 主题订阅者提供 SMS 作为协议 我想连接我的 CloudWatch 警报并在发生故障时接收短信 但无法将其发送到 SMS YES 经过一番挖掘后 我能够让它发挥作用 它比仅仅选择一个主题或输入闹钟
  • 从 Python 中的类元信息对 __init__ 函数进行类型提示

    我想做的是复制什么SQLAlchemy确实 以其DeclarativeMeta班级 有了这段代码 from sqlalchemy import Column Integer String from sqlalchemy ext declar
  • 在python中,如何仅搜索所选子字符串之前的一个单词

    给定文本文件中的长行列表 我只想返回紧邻其前面的子字符串 例如单词狗 描述狗的单词 例如 假设有这些行包含狗 hotdog big dog is dogged dog spy with my dog brown dogs 在这种情况下 期望
  • 您可以在 Python 类型注释中指定方差吗?

    你能发现下面代码中的错误吗 米皮不能 from typing import Dict Any def add items d Dict str Any gt None d foo 5 d Dict str str add items d f
  • Spark.read 在 Databricks 中给出 KrbException

    我正在尝试从 databricks 笔记本连接到 SQL 数据库 以下是我的代码 jdbcDF spark read format com microsoft sqlserver jdbc spark option url jdbc sql
  • PyAudio ErrNo 输入溢出 -9981

    我遇到了与用户相同的错误 Python 使用 Pyaudio 以 16000Hz 录制音频时出错 https stackoverflow com questions 12994981 python error audio recording

随机推荐

  • 发小要开商场,让我给写个商场管理系统。报酬就去唱个歌?

    前言 昨天我发小喊我去唱歌 我心想还有这种好事 这铁公鸡平常一毛不拔的 居然还请我唱有陪唱的 那这咱们就拒绝不了啊 刀山火海这都得上啊 话说今天陪唱的小姐姐长的确实还不错 唱了两个小时 发小做我旁边让我帮个忙 我就知道他是无事献殷勤 那没办
  • Java-集合(List接口及其常用的实现子类)

    List接口基本介绍 1 List集合类中元素是有序的 即添加顺序和取出顺序一致 且可以重复 2 List集合类中的每个元素都有其对应的顺序索引 即支持索引 3 List容器中的元素对应一个整数型的序号 记载其在容器中的索引位置 可以根据序
  • C语言:二分法查找

    什么是二分法查找 二分法查找是通过循环平分的方式 来进行查找想要的数或数据 那么 要怎么编写这样的代码呢 首先 要把一系列的数组存入变量当中去 将其当成已知数据 比如将1 10十个数字存到变量中去 就可以写成 然后就要知道 查找数据是通过下
  • Python,使用Anaconda安装Levenshtein,出现: Failed building wheel for xxx错误

    出现原因 缺失相应的whl文件 解决办法 下载并安装对应的whl文件 点击下方链接 即可找到并下载相对应的whl文件 Unofficial Windows Binaries for Python Extension Packages 例如
  • flink学习44:基于行的操作分组和窗口的聚合

  • 华为/华三交换机配置自动备份到FTP/SFTP

    数据通信 建设篇 第一章 华为 华三交换机配置自动备份到FTP SFTP 数据通信 建设篇 下章内容 华为 华三交换机配置自动备份到FTP SFTP 背景介绍 注意事项 华为交换机配置自动备份 新华三交换机配置自动备份 参考来源 下章内容
  • Syslog日志服务器配置 For CentOS 7.8(Syslog+LogAnalyzer+LAMP)

    声明 本教程仅供学习 研究 测试使用 本文作者不承担任何法律责任 本次中央日志服务器采用rsyslog提供日志接收服务 Mariadb作为后端数据库提供日志存储服务 一 安装CentOS 7操作系统 1 CentOS7的操作系统安装过程本文
  • ASP.NET中上传文件到数据库

    介绍 为什么要将文件保存到数据库呢 理由很多 最直接的就是 将文件放入数据库以后 可以对文件进行更好的管理 特别是文本文件 图片等 如果不使用数据库 数量巨大的时候 很难做到有效的管理和区别 特别是需要作一些与文字密切相关的应用的时候 将文
  • Python3使用urllib访问网页

    介绍 改教程翻译自python官网的一篇文档 urllib request是一个用于访问URL 统一资源定位符 的Python模块 它以urlopen函数的形式提供了一个非常简单的接口 可以访问使用多种不同协议的URL 它也提供了一个稍微复
  • 通过Nginx(basic auth)实现Prometheus账号密码登录

    一 原因 因客户Red Hat 7 5服务器安装部署grafana无法添加prometheus数据源 以及无法修改初始密码 为确保环境访问安全 特别研究通过账号密码认证访问prometheus 搜索了很多资料 但都缺这缺那 所以我这里记录下
  • AppStore 提审时的“出口合规证明”处理

    对于加密的管理 Apple不比之前严格了 一般选 否 也能通故审核 每次提交审核的时候都会让确认是否使用了Apple以的加密算法 在窗口提示了我们可以看到 可以在Xcdoe的info plist文件中增加App Uses Non Exemp
  • 众多Android 开源项目推荐,给力工作给力学习

    FBReaderJ FBReaderJ用于Android平台的电子书阅读器 它支持多种电子书籍格式包括 oeb ePub和fb2 此外还支持直接读取zip tar和gzip等压缩文档 项目地址 http www fbreader org F
  • jFinal框架下controller接参

    一 表单参数 1 前端 contentType x www form urlencoded 2 apipost接口测试 3 controller接参 1 注解 getPara获取参数 2 注解 默认参数 若方法的参数名为注解名 则jFina
  • Python 基础知识

    进阶选手 Python 进阶知识 Aimin20210819的博客 关注VXG AIMIN2020 更多 目录 1 Python 是怎么理解 2 Python数据类型 四种数据类型
  • 在Firefox浏览器中导入Burp Suite证书

    在日常的渗透中 经常就是在浏览器用bp来抓包 在配置完浏览器的代理的时候就会涉及CA证书问题 在设置完代理后 再访问百度时 就会出现如下图的问题 第一步 导出证书 打开burp suite 找到 代理 Proxy 在选择 选项 Option
  • 指针加法:c = (int *) ((char *) c + 1)与 c=c+1 的区别

    示例代码 include
  • Qt通过QSttings类读取*.ini配置文件

    目录 ini文件 什么是ini文件 格式 需要的参数 需要了解的API 单例 单线程实例 多线程实例 设计一个读取ini文件的类 AppSettings类 ini文件 什么是ini文件 INI Initialization File 是微软
  • DTO和POJO实体类之间值映射

    package cn test util import java lang reflect Method import java util List public class AutoMapper public static
  • Git:Git中的远程操作和标签管理--分布式版本控制系统

    文章目录 理解分布式版本控制系统 克隆仓库 远程推送 拉取远程仓库 配置Git 标签管理 本篇主要总结关于Git中远程操作的相关事项 理解分布式版本控制系统 在进行远程操作前 首先要理解什么是分布式版本控制系统 理解这个问题时要思考这样的问
  • 从均值方差到有效前沿

    这篇文章的主要目的是介绍有效前沿这个理论工具和分析框架 我们由均值方差分析展开 逐步推演到有效前沿 然后 我们又说到有效前沿在投资或者量化中的应用场景 最后我们也总结了有效前沿的一些问题 尤其是敏感性问题 在教程中 特意加入了一些实验代码