当前位置:首页 » 股票投资 » python多股票投资组合

python多股票投资组合

发布时间: 2021-07-30 15:21:43

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

多资产的组合配置进行三方面的优化。 1.找到有效前沿。在既定的收益率下使组合的方差最校 2.找到sharpe最优的组合(收益-风险均衡点) 3.找到风险最小的组合

㈡ 想利用Python给多个字词想让他们两两组合

num=int(input('请输入10以内的数值:'))+1
foreachinrange(1,num):
each=str(each)
foreach1inrange(1,num):
each1=str(each1)
ifeach1==each:
continue
s=each+each1
print(s)

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

多股票策略回测时常常遇到问题。
仓位如何分配?
你以为基金经理都是一拍脑袋就等分仓位了吗?
或者玩点玄乎的斐波拉契数列?
OMG,谁说的黄金比例,让我看到你的脑袋(不削才怪)!!

其实,这个问题,好多好多年前马科维茨(Markowitz)我喜爱的小马哥就给出答案——投资组合理论。

根据这个理论,我们可以对多资产的组合配置进行三方面的优化。
1.找到有效前沿。在既定的收益率下使组合的方差最小。
2.找到sharpe最优的组合(收益-风险均衡点)

3.找到风险最小的组合

跟着我,一步两步,轻松实现。
该理论基于用均值和方差来表述组合的优劣的前提。将选取几只股票,用蒙特卡洛模拟初步探究组合的有效前沿。
通过最大Sharpe和最小方差两种优化来找到最优的资产组合配置权重参数。
最后,刻画出可能的分布,两种最优以及组合的有效前沿。

注:
文中的数据API来自量化平台聚宽,在此表示感谢。
原文见【组合管理】——投资组合理论(有效前沿)(包含正态检验部分)

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')
Out[16]:

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

m投资组合模型的一个很有力的替代是Index model,或者我们说的single factor model,因为markowitz是需要计算全部股票的协方差和方差的,如果证券的数量很多,计算量会非常大(这些在investment的参考书里面有),我下面就把原话打给你 first,the model requires a huge number of estimates to fill the covariance matrix.second ,the model does not provide any guideline to the forecasting to the security risk premiums that are essential to construct the efficient frontier of risky assets.第一个是硬伤,单单计算NYSE的股票就要4.5百万的估计量,而同等条件下index model才需要9002个估计量,这就是为什么markowitz模型很多人不愿意用的愿意,而优点也很直接,如果你的估算值是准确的,那么m模型的结果比其他都准确

股票投资组合值的计算

20%*1.2+10%0.9+30%1.5+40%*2=0.24+0.09+0.5+0.8=1.63

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

看这个文章
https://zhuanlan.hu.com/p/20604930?refer=quantstory
用python实现Markowitz投资组合优化

㈦ 股票投资组合是什么

股票投资组合,是指投资者在进行股票投资时,根据各种股票的风险程度、获利能力等方面的因素,按照一定的规律和原则进行股票的选择、搭配以降低投资风险的一种方法。其理论依据就是股市内各类股票的涨跌一般不是同步的,总是有涨有跌,此起彼伏。因此,当在一种股票上的投资可能因其价格的暂时跌落而不能盈利时,还可以在另外一些有涨势的股票上获得一定的收益,从而可以达到回避风险的目的。应当明确的是,这一种方法只适用于资金投入量较大的投资者。
股票投资管理是资产管理的重要组成部分之一。股票投资组合管理的目标就是实现效用最大化,即使股票投资组合的风险和收益特征能够给投资者带来最大的满足。因此,构建股票投资组合的原因有二:一是为降低证券投资风险;二是为实现证券投资收益最大化。
组合管理是一种区别于个别资产管理的投资管理理念。组合管理理论最早由马柯威茨于1952年系统地提出,他开创了对投资进行整体管理的先河。目前,在西方国家大约有1/3的投资管理者利用数量化方法进行组合管理。构建投资组合并分析其特性是职业投资组合经理的基本活动。在构建投资组合过程中,就是要通过证券的多样化,使由少量证券造成的不利影响最小化。
一、分散风险
股票与其他任何金融产品一样,都是有风险的。所谓风险就是指预期投资收益的不确定性。我们常常会用篮子装鸡蛋的例子来说明分散风险的重要性。如果我们把鸡蛋放在一个篮子里,万一这个篮子不小心掉在地上,那么所有的鸡蛋都可能被摔碎;而如果我们把鸡蛋分散在不同的篮子里,那么一个篮子掉了不会影响其他篮子里的鸡蛋。资产组合理论表明,证券组合的风险随着组合所包含的证券数量的增加而降低,资产间关联性低的多元化证券组合可以有效地降低个别风险。
我们一般用股票投资收益的方差或者股票的p值来衡量一只股票或股票组合的风险。通常股票投资组合的方差是由组合中各股票的方差和股票之间的协方差两部分组成,组合的期望收益率是各股票的期望收益率的加权平均。除去各股票完全正相关的情况,组合资产的标准差将小于各股票标准差的加权平均。当组合中的股票数目N增加时,单只股票的投资比例减少,方差项对组合资产风险的影响下降;当N趋向无穷大时,方差项将档近0,组合资产的风险仅由各股票之间的协方差所决定。也就是说,通过组合投资,能够减少直至消除各股票自身特征所产生的风险(非系统性风险),而只承担影响所有股票收益率的因素所产生的风险(系统性风险)。
二、实现收益最大化
股票投资组合管理的目标之一就是在投资者可接受的风险水平内,通过多样化的股票投资使投资者获得最大收益。从市场经验来看,单只股票受行业政策和基本面的影响较大,相应的收益波动往往也很大。在公司业绩快速增长时期可能给投资者带来可观的收益,但是如果因投资者未观察到的信息而导致股票价格大幅下跌,则可能给投资者造成很大的损失。因此,在给定的风险水平下,通过多样化的股票选择,可以在一定程度上减轻股票价格的过度波动,从而在一个较长的时期内获得最大收益。

㈧ 三种股票投资组合风险计算

整个投资组合的方差 =0.3*0.3*100+0.3*0.3*144+0.4*0.4*169+2*0.3*0.3*120+2*0.3*0.4*130+2*0.3*0.4*156 = 139.24

三个股票的投资组合方差=w1*w1*股票1的方差+w2*w2*股票2的方差+w3*w3*股票3的方差+ 2*w1*w2*股票1和2的协方差+2*w1*w3*股票1和3的协方差+2*w2*w3*股票2和3的协方差

热点内容
金融生考研有哪些学校 发布:2025-08-16 19:00:30 浏览:543
老公炒股老婆不给本金怎么办 发布:2025-08-16 18:58:25 浏览:422
基金会发起人的权利与义务是什么 发布:2025-08-16 18:56:02 浏览:688
华夏app如何赎回基金 发布:2025-08-16 18:54:12 浏览:562
认缴出资股权转让如何缴纳个税 发布:2025-08-16 18:46:52 浏览:423
货币基金每日结算哪个好 发布:2025-08-16 18:45:23 浏览:920
沪锡期货涨为什么股价跌 发布:2025-08-16 18:44:36 浏览:708
股票投资的特点的有 发布:2025-08-16 18:41:48 浏览:153
螺纹钢期货要多少钱 发布:2025-08-16 18:41:47 浏览:415
流通盘和市值证明什么 发布:2025-08-16 18:34:05 浏览:15