楼主: zbg100
6681 3

[问答] 【Markowitz】【frontier】用python求 马克维茨的有效前沿遇到了问题,【如图】 [推广有奖]

  • 3关注
  • 0粉丝

硕士生

19%

还不是VIP/贵宾

-

威望
0
论坛币
1204 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
9290 点
帖子
42
精华
0
在线时间
219 小时
注册时间
2011-3-2
最后登录
2023-11-10

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
代码如下
# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd
import pandas.io.data as web
import matplotlib.pyplot as plt

symbols=['AAPL','MSFT','YHOO','DB','GLD']
noa=len(symbols)
data=pd.DataFrame()
for sym in symbols:
    data[sym]=web.DataReader(sym,data_source='yahoo',end='2014-09-12')['Adj Close']
data.columns=symbols
(data / data.ix[0] *100).plot(figsize=(8,5))
rets=np.log(data/data.shift(1))          #计算收益
print(rets.mean()*252)
print(rets.cov()*252)
init_weights=np.random.random(noa)
init_weights=init_weights/np.sum(weights)        #随机生成的总和为1的权重
print(np.dot(rets.mean().T,init_weights)*252) #组合的收益!
print(np.sqrt(np.dot(weights.T,np.dot(rets.cov()*252,weights)))) #组合的波动率!
#----------------------特别容易忘记收益率,协方差矩阵乘上252!!!----------
#接下来就是蒙特卡洛模拟打点
prets=[]
pvols=[]
for p in range(10000):
    weights=np.random.random(noa)
    weights /= np.sum(weights)
    prets.append(np.sum(rets.mean()*weights*252))
    pvols.append(np.sqrt(np.dot(weights.T,np.dot(rets.cov()*252,weights))))
prets=np.array(prets)          #这里用了np.array主要是因为不用的话就是list
pvols=np.array(pvols)           #list没有array方便计算!!!
plt.figure(figsize=(8,4))
risk_free=0.02


#-------------------------------------------------------------------------

def statistics(weights):
    weights=np.array(weights)
    pret=np.sum(rets.mean()*weights)*252
    pvol=np.dot(weights.T,np.dot(rets.cov()*252,weights))
    return np.array([pret,pvol,pret/pvol])
def min_func_sharp(weights):
    return -statistics(weights)[2]
cons1 = ({'type':'eq', 'fun':lambda x: np.sum(x)-1})
bnds1=tuple((0,1) for x in range(noa))
opts = sco.minimize(min_func_sharp, noa*[1./noa,], method = 'SLSQP', bounds = bnds, constraints = cons1)
print(opts)
print('权重是:',opts['x'].round(3))
print('各种值是:',statistics(opts['x']).round(3))
def min_func_variance(weights):
    return statistics(weights)[1]**2
optv=sco.minimize(min_func_variance,noa*[1./noa,],method='SLSQP',bounds=bnds1,constraints=cons)
print(optv)
print('权重是:',optv['x'].round(3))
print('各种值是:',statistics(optv['x']))
#-----------------------------------------------------------------------
def min_variance(weights):
    return statistics(weights)[1]
target_returns = np.linspace(0.0,0.25,50)
target_variance = []
for tar in target_returns:
    cons2 = ({'type':'eq','fun':lambda weights:statistics(weights)[0]-tar},{'type':'eq','fun':lambda weights:np.sum(weights)-1})
    res = sco.minimize(min_variance, noa*[1./noa,],method = 'SLSQP', bounds = bnds1, constraints = cons2)
    target_variance.append(res['fun'])
target_variance = np.array(target_variance)
plt.scatter(pvols,prets,c=prets-risk_free / pvols, marker='.')  #'c'这个参数是颜色,可以用小数表示
                                                        #这里转换为了夏普比率
plt.grid(True)
plt.xlabel('expected volatility')
plt.ylabel('expected return')
plt.colorbar(label='Sharp ratio')
plt.scatter(target_variance,target_returns, c = target_returns/target_variance, marker = 'x')

问题是:
这是为什么?




二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Markowitz frontier frontie python front python

1.jpg (38.55 KB)

1.jpg

沙发
zbg100 发表于 2016-9-19 08:30:04 |只看作者 |坛友微信交流群
顶一波!!!!!!!!!!!!!!!!!!!

使用道具

藤椅
alessandroc 发表于 2017-5-18 01:00:53 |只看作者 |坛友微信交流群
谢谢楼主分享!只是我在执行sco.minimize函数时一直报错:
Traceback (most recent call last):
  File "E:/python_test/MeanVariance.py", line 51, in <module>
    opts = sco.minimize(min_func_sharp, noa*[1./noa,], method = 'SLSQP', bounds = bnds1, constraints = cons1)
  File "D:\Python27\lib\site-packages\scipy\optimize\_minimize.py", line 458, in minimize
    constraints, callback=callback, **options)
  File "D:\Python27\lib\site-packages\scipy\optimize\slsqp.py", line 370, in _minimize_slsqp
    raise ValueError("Objective function must return a scalar")
ValueError: Objective function must return a scalar

使用道具

alessandroc 发表于 2017-5-18 01:00
谢谢楼主分享!只是我在执行sco.minimize函数时一直报错:
Traceback (most recent call last):
  File " ...
你的文件路径跟楼主的不一样吧

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-25 01:33