原标题:Markowitz有效边界和投资组合优化基于Python(附代码)

本期作者:Bernard Brenyah

本期翻译:Barry

未经授权,严禁转载

哈里马科维茨对金融和经济学的世界的贡献是怎么强调都不过分的。凭借其于 1952年发表的开创性论文“资产组合选择”,他被广泛的视作现代资产组合理论(MPT)的开拓者。最终在1990年,基于对这一领域的巨大贡献,他获得了诺贝尔经济学奖。

如今,几乎全世界的任何一门商科、金融课程都会教授MPT理论。本文将通过真实的股票数据用python来介绍这一理论的基础和有效前沿的构建。

那么什么是MPT,为什么你要理解它,又怎么用python来实现它呢?

与大多数理论一样,MPT也是建立在对真实世界一些假设之上。对MPT的的解释将从阐述它的基本假设开始:

MPT的假设:

投资者是理性的并且风险厌恶

投资者追求收益最大化

所有投资者都想最大化期望收益

不考虑佣金和税费

所有投资者都可以接触到同样的信息源和与投资决策相关的全部必要信息

投资者可以以无风险利率不受限制的借入和贷出资金

现代资产组合理论是关于在特定风险水平下投资者(风险厌恶)如何构建组合来最大化期望收益的理论。MPT的突破性在于提出不需将众多投资的风险和收益特征孤立分析,而是去研究这些投资如何对组合的表现产生影响。因此,MPT的假设强调投资者只有在可能得到更高期望收益时会有额外风险出现---也就是高风险,高收益。

这一理论最基本的原则是投资者可以构建投资组合的有效集合,即有效前沿。有效前沿可以在特定风险水平下使期望收益最大化。投资者对风险的容忍度将决定他所选择的有效前沿。低容忍度的投资者会选在最低风险下可以提供最大收益的组合,高容忍度的会选择高风险下的可以提供最大收益的组合。可以从下图大致理解有效前沿的概念:

不同的股票组合将产生不同的期望收益。在马科维茨证明了有效前沿之后人们最重要的一个发现是分散化投资的力量。因为组合中资产的相关性和权重可以极大地影响组合收益,所以投资者可以在他们的风险偏好下通过用不同的证券简单地构建组合来实现期望收益最大化。

那么我们该怎么通过python用真实股价数据来建立有效前沿组合呢?

数据获取

importquandl

importpandas aspd

importnumpy asnp

importmatplotlib.pyplot asplt

quandl.ApiConfig.api_key = 'PASTE YOUR API KEY HERE'

selected = ['CNP', 'F', 'WMT', 'GE', 'TSLA']

data = quandl.get_table('WIKI/PRICES', ticker = selected,

qopts = { 'columns': ['date', 'ticker', 'adj_close'] },

date = { 'gte': '2014-1-1', 'lte': '2016-12-31'}, paginate=True)

data.head()

date ticker adj_close

None

02014-01-02CNP 19.290792

12014-01-03CNP 19.282339

22014-01-06CNP 19.307699

32014-01-07CNP 19.510582

42014-01-08CNP 19.307699

接下来是数据处理步骤,我们根据tickers来给调整后的收盘价排序:

clean = data.set_index('date')

table = clean.pivot(columns='ticker')

table.head()

adj_close

ticker CNP F GE TSLA WMT

date

2014-01-0219.29079212.88451124.266002150.1071.343743

2014-01-0319.28233912.94292624.248354149.5671.108673

2014-01-0619.30769913.00134024.054226147.0070.710863

2014-01-0719.51058212.83444224.080698149.3670.927850

2014-01-0819.30769912.96796024.010106151.2870.367299

为了得到有效前沿,我们需要模拟很多的投资组合(50000个)。

port_returns = []

port_volatility = []

stock_weights = []

num_assets = len(selected)

num_portfolios = 50000

forsingle_portfolio inrange(num_portfolios):

weights = np.random.random(num_assets)

weights /= np.sum(weights)

returns = np.dot(weights, returns_annual)

volatility = np.sqrt(np.dot(weights.T, np.dot(cov_annual, weights)))

port_returns.append(returns)

port_volatility.append(volatility)

stock_weights.append(weights)

portfolio = {'Returns': port_returns,

'Volatility': port_volatility}

andweight inthe portfolio

forcounter,symbol inenumerate(selected):

portfolio[symbol+' weight'] = [weight[counter] forweight instock_weights]

df = pd.DataFrame(portfolio)

column_order = ['Returns', 'Volatility'] + [stock+' weight'forstock inselected]

df = df[column_order]

df.head()

Returns Volatility CNP weight F weight WMT weight GE weight TSLA weight

00.0514710.1398100.1932750.1442650.2863150.0379910.338155

10.0980570.2057450.0012200.1929390.2715520.3593630.174927

20.0427830.1602030.2815320.4429860.1642750.0224190.088788

30.0907580.1995140.1130440.3440520.2381660.2938160.010922

40.0531790.1599990.2126430.2833240.0152560.1687720.320006

棒极了!繁琐的步骤现在都已经完成了!我们来看一下有效前沿长什么样:

希望现在你对MPT有了基本的了解!

前面我们了解了资产组合理论(MPT)的基本内容并通过Monte Carlo模拟产生了有效前沿组合。下面我们专注于组合优化的概念。

50000个不同权重的投资组合产生了不同的期望收益和期望波动率。线上的每个点代表了股票的一个最优组合(CenterPoint Energy,Facebook,Walmart,General Electric,Tesla),最优组合在特定的风险水平下最大化了期望收益率。如果有效前沿曲线上的所有点都是最优组合,那么在这些组合中的最优投资组合是什么呢?优中最优组合的选取标准又是什么呢?

另一个诺贝尔奖得主William F. Sharpe 拓展了Markowitz的工作,开发了资本资产定价模型(CAPM)。本文不会设计CAPM,但是我们会用到他的一个成果(Sharpe Ratio)最为选择最优的准则。

夏普比率可以用来衡量特定风险下投资收益的表现。这个比率调整了投资的收益,使我们可以在一定规模风险的情况下比较不同的投资表现。没有规模风险的限制,我们无法比较不同证券组合的收益与风险表现。注:出于简化,本文无风险收益率设为0%。

我们将对上面的代码做一些小改变。我们已经有了模拟出的组合的期望收益率和风险。接下来,我们将计算这些组合的风险调整收益率(借助夏普比率),并且以夏普比率为值画出色标图:

importquandl

importpandas aspd

importnumpy asnp

importmatplotlib.pyplot asplt

quandl.ApiConfig.api_key = 'INSERT YOUR API KEY HERE'

selected = ['CNP', 'F', 'WMT', 'GE', 'TSLA']

data = quandl.get_table('WIKI/PRICES', ticker = selected,

qopts = { 'columns': ['date', 'ticker', 'adj_close'] },

date = { 'gte': '2014-1-1', 'lte': '2016-12-31'}, paginate=True)

clean = data.set_index('date')

table = clean.pivot(columns='ticker')

returns_daily = table.pct_change()

returns_annual = returns_daily.mean() * 250

cov_daily = returns_daily.cov()

cov_annual = cov_daily * 250

port_returns = []

port_volatility = []

sharpe_ratio = []

stock_weights = []

num_assets = len(selected)

num_portfolios = 50000

np.random.seed(101)

forsingle_portfolio inrange(num_portfolios):

weights = np.random.random(num_assets)

weights /= np.sum(weights)

returns = np.dot(weights, returns_annual)

volatility = np.sqrt(np.dot(weights.T, np.dot(cov_annual, weights)))

sharpe = returns / volatility

sharpe_ratio.append(sharpe)

port_returns.append(returns)

port_volatility.append(volatility)

stock_weights.append(weights)

portfolio = {'Returns': port_returns,

'Volatility': port_volatility,

'Sharpe Ratio': sharpe_ratio}

forcounter,symbol inenumerate(selected):

portfolio[symbol+' Weight'] = [Weight[counter] forWeight instock_weights]

df = pd.DataFrame(portfolio)

column_order = ['Returns', 'Volatility', 'Sharpe Ratio'] + [stock+' Weight'forstock inselected]

df = df[column_order]

plt.style.use('seaborn-dark')

df.plot.scatter(x='Volatility', y='Returns', c='Sharpe Ratio',

cmap='RdYlGn', edgecolors='black', figsize=(10, 8), grid=True)

plt.xlabel('Volatility (Std. Deviation)')

plt.ylabel('Expected Returns')

plt.title('Efficient Frontier')

plt.show()

通过上述代码,我们得到了下图:

接着,试着找出最优组合和有着最低波动率的组合(也就是风险厌恶最严重的投资者的偏好组合):

min_volatility = df['Volatility'].min()

max_sharpe = df['Sharpe Ratio'].max()

sharpe_portfolio = df.loc[df['Sharpe Ratio'] == max_sharpe]

min_variance_port = df.loc[df['Volatility'] == min_volatility]

plt.style.use('seaborn-dark')

df.plot.scatter(x='Volatility', y='Returns', c='Sharpe Ratio',

cmap='RdYlGn', edgecolors='black', figsize=(10, 8), grid=True)

plt.scatter(x=sharpe_portfolio['Volatility'], y=sharpe_portfolio['Returns'], c='red', marker='D', s=200)

plt.scatter(x=min_variance_port['Volatility'], y=min_variance_port['Returns'], c='blue', marker='D', s=200)

plt.xlabel('Volatility (Std. Deviation)')

plt.ylabel('Expected Returns')

plt.title('Efficient Frontier')

plt.show()

接下来输出这两个特殊组合的具体信息:

print(min_variance_port.T)

print(sharpe_portfolio.T)

17879

Returns 0.045828

Volatility 0.138552

Sharpe Ratio 0.330761

CNP Weight 0.240327

F Weight 0.104659

WMT Weight 0.257760

GE Weight 0.001487

TSLA Weight 0.395767

31209

Returns 0.116145

Volatility 0.175045

Sharpe Ratio 0.663514

CNP Weight 0.372890

F Weight 0.008482

WMT Weight 0.404987

GE Weight 0.211450

TSLA Weight 0.002190

风险厌恶最严重的投资者将会选择最小方差组合,它的期望收益率是4.58%,期望波动率是13.86%。追求最大风险调整收益率的投资者将会构建有着最大夏普比率的投资组合,它的期望收益率是11.61%,期望波动率是17.50%。

通过一些优化的数学技巧也可以得到相同的结论,但这里,用了Monte Carlo模拟来解释有效前沿和最有投资组合的概念。

公众号官方QQ群

每天有很多干货资料分享

满足不同人群学习、办公的需求

不同行业之间的交流互动

扫码加入

加群请备注

学校/公司+姓名+研究方向

责任编辑:

python有效边界_Markowitz有效边界和投资组合优化基于Python(附代码)相关推荐

  1. 我用Python爬取了难下载的电子教材(内附代码)

    我用Python爬取了难下载的电子教材(内附代码) 第一次在CSDN上面分享经历,有点激动.本大二狗最近这段时间去不了学校又想看教材,不巧学习通上面的部分内容老师设置了不可下载啊.好在最近学习了一点P ...

  2. python selenium脚本_怎样开始写第一个基于python的selenium脚本

    1.下载并安装python(http://www.python.org/geti/). 2.安装selenium(http://pypi.python.org/pypi/selenium)下载并解压缩 ...

  3. python写web自动化_Web接口开发与自动化测试——基于Python语言

    目 录∣ V 目 录 第1 章 Python 学习必知 ........................................................................ ...

  4. python自动化工具开发_初识TPOT:一个基于Python的自动化机器学习开发工具

    1. TPOT介绍 一般来讲,创建一个机器学习模型需要经历以下几步: 数据预处理 特征工程 模型选择 超参数调整 模型保存 本文介绍一个基于遗传算法的快速模型选择及调参的方法,TPOT:一种基于Pyt ...

  5. python对abaqus本构二次开发_基于Python的Abaqus二次开发实例讲解

    第 1 页 共 11 页 基于 Python 的 Abaqus 二次开发实例讲解 ( asian58 2013.6.26 ) 基于 Python 的 Abaqus 的二次开发便捷之处在于: 1 .所有 ...

  6. jemeter python接口自动化测试平台_WEB接口开发与自动化测试基于PYTHON语言PDF_Python教程...

    资源名称:WEB接口开发与自动化测试 基于PYTHON语言 PDF 内容简介: <Web接口开发与自动化测试--基于Python语言>以接口测试为主线,以Web开发为切入点,全面介绍了We ...

  7. python在律师上作中的实例_基于Python的律师信息查询接口调用代码实例

    基于Python的律师信息查询接口调用代码实例代码描述:基于Python的律师信息查询接口调用代码实例 代码平台:聚合数据 #!/usr/bin/python # -*- coding: utf-8 ...

  8. python中构造方法和析构方法的区别_基于Python构造方法与析构方法的研究

    基于 Python 构造方法与析构方法的研究 林观德 [期刊名称] < <现代职业教育> > [年 ( 卷 ), 期] 2019(000)018 [摘要] Python 语言是 ...

  9. python云盘私有云_GitHub - 0x2642/Umi-Chest: 一个基于python的私有云实验项目

    Umi-Chest 一个基于angular 4的单页面舰娘百科App 关于项目名是因为kuma一直找不到好的名字,因为联想到海,然后我喜欢海爷,所以本来想叫海爷百宝箱什么的(一个舰娘的App你叫海爷百 ...

最新文章

  1. 人生快乐之道(组图)
  2. TileList自动滚动指定单元格,可视部分
  3. 领导者有3个要求,你做到了吗?
  4. NLTK与NLP原理及基础
  5. OpenCV特征描述Feature Description
  6. python中常见的内置函数_Python常用内置函数总结
  7. 站怎么点都是一样_老鼠被卡在轮胎里,像是被点了穴道一样:这可怎么办才好?...
  8. 点名册_骑士新书《万界点名册》十万收藏火爆气势不减当年修真聊天群
  9. STM32示波器 信号发生器
  10. web前端是什么?需要掌握什么技术?
  11. 09. ajax跨域问题,同源策略
  12. ZBrush软件特性之Color调控板
  13. 2022年4月份京东有什么活动?
  14. 嗨!爱莫就是传说中隔壁家公司 | 精彩传送门
  15. 推荐几个英语学习网站
  16. 淘淘商城第51讲——从商城首页跳转到搜索页面
  17. oracle如果为0显示为1,解决Oracle的数值0.1只显示成.1问题
  18. Praat脚本-028 | 批量合并目录内的音频文件
  19. Spring创建对象基本过程
  20. Power BI 关于日期显示格式的那些事儿

热门文章

  1. 企业用什么留住员工???
  2. python把数组写入word_Python中 将数据插入到Word模板并生成一份Word
  3. 杭州人才落户操作指南
  4. 如何做好财税销售?4个实用技巧帮你提高销售业绩
  5. PPT的粘贴选项没有选项
  6. html5怎么转换,HTML5 canvas中的转换方法
  7. 地图java版_Mapabc——地图标注(java版)
  8. Physics Engine - Car Games [ 物理引擎 - 赛车游戏 ]
  9. 据说是史上最强的学习C语言的路线
  10. 推荐三款视频播放器(超越QQ影音)