2012-04-12 78 views
0

我正在寻找一种方法来选择最小化投资组合差异的权重。选择权重最小化投资组合差异

例如:

我有3个资产;他们的回报给出了如下的数组:

import numpy as np 
x = np.array([[0.2,-0.1,0.5,-0.2],[0, -0.9, 0.8, 0.2],[0.4,0.5,-0.3,-.01]]) 

我体重他们我只要想他们的权重总和增加了1.我在寻找这样的重量,最大限度地减少投资组合的方差。

以下是随机选择的权重的两个例子:

weight_1 = [0.3,0.3,0.4] 

weighted_x_1 = [ele_x*ele_w for ele_x,ele_w in zip (x,weight_1)] 

var_1 = np.var(sum(weighted_x_1)) 


weight_2 = [-0.2,0.4,0.8] 

weighted_x_2 = [ele_x*ele_w for ele_x,ele_w in zip (x,weight_2)] 

var_2 = np.var(sum(weighted_x_2)) 

输出:

>>> var_1 
0.02351675000000001 
>>> var_2 
0.012071999999999999 

第二种方法是更好的。

有没有可以为我做这个的Python(或Python库)方法?如果没有任何建议,我应该用什么方法来完成上述操作。

预先感谢您

+0

请参阅此问题的接受答案:http://stackoverflow.com/questions/4119054/finance-lib-with-portfolio-optimization-method-in-python – 2012-04-12 16:59:35

+1

这是一个线性代数问题。您可以使用线性编程或拉格朗日优化来解决此问题。你的约束(lambda期限)将是1 - 总和(权重)。 – 2012-04-12 17:05:46

+1

如何衡量“投资组合差异”? – 2012-04-12 17:06:57

回答

0

请参阅接受这个问题的答案:Finance Lib with portfolio optimization method in python

相关位是在这里:

下面是从后我发现了一个报价。

一些研究表明,“均值方差组合优化”可以给 带来好的结果。我讨论过这个在消息

要实现这种方法,需要输入的 收益的协方差矩阵,这需要历史股价,其中一个可以用“巨蟒报价抓取” http://www.openvest.org/Databases/ovpyq获得 。

对于预期回报 - 嗯。我引用的其中一篇论文发现 假设所有股票的期望收益相等,可以给出合理的 结果。

然后,需要一个“二次编程”解算器,它似乎是由CVXOPT Python包处理的 。

如果有人在Python中实现了这个方法,我很乐意听到关于它的 。

有一个“后台测试”包中的R(开源统计包调用 在Python)http://cran.r-project.org/web/packages/backtest/index.html “探索基于组合的假说有关金融工具 (股票,债券,掉期,期权,等等)。”

0

我的完整解决方案可以是viewed in PDF

诀窍是把矢量x_i作为矩阵X的列。
然后写出问题就成为一个凸单元问题,解决方案的约束条件是在单元单元上。

我用Projected Sub Gradient Method解决了它。
我计算了目标函数的梯度并创建了对Unit Simplex的投影。

现在所有需要的是迭代它们。
我使用CVX验证了我的解决方案。

% StackOverflow 44984132 
% How to calculate weight to minimize variance? 
% Remarks: 
% 1. sa 
% TODO: 
% 1. ds 
% Release Notes 
% - 1.0.000  08/07/2017 
% * First release. 


%% General Parameters 

run('InitScript.m'); 

figureIdx   = 0; %<! Continue from Question 1 
figureCounterSpec = '%04d'; 

generateFigures = OFF; 


%% Simulation Parameters 

dimOrder = 3; 
numSamples = 4; 

mX = randi([1, 10], [dimOrder, numSamples]); 
vE = ones([dimOrder, 1]); 


%% Solve Using CVX 

cvx_begin('quiet') 
    cvx_precision('best'); 
    variable vW(numSamples) 
    minimize((0.5 * sum_square_abs(mX * vW - (1/numSamples) * (vE.' * mX * vW) * vE))) 
    subject to 
     sum(vW) == 1; 
     vW >= 0; 
cvx_end 

disp([' ']); 
disp(['CVX Solution -      [ ', num2str(vW.'), ' ]']); 


%% Solve Using Projected Sub Gradient 

numIterations = 20000; 
stepSize  = 0.001; 
simplexRadius = 1; %<! Unit Simplex Radius 
stopThr   = 1e-6; 

hKernelFun = @(vW) ((mX * vW) - ((1/numSamples) * ((vE.' * mX * vW) * vE))); 
hObjFun  = @(vW) 0.5 * sum(hKernelFun(vW) .^ 2); 
hGradFun = @(vW) (mX.' * hKernelFun(vW)) - ((1/numSamples) * vE.' * (hKernelFun(vW)) * mX.' * vE); 

vW = rand([numSamples, 1]); 
vW = vW(:)/sum(vW); 

for ii = 1:numIterations 
    vGradW = hGradFun(vW); 
    vW = vW - (stepSize * vGradW); 

    % Projecting onto the Unit Simplex 
    % sum(vW) == 1, vW >= 0. 
    vW = ProjectSimplex(vW, simplexRadius, stopThr); 
end 

disp([' ']); 
disp(['Projected Sub Gradient Solution - [ ', num2str(vW.'), ' ]']); 


%% Restore Defaults 

% set(0, 'DefaultFigureWindowStyle', 'normal'); 
% set(0, 'DefaultAxesLooseInset', defaultLoosInset); 

您可以在StackOverflow Q44984132 Repository(PDF格式)中看到完整的代码。

该解决方案取自​​。