选择最小化投资组合差异的权重

时间:2012-04-12 16:55:52

标签: python numpy

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

例如:

我有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库)方法可以为我做到这一点?如果没有任何关于我应该使用哪种方法的建议,欢迎使用。

提前感谢

2 个答案:

答案 0 :(得分:0)

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

相关位在这里:

  

以下是我发现的帖子的引用。

     

一些研究表明“均值方差组合优化”可以   给出好的结果。我在一条消息中讨论了这个问题

     

为了实现这种方法,所需的输入是协方差矩阵   回报,这需要历史股票价格,谁可以获得   使用“Python quote grabber”http://www.openvest.org/Databases/ovpyq

     

预期回报 - 嗯。我引用的一篇论文发现了这一点   假设所有股票的预期收益相等可以给出合理的回报   结果

     

然后需要一个“二次规划”求解器,它似乎是   由CVXOPT Python包处理。

     

如果有人在Python中实现这种方法,我会很高兴听到   关于它。

     

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

答案 1 :(得分:0)

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

诀窍是将向量X作为矩阵% 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); 的列 然后编写问题变成了一个凸面问题,解决方案是单元单面上的。

我使用Projected Sub Gradient Method解决了它 我计算了目标函数的渐变,并创建了Unit Simplex的投影。

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

--request-required-acks "all"

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

解决方案取自StackOverflow Q44984132