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 库)方法?如果没有任何关于我应该使用什么方法来执行上述操作的建议,欢迎提出。

先感谢您

4

2 回答 2

0

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

相关位在这里:

这是我找到的一篇文章的引述。

一些研究表明,“平均方差投资组合优化”可以产生良好的结果。我在留言中讨论过这个

为了实现这种方法,需要的输入是收益的协方差矩阵,它需要历史股票价格,可以使用“Python 报价采集器” http://www.openvest.org/Databases/ovpyq获得。

对于预期回报——嗯。我引用的一篇论文发现,假设所有股票的预期回报相等,可以得出合理的结果。

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

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

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

于 2012-04-12T17:00:58.777 回答
0

我的完整解决方案可以在 PDF中查看。

诀窍是将向量x_i作为矩阵的列X
然后写问题变成了一个凸问题,解决方案限制在单位单纯形上。

我使用Projected Sub Gradient Method解决了它。
我计算了目标函数的 Gradient 并创建了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 存储库中查看完整代码(也提供 PDF)。

该解决方案取自StackOverflow Q44984132

于 2017-07-08T19:07:02.110 回答