利用python构建马科维茨_Markowitz投资组合之Python模拟
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模拟相关推荐
- 利用python构建马科维茨_利用马科维茨投资组合模型建立Alpha策略
理论基础 马科维茨的投资组合(均值-方差.有效边界)模型最早采用了风险资产的期望收益率(均值)和用方差(或标准差)代表的风险来研究资产组合和选择问题.理论上来说可以通过投资组合规避非系统性风险. 而A ...
- python构建智能机器人系列博文---借助于python实现QQ,微信消息的自动发送,音乐的自动播放
目录 一.写在前面: 二.系统实现: 三.总结反思: Author:qyan.li Date:2022.6.3 Topic:借助于python自动化技术实现指定音乐的播放和QQ,微信消息发送 一.写在 ...
- 利用python构建马科维茨_使用CVXOPT包实现马科维茨投资组合优化
在真实股票市场的回测 上面的例子特别有趣但不是很适用. 接下来,我们将演示如何在BigQuant中创建一个策略. 本实验的目的是验证在一个买入固定5只股票的多头组合,利用马科维茨组合优化确定的投资组合 ...
- 利用python构建马科维茨_R语言动量和马科维茨Markowitz投资组合(Portfolio)模型实现...
动量和马科维茨投资组合模型使 均值方差优化 组合成为可行的解决方案.通过建议并测试: 增加最大权重限制 增加目标波动率约束 下面,我将查看8个资产的结果: 首先,让我们加载所有历史数据 #****** ...
- 利用python构建马科维茨_Python_画马科维茨有效前沿
0. Backgound 有效前沿是在给定投资范围,return-risk约束条件下同等风险情况下收益最大的的资产配置集合. 说白了,就是给一堆可投资券,求各种配比的组合下,相同return方差最小( ...
- python构建矩阵 x y_生成Python函数一半没问题,当前最正统的代码生成是什么样的?...
机器之心原创 参与:思源 大家都说深度神经网络能力很强,那么从函数注释生成函数代码,以及从函数代码总结函数注释这种最基础的代码任务到底能不能行?像 Python.Java 这样的通用高级语言,到底在代 ...
- python构建网站flask_30分钟搭建Python的Flask框架并在上面编写第一个应用
Flask 是一种很赞的Python web框架.它极小,简单,最棒的是它很容易学. 今天我来带你搭建你的第一个Flask web应用!和官方教程 一样,你将搭建你自己的微博客系统:Flaskr.和官 ...
- python构建决策引擎_用Python和Keras搭建你自己的AlphaZero
教会机器通过深度学习和自我博弈学习玩<四子连珠>游戏(Connect4). 在本文,我(作者 David Foster--译者注)会主要讲到以下三件事: AlphaZero 迈入人工智能一 ...
- python构建区块链_用python构建区块链(1)---基本结构
目录 背景 比特币从诞生到现在已经10年了,最近一段时间因为工作原因接触到了区块链相关的技术,为了揭开其背后的神秘面纱,我们就从头开始构建一个简单的区块链.在行动之前我们先看一下比特币的整体结构. 比 ...
- java跟python优势_当前Java与Python相比还有哪些优势
首先,Java语言与Python语言都是非常流行的全场景编程语言,在很多开发场景下,既可以使用Java语言,也可以采用Python语言,比如Web开发.大数据开发等等.随着近几年大数据和人工智能领域的 ...
最新文章
- java对文本文件进行操作:读取、修改、添加、删除、重命名等
- SVN之文件同步更新
- 11、MySQL字符集和校对规则详解
- 17天17个Python设计模式--目录
- 【线上圆桌】视频会议下半场
- Tomcat开发Web项目基本结构
- 在Firefox 58中,WebAssembly组件性能提升了10倍
- (pytorch-深度学习系列)pytorch线性回归的便捷实现
- Python all函数 - Python零基础入门教程
- 面试:一文搞懂堆和栈的区别
- windows--bat--%0无限执行当前bat脚本
- TensorFlow2.0:张量排序
- C语言实现简易计算器
- 飞机大战项目(源代码(直接用),有效果图,素材包)
- Unity3D插件 Puppet3D的使用
- Android 音频系统:从 AudioTrack 到 AudioFlinger
- 基于MySQL的京东用户行为分析
- 数字改造有色金属产业链,发挥产业优势效能
- 分布式路由策略(Hash取余,一致性Hash,Hash槽)
- 单片机概述习题以及答案