我正在寻找一种方法来选择最小化投资组合差异的权重。
例如:
我有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 :(得分: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。