三支股票 A.B和C,请问该如何算出最优的投资组合配比(最大回报,最小风险)?

论坛 期权论坛 期权     
匿名用户1024   2021-6-1 07:53   8923   5
已知各股的
股价
期望回报率
标准差
两两之间的协方差
总投资金额
想求出最大回报 最小风险的组合配比,该怎么做?就是A B C 各占多少投资金额的百分比最好?
有人说用excel线性规划做,实际操作起来不知该从何下手,求助。
分享到 :
0 人收藏

5 个回复

倒序浏览
2#
有关回应  16级独孤 | 2021-6-1 07:53:10
看题主的组合才3只股票就搞得很复杂了。。。
这两天刚用python做了下投资组合理论的验证。要是会点编程,别说A、B、C三只股票了,就是整个上证+深证三千多只股票也没问题的。

原文见:【组合管理】——投资组合理论(有效前沿)

源码都贴上了,现在这时代不会点编程都吃不饱饭了,感兴趣的可以搬去用不谢。

------------------------------------------2016.2.26更新----------------------------------------------------
ps:有人问到这个分析是在哪儿做的。我也是对量化策略感兴趣,最近用JoinQuant的平台在做些研究,顺便分享出来和大家一起交流。

--------------------------------------------------------------------------------------------------------------
正态性检验和蒙特卡洛完成投资组合优化by 陈小米。
最近一直在思考怎样有效的配置资产组合。 很多时候根据条件选好股票池之后,通常简单粗暴的等分仓位给每只股票。 其实,这个过程中有很多可以优化的空间。
下面,给大家分享一下如何运用有效前沿进行资产组合优化。

PART ONE: 正态性检验这部分是附赠福利。只对资产组合优化感兴趣的朋友可以直接跳到PART TWO。
(社区回答字数限制,这部分暂且删除,感兴趣的到原文链接自己看哦~)

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

1.选取几只感兴趣的股票000413 东旭光电,000063 中兴通讯,002007 华兰生物,000001 平安银行,000002 万科A
并比较一下数据(2015-01-01至2015-12-31)

In [102]:
  1. stock_set = ['000413.XSHE','000063.XSHE','002007.XSHE','000001.XSHE','000002.XSHE']noa = len(stock_set)df = get_price(stock_set, start_date, end_date, 'daily', ['close'])data = df['close']#规范化后时序数据(data/data.ix[0]*100).plot(figsize = (8,5))
复制代码
Out[102]:
  1. [/code][img]https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/zh/521637-a2788e606c9ae972dcc5d49d0785c04f.jpg[/img]
  2. [b]2.计算不同证券的均值、协方差[/b]每年252个交易日,用每日收益得到年化收益。
  3. 计算投资资产的协方差是构建资产组合过程的核心部分。运用pandas内置方法生产协方差矩阵。
  4. In [103]:
  5. [code]returns = np.log(data / data.shift(1))returns.mean()*252
复制代码
Out[103]:
  1. 000413.XSHE    0.184516000063.XSHE    0.176790002007.XSHE    0.309077000001.XSHE   -0.102059000002.XSHE    0.547441dtype: float64
复制代码
In [104]:
  1. returns.cov()*252
复制代码
Out[104]:


3.给不同资产随机分配初始权重由于A股不允许建立空头头寸,所有的权重系数均在0-1之间

In [105]:
  1. weights = np.random.random(noa)weights /= np.sum(weights)weights
复制代码
Out[105]:
  1. array([ 0.37505798,  0.21652754,  0.31590981,  0.06087709,  0.03162758])
复制代码
4.计算预期组合年化收益、组合方差和组合标准差
In [106]:
  1. np.sum(returns.mean()*weights)*252
复制代码
Out[106]:
  1. 0.21622558669017816
复制代码
In [107]:
  1. np.dot(weights.T, np.dot(returns.cov()*252,weights))
复制代码
Out[107]:
  1. 0.23595133640121463
复制代码
In [108]:
  1. np.sqrt(np.dot(weights.T, np.dot(returns.cov()* 252,weights)))
复制代码
Out[108]:
  1. 0.4857482232609962
复制代码
5.用蒙特卡洛模拟产生大量随机组合进行到此,我们最想知道的是给定的一个股票池(证券组合)如何找到风险和收益平衡的位置。
下面通过一次蒙特卡洛模拟,产生大量随机的权重向量,并记录随机组合的预期收益和方差。

In [111]:
  1. 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.04plt.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[111]:
  1. [/code][img]https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/zh/521637-b19bfb6c47f86b9d0133ffd9abaa2021.jpg[/img]
  2. [b]6.投资组合优化1——sharpe最大[/b]建立statistics函数来记录重要的投资组合统计数据(收益,方差和夏普比)
  3. 通过对约束最优问题的求解,得到最优解。其中约束是权重总和为1。
  4. In [115]:
  5. [code]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[115]:
  1.   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 [116]:
  1. opts['x'].round(3)
复制代码
Out[116]:
  1. array([-0.   ,  0.   ,  0.164, -0.   ,  0.836])
复制代码
sharpe最大的组合3个统计数据分别为:

In [117]:
  1. #预期收益率、预期波动率、最优夏普指数statistics(opts['x']).round(3)
复制代码
Out[117]:
  1. array([ 0.508,  0.437,  1.162])
复制代码
7.投资组合优化2——方差最小接下来,我们通过方差最小来选出最优投资组合。

In [118]:
  1. #但是我们定义一个函数对 方差进行最小化def min_variance(weights):    return statistics(weights)[1]optv = sco.minimize(min_variance, noa*[1./noa,],method = 'SLSQP', bounds = bnds, constraints = cons)optv
复制代码
Out[118]:
  1.   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 [119]:
  1. optv['x'].round(3)
复制代码
Out[119]:
  1. array([ 0.115,  0.   ,  0.21 ,  0.353,  0.322])
复制代码
In [120]:
  1. #得到的预期收益率、波动率和夏普指数statistics(optv['x']).round(3)
复制代码
Out[120]:
  1. array([ 0.226,  0.385,  0.587])
复制代码

8.组合的有效前沿有效前沿有既定的目标收益率下方差最小的投资组合构成。
在最优化时采用两个约束,1.给定目标收益率,2.投资组合权重和为1。

In [138]:
  1. 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 [139]:
  1. 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[139]:
[code][/code]
3#
有关回应  16级独孤 | 2021-6-1 07:53:11
自问自答,前些天作业终于交上去了!忙完了这一阵子!我就可以接着忙下一阵子了。。。
复习期间来填个坑吧。多图预警。

首先,的确得用 Excel的 solver做。


举例说明:
第一步: 算出回报期望值和标准差:



我的数据取自于TPG,Carsales,以及JBHIFI近十年来在ASX的股价记录。

第二步: 找出协方差:
因为计算投资组合风险的公式是:
所以得先用十年的股价数据算出相应公司之间的协方差:






以上,铺垫就算完成了!

接下来重点来了: 使用solver线性规划

先做一个template出来,类似于这样

然后!


放大招! 规划求解!!


我这里取了三个公司回报率的中间值作为一个合理的要求回报率 0.21,这里你可以随意设置,合理就行,配比也会随之改变。





点击确定! 登登登登!!!下面就是见证奇迹的时刻!


放大!

至于30组(我做了49组样本)不同配比的曲线图我做了下,大概是这样的:





这只是理想情况下的模型,但我想应该还是具有一定的实际意义。
至于中国股市。。感觉搞这些完全没啥用啊 = =



以上。
4#
有关回应  16级独孤 | 2021-6-1 07:53:12
5#
有关回应  16级独孤 | 2021-6-1 07:53:13
用python或者excel都可以在MPT理论下比较简单的解决你提到的最优问题。无非就是用复权后的收盘价,算出收益率,算出方差协方差矩阵(也可不算,但是后续计算量稍大一点),建立好模型之后,然后在约束条件下求解.你提到的“最大回报”如果是在考虑风险下的话,约定个无风险然后求sharpe的最大值就好。
关于回复中提到的做前沿图像的,我看回复中无论是Python还是excel都在采用约束条件下的最优化求解。其实前沿曲线的表达,只需要确定了两个线上的组合,就完全可以表达出完整的前沿曲线,不需要再进行过多变动约束条件下的求解,这一点在excel的解决上可以省下一些资源。
用python的回答,基本上和Yves Hilpisch写的python for finance中用到的方法和思路一致。excel上如果能充分的运用模拟运算表格,效率也不差。如果你数据量和计算量很大,python优势会强很多很多,就这个列子而言,我在python环境下从数据获取(6种3年日报价)到十万种以上情况的模拟结束,也就几秒钟。如果在excel下,可能效率要差很多。不过回复中进行了4000次,只要你在excel下有类似wind之类的加载项能让你快速下载到数据,那么二者在这个级别下的计算效率基本差不多。
6#
有关回应  16级独孤 | 2021-6-1 07:53:14
数据有没有更多的假设呢?
没有就认为一切都是美好的。

首先,股价没什么用了。
财富w=a1+a2+a3,三个a分别是买各股花的钱。
R=E(a1r1+a2r2+a3r3)=a1Er1+a2Er2+a3Er3
VAR=var(a1r1+a2r2+a3r3)=a1^2 var(r1)+a1^2 var(r2)+a3^2 var(r3)+a1a2cov(r1,r2)+a3a1cov(r3,r1)+a2a3cov(r2,r3)

不能知道你这个市场是不是完备的。
线性规划的话,LL是你喜欢的方差值,你可以多带几个进去,方便画均值方差的前沿回报,得出来的解不一定是唯一的
max R
s.t.VAR=LL
     w=a1+a2+a3

当然可能这个更好,EE是期望回报,不过计算机不傻,一定能发现是二次规划的

min VAR
s.t.R=EE
w=a1+a2+a3
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:136515
帖子:27303
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP