1952年,芝加哥大学的Markowitz提出现代资产组合理论(Modern Portfolio Theory,简称MPT),为现代西方证券投资理论奠定了基础。其基本思想是,证券投资的风险在于证券投资收益的不确定性。如果将收益率视为一个数学上的随机变量的话,证券的期望收益是该随机变量的数学期望(均值),而风险可以用该随机变量的方差来表示。

对于投资组合而言,如何分配各种证券上的投资比例,从而使风险最小而收益最大?

答案是将投资比例设定为变量,通过数学规划,对每一固定收益率求最小方差,对每一个固定的方差求最大收益率,这个多元方程的解可以决定一条曲线,这条曲线上的每一个点都对应着最优投资组合,即在给定风险水平下,收益率最大,这条曲线称作“有效前沿” (Efficient Frontier)。

对投资者而言,不存在比有效前沿更优的投资组合,只需要根据自己的风险偏好在有效前沿上寻找最优策略。

以包含两项风险资产的投资组合为例,其最小方差模型与有效前沿如下图(CFA Notes Book 4, Page 155):

Paste_Image.png

期望收益与标准差分别定义如下(CFA Notes Book 4, Page 156):

Paste_Image.png

Python实现(Python 2.7.13 |Anaconda 4.3.1 (64-bit)):

数据源:

2010年~2016年美股股价–微博、搜狐、网易、百度、阿里巴巴

有约束的最优化问题:

约束条件:a. 5支美股权重之和=1; b. 给定期望收益率

通过最小二乘法计算给定收益率下对应的最小标准差

程序文件:

Get_Yahoo_Quote.py 从Yahoo! Finance获取美股数据

MPT.py 以最优化方法求解并绘制投资组合有效前沿

Get_Yahoo_Quote.py

# -*- coding: utf-8 -*-

"""

Created on Mon May 22 17:41:16 2017

@author: qiaovin

"""

import requests

import time

import pandas as pd

import warnings as ws

ws.filterwarnings("ignore")

def datetime_timestamp(dt):

time.strptime(dt, '%Y-%m-%d %H:%M:%S')

s = time.mktime(time.strptime(dt, '%Y-%m-%d %H:%M:%S'))

return str(int(s))

def get_yahoo_quote(ticker,begin_date,end_date):

s = requests.Session()

cookies = dict(B='6sji959chqf8n&b=3&s=gk')

crumb = 'hJ5N2TwcJhN'

begin = datetime_timestamp(begin_date)

end = datetime_timestamp(end_date)

r = s.get("https://query1.finance.yahoo.com/v7/finance/download/"+ticker+"?period1="+begin+"&period2="+end+"&interval=1d&events=history&crumb="+crumb,cookies=cookies,verify=False)

filename=ticker+".csv"

f = open(filename, 'w')

f.write(r.text)

f.close()

es = pd.read_csv(filename, index_col=0,parse_dates=True, sep=",", dayfirst=True)

return es

def get_yahoo_multi_quotes(tickers,begin_date,end_date):

result = pd.DataFrame()

i = 0

for ticker in tickers:

es = get_yahoo_quote(ticker,begin_date,end_date)

p = pd.DataFrame(es['Adj Close'])

p.rename(columns={'Adj Close': ticker},inplace=True)

#print(p.head())

if i == 0:

result = p

i = i + 1

else:

result =pd.merge(result,p,left_index=True,right_index=True)

return result

MPT.py

# -*- coding: utf-8 -*-

"""

Created on Sat May 27 16:39:54 2017

@author: qiaovin

"""

import numpy as np

import scipy.optimize as opt

from Get_Yahoo_Quote import get_yahoo_multi_quotes

import matplotlib.pyplot as plt

def port_return(weights):

'''

Input:

weights: weights for different securities in portfolio

Output:

pret : expected portfolio return

'''

weights = np.array(weights)

pret = np.sum(rets.mean() * weights) * 252

return pret

def port_volatility(weights):

'''

Input:

weights: weights for different securities in portfolio

Output:

pvol : expected portfolio volatility

'''

weights = np.array(weights)

pvol = np.sqrt(np.dot(weights.T, np.dot(rets.cov() * 252, weights)))

return pvol

begdate="2010-01-01 09:00:00" # beginning date

enddate="2016-12-31 09:00:00" # ending date

stocks=['WB', 'SOHU', 'NTES', 'BIDU','BABA']

data = get_yahoo_multi_quotes(stocks,begdate,enddate)

noa = len(stocks)

rets = np.log(data / data.shift(1))

'''

constraint:

1. sum of weights = 1 ;

2. fixed target return level

bound of weights: (0,1)

'''

bnds = tuple((0, 1) for x in range(noa))

target_returns = np.linspace(0.0, 0.25, 50)

target_vols = []

for target_return in target_returns:

cons = ({'type': 'eq', 'fun': lambda x: port_return(x) - target_return},

{'type': 'eq', 'fun': lambda x: np.sum(x) - 1})

res = opt.minimize(port_volatility, noa * [1. / noa,], method='SLSQP',

bounds=bnds, constraints=cons)

target_vols.append(res['fun'])

target_vols = np.array(target_vols)

plt.figure(figsize=(8, 4))

# efficient frontier

# target_returns/target_vols: Sharpe ratio (risk free rate=0)

plt.scatter(target_vols, target_returns, c=target_returns/target_vols, marker='x')

plt.grid(True)

plt.xlabel('expected volatility')

plt.ylabel('expected return')

plt.colorbar(label='Sharpe ratio')

plt.show()

执行结果:

Paste_Image.png

作者微信公众号

qrcode_small.jpg

参考:

**代码中cookie与crumb定义参见:Yahoo Finance财经数据PYTHON临时读取方法

http://www.jianshu.com/p/85d563d326a9

Yves_Hilpisch_Python_for_Finance

CFA_2017_Level_1_Schweser_Notes_Book_4

金钱永不眠:资本世界的暗流涌动和金融逻辑,香帅无花(唐涯),中信出版社

金融数学-金融工程引论,马雷克/托马斯,人大出版社

利用python构建马科维茨_Markowitz投资组合之Python模拟相关推荐

  1. 利用python构建马科维茨_利用马科维茨投资组合模型建立Alpha策略

    理论基础 马科维茨的投资组合(均值-方差.有效边界)模型最早采用了风险资产的期望收益率(均值)和用方差(或标准差)代表的风险来研究资产组合和选择问题.理论上来说可以通过投资组合规避非系统性风险. 而A ...

  2. python构建智能机器人系列博文---借助于python实现QQ,微信消息的自动发送,音乐的自动播放

    目录 一.写在前面: 二.系统实现: 三.总结反思: Author:qyan.li Date:2022.6.3 Topic:借助于python自动化技术实现指定音乐的播放和QQ,微信消息发送 一.写在 ...

  3. 利用python构建马科维茨_使用CVXOPT包实现马科维茨投资组合优化

    在真实股票市场的回测 上面的例子特别有趣但不是很适用. 接下来,我们将演示如何在BigQuant中创建一个策略. 本实验的目的是验证在一个买入固定5只股票的多头组合,利用马科维茨组合优化确定的投资组合 ...

  4. 利用python构建马科维茨_R语言动量和马科维茨Markowitz投资组合(Portfolio)模型实现...

    动量和马科维茨投资组合模型使 均值方差优化 组合成为可行的解决方案.通过建议并测试: 增加最大权重限制 增加目标波动率约束 下面,我将查看8个资产的结果: 首先,让我们加载所有历史数据 #****** ...

  5. 利用python构建马科维茨_Python_画马科维茨有效前沿

    0. Backgound 有效前沿是在给定投资范围,return-risk约束条件下同等风险情况下收益最大的的资产配置集合. 说白了,就是给一堆可投资券,求各种配比的组合下,相同return方差最小( ...

  6. python构建矩阵 x y_生成Python函数一半没问题,当前最正统的代码生成是什么样的?...

    机器之心原创 参与:思源 大家都说深度神经网络能力很强,那么从函数注释生成函数代码,以及从函数代码总结函数注释这种最基础的代码任务到底能不能行?像 Python.Java 这样的通用高级语言,到底在代 ...

  7. python构建网站flask_30分钟搭建Python的Flask框架并在上面编写第一个应用

    Flask 是一种很赞的Python web框架.它极小,简单,最棒的是它很容易学. 今天我来带你搭建你的第一个Flask web应用!和官方教程 一样,你将搭建你自己的微博客系统:Flaskr.和官 ...

  8. python构建决策引擎_用Python和Keras搭建你自己的AlphaZero

    教会机器通过深度学习和自我博弈学习玩<四子连珠>游戏(Connect4). 在本文,我(作者 David Foster--译者注)会主要讲到以下三件事: AlphaZero 迈入人工智能一 ...

  9. python构建区块链_用python构建区块链(1)---基本结构

    目录 背景 比特币从诞生到现在已经10年了,最近一段时间因为工作原因接触到了区块链相关的技术,为了揭开其背后的神秘面纱,我们就从头开始构建一个简单的区块链.在行动之前我们先看一下比特币的整体结构. 比 ...

  10. java跟python优势_当前Java与Python相比还有哪些优势

    首先,Java语言与Python语言都是非常流行的全场景编程语言,在很多开发场景下,既可以使用Java语言,也可以采用Python语言,比如Web开发.大数据开发等等.随着近几年大数据和人工智能领域的 ...

最新文章

  1. java对文本文件进行操作:读取、修改、添加、删除、重命名等
  2. SVN之文件同步更新
  3. 11、MySQL字符集和校对规则详解
  4. 17天17个Python设计模式--目录
  5. 【线上圆桌】视频会议下半场
  6. Tomcat开发Web项目基本结构
  7. 在Firefox 58中,WebAssembly组件性能提升了10倍
  8. (pytorch-深度学习系列)pytorch线性回归的便捷实现
  9. Python all函数 - Python零基础入门教程
  10. 面试:一文搞懂堆和栈的区别
  11. windows--bat--%0无限执行当前bat脚本
  12. TensorFlow2.0:张量排序
  13. C语言实现简易计算器
  14. 飞机大战项目(源代码(直接用),有效果图,素材包)
  15. Unity3D插件 Puppet3D的使用
  16. Android 音频系统:从 AudioTrack 到 AudioFlinger
  17. 基于MySQL的京东用户行为分析
  18. 数字改造有色金属产业链,发挥产业优势效能
  19. 分布式路由策略(Hash取余,一致性Hash,Hash槽)
  20. 单片机概述习题以及答案

热门文章

  1. 直播间卡人气小秘诀,快速增加直播间人气
  2. Excel VB脚本,下拉框多选
  3. 基于java+jsp房屋租赁管理系统
  4. 信号链模拟芯片是什么?
  5. redis数据中的key如果是中文
  6. 解决 Invalid MEX-file ‘xxx.mexw64‘: 找不到指定的模块 的问题
  7. js传参中文格式不对乱码
  8. SpringBean的生命周期
  9. 收到华为offer后的阶段性总结
  10. UM2 3D 打印机 DIY 实践 ( 3) Marlin 固件配置篇