2012-04-12 12 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に追加されます。ここ

は、ランダムに選択された重みの2つの例は、次のとおり

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ライブラリ)メソッドがありますか?上記を行うためにどのような方法を使用すべきかについての示唆がない場合は、歓迎します。 Finance Lib with portfolio optimization method in python

関連ビットここにある:

はアドバンス

+0

この質問に対する受け入れられた答えを見てください:http://stackoverflow.com/questions/4119054/finance-lib-with-portfolio-optimization-method-in-python –

+1

これは線形代数の問題です。線形計画法またはラグランジュ最適化のいずれかを使用してこれを解決することができます。あなたの制約(ラムダ項)は1 - 合計(重み)になります。 –

+1

「ポートフォリオ分散」はどのように測定されますか? –

答えて

0

でこの質問への受け入れ答えをご覧ください。ありがとう

ここで私が見つけた記事からの引用です。

「平均分散ポートフォリオの最適化」は が良い結果をもたらすことができるとの調査もあります。私はこのアプローチを実装するにはメッセージ

でこれを議論し、必要な入力は1つが、「Pythonの引用グラバー」http://www.openvest.org/Databases/ovpyqを使用して を得ることができます歴史的な株価を、必要と リターンの共分散行列、です。

期待リターン - hmmm。私が引用した論文の1つは、 がすべての株の等しい期待収益率を仮定すると合理的な結果を与えることが分かった。 結果

次に、CVXOPT Pythonパッケージによって処理される と思われる「2次計画」ソルバーが必要です。

誰かがPythonでこのアプローチを実装している場合は、 と聞いてうれしいです。

「バックテスト」パッケージには、「金融商品 (株式、債券、スワップ、オプション、エトセトラ)に関するポートフォリオベースの仮説を探索するの。」R(パイソンから 呼び出し可能なオープンソースの統計パッケージ)http://cran.r-project.org/web/packages/backtest/index.html にあり

0

私の完全な解決策はviewed in PDFです。

トリックは、行列Xの列としてベクトルx_iを置くことです。
問題を書くことは、解がUnit Simplex上にあるという制約を伴う凸問題になります。

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は利用可能です)。

溶液は、​​から得た。

関連する問題