2016-06-10 58 views
1

我正在解决一个投资组合优化问题,我需要以这样的方式分配权重(资本),以使最终投资组合具有最低的历史波动率。目前,我对每只股票的权重总和及其平方权重有两个限制。分配到每只股票的边界是(0.00,0,02)。有多重边界的Scipy优化

目前我的代码看起来是这样的:

def portfolio_vol(w): 
    #compute porfolio volatility 
    portfolio_volatility = np.sqrt(w.T.dot(cov_matrix).dot(w)) 
    return portfolio_volatility 

ww = 1.0/len(composition)

def find_optimal_allocations(): 
    bnds = tuple((0.00, 0.02) for x in weights) 
    cons = ({'type': 'eq', 'fun': lambda x: 1 - sum(x)}, {'type': 'ineq', 'fun': lambda x: -sum(x**2) + 0.02}) 
    result = spo.minimize(portfolio_vol, weights, method='SLSQP', bounds = bnds, constraints = cons) 
    return result.x 

我存储我的MultIndex熊猫系列的权重计算等权重的向量,其中股票是由国家分组并且最初是等重的:

Country Ticker   
AS  OMV AV Equity  0.020000 
BE  SOLB BB Equity  0.020000 
FI  NESTE FH Equity 0.020000 
FR  FP FP Equity  0.020000 
GB  LAND LN Equity  0.020000 
GE  BAS GR Equity  0.020000 
     HEI GR Equity  0.020000 
GR  TITK GA Equity  0.020000 
IR  CRH ID Equity  0.020000 
     RYA ID Equity  0.020000 
... 

US  AMAT US Equity  0.020000 
     AMGN US Equity  0.020000 
     APA US Equity  0.020000 

我想包括额外的约束中find_optimal_allocations(),所以我可以为每个国家最大重量设定限制:s.groupby(level=0,axis=0).sum()

Country 
AS 0.020000 
BE 0.020000 
FI 0.020000 
FR 0.020000 
GB 0.020000 
GE 0.040000 
GR 0.020000 
IR 0.040000 
US 0.400000 

例如withing了这些边界:

[(.05,.10), (.05,.10), (.05,.10), (.05,.10), (.05,.10), (.05,.10), (.05,.10), (.05,.10), (.05,.20)] 

我怎么能包括这些界限进入我的优化功能,以便同时考虑国家重量限制和个人库存限制?

回答

0

修改您的优化函数,使得如果任何资产的权重超出其界限,则会有高罚分。使用这个新功能,您可以尝试找到渐变并执行渐变上升,以优化您的回报/奖励。

+0

感谢您的回复。我不明白为什么我应该修改优化功能。我正在寻找为国家权重添加额外的界限,类似地,你如何在这个[post]中添加资产类的界限(http://stackoverflow.com/questions/18218355/scipy-optimization-with-grouped-bounds?rq = 1)据我了解,您分两步进行优化1)针对个人权重进行优化2)针对按资产类别分组的权重进行优化。但是我不完全理解代码。也许你可以解释你的解决方案背后的逻辑? –

+0

这是一个不理想的方法。底线是你希望在n维空间中找到一些局部最优解。为了简单起见,假设您只优化三种资产,因此您的目标是在3D表面上找到峰值。通过改变你的功能,你基本上修改了这个表面,使得在该界限之外行走相当于离开悬崖。 –