如何用python实现Markowitz投资组合优化

网上有关“如何用python实现Markowitz投资组合优化”话题很是火热,小编也是针对如何用python实现Markowitz投资组合优化寻找了一些与之相关的一些信息进行分...

网上有关“如何用python实现Markowitz投资组合优化”话题很是火热,小编也是针对如何用python实现Markowitz投资组合优化寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。

0.导入需要的包import pandas as pd

import numpy as np

import statsmodels.api as sm #统计运算

import scipy.stats as scs #科学计算

import matplotlib.pyplot as plt #绘图

1.选取几只感兴趣的股票

000413 东旭光电,000063 中兴通讯,002007 华兰生物,000001 平安银行,000002 万科A

并比较一下数据(2015-01-01至2015-12-31)

In[1]:

stock_set = ['000413.XSHE','000063.XSHE','002007.XSHE','000001.XSHE','000002.XSHE']

noa = len(stock_set)

df = get_price(stock_set, start_date = '2015-01-01', end_date ='2015-12-31', 'daily', ['close'])

data = df['close']

#规范化后时序数据

(data/data.ix[0]*100).plot(figsize = (8,5))

Out[1]:

2.计算不同证券的均值、协方差

每年252个交易日,用每日收益得到年化收益。计算投资资产的协方差是构建资产组合过程的核心部分。运用pandas内置方法生产协方差矩阵。

In [2]:

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

returns.mean()*252

Out[2]:

000413.XSHE 0.184516

000063.XSHE 0.176790

002007.XSHE 0.309077

000001.XSHE -0.102059

000002.XSHE 0.547441

In [3]:

returns.cov()*252

Out[3]:

3.给不同资产随机分配初始权重

由于A股不允许建立空头头寸,所有的权重系数均在0-1之间

In [4]:

weights = np.random.random(noa)

weights /= np.sum(weights)

weights

Out[4]:

array([ 0.37505798, 0.21652754, 0.31590981, 0.06087709, 0.03162758])

4.计算预期组合年化收益、组合方差和组合标准差

In [5]:

np.sum(returns.mean()*weights)*252

Out[5]:

0.21622558669017816

In [6]:

np.dot(weights.T, np.dot(returns.cov()*252,weights))

Out[6]:

0.23595133640121463

In [7]:

np.sqrt(np.dot(weights.T, np.dot(returns.cov()* 252,weights)))

Out[7]:

0.4857482232609962

5.用蒙特卡洛模拟产生大量随机组合

进行到此,我们最想知道的是给定的一个股票池(证券组合)如何找到风险和收益平衡的位置。

下面通过一次蒙特卡洛模拟,产生大量随机的权重向量,并记录随机组合的预期收益和方差。

In [8]:

port_returns = []

port_variance = []

for p in range(4000):

weights = np.random.random(noa)

weights /=np.sum(weights)

port_returns.append(np.sum(returns.mean()*252*weights))

port_variance.append(np.sqrt(np.dot(weights.T, np.dot(returns.cov()*252, weights))))

port_returns = np.array(port_returns)

port_variance = np.array(port_variance)

#无风险利率设定为4%

risk_free = 0.04

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

plt.scatter(port_variance, port_returns, c=(port_returns-risk_free)/port_variance, marker = 'o')

plt.grid(True)

plt.xlabel('excepted volatility')

plt.ylabel('expected return')

plt.colorbar(label = 'Sharpe ratio')

Out[8]:

6.投资组合优化1——sharpe最大

建立statistics函数来记录重要的投资组合统计数据(收益,方差和夏普比)

通过对约束最优问题的求解,得到最优解。其中约束是权重总和为1。

In [9]:

def statistics(weights):

weights = np.array(weights)

port_returns = np.sum(returns.mean()*weights)*252

port_variance = np.sqrt(np.dot(weights.T, np.dot(returns.cov()*252,weights)))

return np.array([port_returns, port_variance, port_returns/port_variance])

#最优化投资组合的推导是一个约束最优化问题

import scipy.optimize as sco

#最小化夏普指数的负值

def min_sharpe(weights):

return -statistics(weights)[2]

#约束是所有参数(权重)的总和为1。这可以用minimize函数的约定表达如下

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

#我们还将参数值(权重)限制在0和1之间。这些值以多个元组组成的一个元组形式提供给最小化函数

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

#优化函数调用中忽略的唯一输入是起始参数列表(对权重的初始猜测)。我们简单的使用平均分布。

opts = sco.minimize(min_sharpe, noa*[1./noa,], method = 'SLSQP', bounds = bnds, constraints = cons)

opts

Out[9]:

status: 0

success: True

njev: 4

nfev: 28

fun: -1.1623048291871221

x: array([ -3.60840218e-16, 2.24626781e-16, 1.63619563e-01, -2.27085639e-16, 8.36380437e-01])

message: 'Optimization terminated successfully.'

jac: array([ 1.81575805e-01, 5.40387481e-01, 8.18073750e-05, 1.03137662e+00, -1.60038471e-05, 0.00000000e+00])

nit: 4

得到的最优组合权重向量为:

In [10]:

opts['x'].round(3)

Out[10]:

array([-0. , 0. , 0.164, -0. , 0.836])

sharpe最大的组合3个统计数据分别为:

In [11]:

#预期收益率、预期波动率、最优夏普指数

statistics(opts['x']).round(3)

Out[11]:

array([ 0.508, 0.437, 1.162])

7.投资组合优化2——方差最小

接下来,我们通过方差最小来选出最优投资组合。

In [12]:

#但是我们定义一个函数对 方差进行最小化

def min_variance(weights):

return statistics(weights)[1]

optv = sco.minimize(min_variance, noa*[1./noa,],method = 'SLSQP', bounds = bnds, constraints = cons)

optv

Out[12]:

status: 0

success: True

njev: 7

nfev: 50

fun: 0.38542969450547221

x: array([ 1.14787640e-01, 3.28089742e-17, 2.09584008e-01, 3.53487044e-01, 3.22141307e-01])

message: 'Optimization terminated successfully.'

jac: array([ 0.3851725 , 0.43591119, 0.3861807 , 0.3849672 , 0.38553924, 0. ])

nit: 7

方差最小的最优组合权重向量及组合的统计数据分别为:

In [13]:

optv['x'].round(3)

Out[13]:

array([ 0.115, 0. , 0.21 , 0.353, 0.322])

In [14]:

#得到的预期收益率、波动率和夏普指数

statistics(optv['x']).round(3)

Out[14]:

array([ 0.226, 0.385, 0.587])

8.组合的有效前沿

有效前沿有既定的目标收益率下方差最小的投资组合构成。

在最优化时采用两个约束,1.给定目标收益率,2.投资组合权重和为1。

In [15]:

def min_variance(weights):

return statistics(weights)[1]

#在不同目标收益率水平(target_returns)循环时,最小化的一个约束条件会变化。

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

target_variance = []

for tar in target_returns:

cons = ({'type':'eq','fun':lambda x:statistics(x)[0]-tar},{'type':'eq','fun':lambda x:np.sum(x)-1})

res = sco.minimize(min_variance, noa*[1./noa,],method = 'SLSQP', bounds = bnds, constraints = cons)

target_variance.append(res['fun'])

target_variance = np.array(target_variance)

下面是最优化结果的展示。

叉号:构成的曲线是有效前沿(目标收益率下最优的投资组合)

红星:sharpe最大的投资组合

黄星:方差最小的投资组合

In [16]:

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

#圆圈:蒙特卡洛随机产生的组合分布

plt.scatter(port_variance, port_returns, c = port_returns/port_variance,marker = 'o')

#叉号:有效前沿

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

#红星:标记最高sharpe组合

plt.plot(statistics(opts['x'])[1], statistics(opts['x'])[0], 'r*', markersize = 15.0)

#黄星:标记最小方差组合

plt.plot(statistics(optv['x'])[1], statistics(optv['x'])[0], 'y*', markersize = 15.0)

plt.grid(True)

plt.xlabel('expected volatility')

plt.ylabel('expected return')

plt.colorbar(label = 'Sharpe ratio')

关于“如何用python实现Markowitz投资组合优化”这个话题的介绍,今天小编就给大家分享完了,如果对你有所帮助请保持对本站的关注!

本文来自作者[碧彤]投稿,不代表华烁号立场,如若转载,请注明出处:https://hsyu.cn/jyfx/202501-64175.html

(15)

文章推荐

  • 2013年1月1日到2021年是多少天 2013年驾照考试科目一

    2013年1月1日到2021年是2922天从2013年到2021年一共跨了2013年,2014年,2015年,2016年,2017年,2018年,2019年,2020年8个年头,按照每年365天算,8年是365×8=2920天,在这8年中有2

    2025年01月14日
    12
  • 母亲节收到孩子画画怎么发朋友圈 母亲节画画图片优秀画

    关于这个问题,1.“最珍贵的礼物,是孩子用心画的一份母亲节礼物,感恩有你,我的孩子。”2.“孩子的画,是我最心爱的礼物,让我感受到母爱的温暖,谢谢你,我的宝贝。”3.“孩子的画,是一份最真挚的爱,让我在母亲节感受到了无尽的幸福,谢谢你

    2025年01月17日
    14
  • 育才优学教育培训中心怎么样 育才教育怎么样

    挺好的教学环境好硬件措施好老师耐心认真责任感强对待学生一视同仁据说不捆绑啊,而且师资力量不错,主要看效果嘛,用数字说话!1可以算是一所好学校2因为通渭路教育集团育才学校已经获得了多项荣誉和认证,教学质量也得到了认可,学校拥有先

    2025年01月17日
    15
  • 西安的文都考研怎么样 文都考研培训机构咋样

    西安的文都考研是一家知名的培训机构,具有强大的师资力量和系统的教学体系。文都考研注重实用性和高效性,提供有针对性的科学分班和精准的教学计划,为考生的复习提供全方位的支持和指导。学校还提供良好的学习环境和完善的服务体系,让学生能够更加高效地学习

    2025年01月18日
    11
  • 幼儿园的大班工作计划

    网上有关“幼儿园的大班工作计划”话题很是火热,小编也是针对幼儿园的大班工作计划寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。 光阴的迅速,一眨眼就过去了,又将迎来新的工作,新的挑战,是时候写一份详细的计划了。那么你真正懂得怎么写好计划吗?下面是我收集整理的幼

    2025年01月23日
    17
  • 秋冬交替时节预防小常识

    网上有关“秋冬交替时节预防小常识”话题很是火热,小编也是针对秋冬交替时节预防小常识寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。1.秋冬季节防病知识冬季感冒治疗七法:黄芪茶预防法:取黄芪10克、白术6克、防风6克、乌梅1个放入保温杯中,开水冲泡10

    2025年01月27日
    14
  • 研学与传承红色基因的关系

    网上有关“研学与传承红色基因的关系”话题很是火热,小编也是针对研学与传承红色基因的关系寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。研学与传承红色基因的关系可以从以下几个方面来探讨:1、研学旅行是传承红色基因的重要途径;研学旅行是一种新型的教育方式,旨在通过

    2025年01月27日
    12
  • 太空知识手抄报

    网上有关“太空知识手抄报”话题很是火热,小编也是针对太空知识手抄报寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。太空知识手抄报:关于太空的科学小知识1、我们的太阳系的所有行星中,只有金星和水星是没有卫星的。在我们的太阳系中,一共有176颗已确认的卫星环绕着它

    2025年02月02日
    7
  • 桌面扫地机器人手工制作过程_1

    网上有关“桌面扫地机器人手工制作过程”话题很是火热,小编也是针对桌面扫地机器人手工制作过程寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。桌面扫地机器人手工制作过程介绍如下:制作一个桌面扫地机器人,可以是一个有趣而富有教育意义的活动,特别是对于家庭亲子互动来说

    2025年02月04日
    9
  • 牛头山旅游景点大全介绍 牛头山5a景区

    网上有关“牛头山旅游景点大全介绍牛头山5a景区”话题很是火热,小编也是针对牛头山旅游景点大全介绍牛头山5a景区寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。武义有哪些旅游景点1、大红岩景区,是大自然造就的一幅精美绝伦的丹霞画卷,巨大的褚红色崖壁号

    2025年02月12日
    9

发表回复

本站作者后才能评论

评论列表(4条)

  • 碧彤
    碧彤 2025年01月19日

    我是华烁号的签约作者“碧彤”!

  • 碧彤
    碧彤 2025年01月19日

    希望本篇文章《如何用python实现Markowitz投资组合优化》能对你有所帮助!

  • 碧彤
    碧彤 2025年01月19日

    本站[华烁号]内容主要涵盖:国足,欧洲杯,世界杯,篮球,欧冠,亚冠,英超,足球,综合体育

  • 碧彤
    碧彤 2025年01月19日

    本文概览:网上有关“如何用python实现Markowitz投资组合优化”话题很是火热,小编也是针对如何用python实现Markowitz投资组合优化寻找了一些与之相关的一些信息进行分...

    联系我们

    邮件:华烁号@sina.com

    工作时间:周一至周五,9:30-18:30,节假日休息

    关注我们