资产组合优化——python 有效前沿

注意optimze.minimize 优化问题求解方法

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.optimize import minimize
import tushare as ts

pro = ts.pro_api(‘’)

stock1 = pro.daily(ts_code = ‘000001.SZ’,start_date = ‘2015-01-01’)
stock2 = pro.daily(ts_code = ‘603818.SH’,start_date = ‘2015-01-01’)
stock3 = pro.daily(ts_code = ‘600507.SH’,start_date = ‘2015-01-01’)
stock4 = pro.daily(ts_code = ‘601012.SH’,start_date = ‘2015-01-01’)
stock5 = pro.daily(ts_code = ‘601231.SH’,start_date = ‘2015-01-01’)
stock_list = [stock1,stock2,stock3,stock4,stock5]

for i in stock_list:
i.index = i[‘trade_date’]

stock = pd.concat([stock1[‘close’],stock2[‘close’],stock3[‘close’],stock4[‘close’],stock5[‘close’]],axis = 1)
stock.index = pd.date_range(start = ‘2015-01-01’,periods = 1152,freq = ‘D’)
df = pd.DataFrame(columns = [‘s1’,‘s2’,‘s3’,‘s4’,‘s5’],index = stock.index,data = stock.values)
df = df.dropna()

def to_return(x):
r = pd.DataFrame(index = x.index)
r = (x.shift(1) - x)/x
return r
ret = to_return(df)

def stat(x):
mu = np.mean(x,0)
cov = x.cov(0)
return mu,cov

mu,cov = stat(data.pct_change())

def fun(w):
import math
w = np.array(w)
w /=sum(w)
mean = w.T.dot(mu)
std = math.sqrt(w.T.dot(cov).dot(w))
return np.array([mean,std])

def minvar(w):
return fun(w)[1]

def port_opt(mu,cov,r):
from scipy.optimize import minimize
con = ({‘type’:‘eq’,‘fun’:lambda x: np.sum(x)-1},
{‘type’:‘eq’,‘fun’:lambda x :fun(x)[0]- r})
bnds = tuple((0,1) for i in range(5))
an = minimize(minvar,np.zeros(5),method=‘SLSQP’,bounds = bnds,constraints = con)
return an[‘x’].dot(mu),an[‘fun’]

for r in np.linspace(0,0.01,10):
port_mean = []
port_std = []
[mean,std] = port_opt(mu,cov,r)
port_mean.append(mean)
port_std.append(std)
port_mean = np.array(port_mean)
port_std = np.array(port_std)

risk_free = 0.03
plt.scatter(port_mean,port_std,c = (port_mean - risk_free)/port_std,marker = ‘o’)
plt.plot(port_mean,port_std,c = ‘r’)
plt.colorbar()


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值