投资组合优化器说白了就是算资产根据收益搭配出来的最优解。
下面搞个马科维兹投资组合(MM理论,CFA12级都时不时拿出来提),非市场中性,不允许做空前提的计算。
import numpy as np
import pandas as pd
import cvxopt as opt
import cvxopt.solvers as optsolvers
#Create a portfolio
np.random.seed(42) #固定随机数,使之后都一样
trading_days = 1000
##造756天,五个不同资产的return。仅从quant角度,个人真的选资产的时候也会去选三年,苗头整体均值为正,平坦一些的。
asset_1 = np.random.normal(loc=0.07,scale=0.001,size=(756,1))
asset_2 = np.random.normal(loc=0.1,scale=0.05,size=(756,1))
asset_3 = np.random.normal(loc=0.02,scale=0.006,size=(756,1))
asset_4 = np.random.normal(loc=0.03,scale=0.004,size=(756,1))
asset_5 = np.random.normal(loc=0.0102,scale=0.006,size=(756,1))
port_assets = np.c_[asset_1,asset_2,asset_3,asset_4,asset_5]
dates = pd.date_range('12/01/2014',periods=756,freq='D',tz='UTC') #日期就不搞交易日啦,有个日期就好~
assets = ['asset_1','asset_2','asset_3','asset_4','asset_5']
##需要拿的一些项
returns = pd.DataFrame(port_assets,columns=assets,index=dates)
return_on_average = returns.mean()
assets_covar = returns.cov()
target_return = return_on_average.quantile(0.6) #高于这五个里面的6分位就满足。
##假设
allow_short = 'False' #简单点 Long_only
market_neutral = 'False' #个人还是不太相信中国A股能用市场中性假说。
#接下来开算这一组五个资产搭配情况马科维滋滋滋,也就是一个cost function
P = opt.matrix(assets_covar.values)
q = opt.matrix(0.0,(5,1))
##if not allow_short,inequality限制 第一行,投资组合return大于等于目标return;余下行表达,单个资产组合权重大于等于零。因此得G,h。
G = opt.matrix(np.vstack((-return_on_average.values,-np.identity(5))))#55对角线上为1的正方形接在return数组的后面。
h = opt.matrix(np.vstack((-target_return,+np.zeros((5,1)))))
##if not market_neutral, 需要所有x相加等于1,因此得A,b。equality 限制
A = opt.matrix(1.0,(1,5))
b = opt.matrix(1.0)
#矩阵都确定后,开始算optimal_weights。
optsolvers.options['show_progress'] = False
sol = optsolvers.qp(P,q,G,h,A,b) #量子编程初级这里须走起。https://courses.csail.mit.edu/6.867/wiki/images/a/a7/Qp-cvxopt.pdf
asset_weights = pd.Series(sol['x'],index=assets_covar.index)
print('The result is {}\n{}'.format(sol['status'],asset_weights))
The result is optimal
asset_1 0.858860
asset_2 0.002178
asset_3 0.041741
asset_4 0.059930
asset_5 0.037292
dtype: float64
觉得能说通一个假说就行...其他资产配置理论求最优解,多少都这么玩儿。