Parallel Computing Toolbox

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

分散的方法によるポートフォリオの最適化

この例では Parallel Computing Toolbox™ を使用して、株式ポートフォリオに対し平均分散によるポートフォリオ最適化を実行し、効率的フロンティアを生成します。フロンティア上のポートフォリオは、特定レベルの期待収益に対しリスクが最小になるという意味で、最適となっています。

ここでは、ひとまとまりの株について、ある固定期間における日次収益が与えられます。ポートフォリオから特定の収益 mu を得て平均分散的にリスクが最小となるように、ポートフォオの選択を試みます。これは、等式制約を伴う 2 次最小化問題の解決につながります。mu の値の範囲に対するこの最小化問題の解決により、効率的フロンティアが与えられます。

計算についての詳細は、pctdemo_setup_optim のコードを参照pctdemo_setup_optim のコードを参照してください。

必要条件:

関連する例:

逐次的問題の解析

最初に、この例での計算が、「MATLAB 演算をタスクに分割」の例で紹介したモデルにどのように適合するかを見ます。主な計算は、muVec におけるパラメーターのさまざまな値を使用して最適化を繰り返し実行することです。それぞれの最適化にはさほど時間がかからないため、各タスクで多くの最適化を実行します。関数 pctdemo_task_optim は既にベクトル化されているため、そのままタスク関数として使用できます。

例の設定とデータの読み込み

この例では、既定のプロファイルに基づいて、使用するクラスターを識別します。新しいプロファイルを作成する方法および既定のプロファイルを変更する方法については、プロファイルのドキュメンテーションプロファイルのドキュメンテーションを参照してください。例の難易度または作成されるタスクの数を変更する方法については、「Parallel Computing Toolbox の例の設定をカスタマイズ」を参照してください。

[difficulty, myCluster, numTasks] = pctdemo_helper_getDefaults();

関数 pctdemo_setup_optim は株式収益についての履歴データを使用して、株式収益の平均および共分散の行列を提供します。また、目的収益 muVec も与えられ、これに対する最小のリスクを見出す必要があります。この例では、難易度によってベクトル muVec の長さが制御されます。また、関数 pctdemo_setup_optim は参照として、ポートフォリオ内のいくつかの株について日次収益のグラフを表示します。詳細は、pctdemo_setup_optim のコードを参照pctdemo_setup_optim のコードを参照してください。

[fig, muVec, covMat, expRet ] = pctdemo_setup_optim(difficulty);
startTime = clock;

作業を小さいタスクに分割

ベクトル muVecnumTasks 個のセグメントに分割します。こうすることで、パラメーター空間が、タスクで扱うことのできる断片に効果的に分割されます。

[muSplit, numTasks] = pctdemo_helper_split_vector(muVec, numTasks);
fprintf(['This example will submit a job with %d task(s) ' ...
         'to the cluster.\n'], numTasks);
This example will submit a job with 4 task(s) to the cluster.

ジョブの作成と投入

最適化ジョブと、そのジョブ内のタスクを作成します。タスク i は、muSplit{i} に含まれているすべての値に対し最適化を実行します。詳細は、pctdemo_task_optim のコードを参照pctdemo_task_optim のコードを参照してください。

job = createJob(myCluster);
for i = 1:numTasks
    createTask(job, @pctdemo_task_optim, 2, ...
               {covMat, expRet, muSplit{i}});
end

ジョブを投入して完了するまで待ちます。

submit(job);
wait(job);

結果の取得

ジョブの結果を取得し、すべてのタスクが正常に終了したことを確認し、そのうえでジョブを削除します。タスクが正常に完了しなかった場合は fetchOutputs がエラーをスローしますが、この場合、エラーをスローする前にジョブを削除しておく必要があります。

try
    jobResults = fetchOutputs(job);
catch err
    delete(job);
    rethrow(err);
end

個々のタスクからの結果を、リスクと収益を表す 2 つのベクトルにまとめます。

risk = [jobResults{:, 1}];
ret = [jobResults{:, 2}];

すべての検証が完了したので、ジョブを削除します。

delete(job);

経過時間の測定

分散計算で使用される時間は、「逐次的方法によるポートフォリオの最適化」の例において、同じ一連の計算を実行するためにかかる時間と比較する必要があります。経過時間は基礎となるハードウェアおよびネットワーク インフラストラクチャによって変わります。

elapsedTime = etime(clock, startTime);
fprintf('Elapsed time is %2.1f seconds\n', elapsedTime);
Elapsed time is 32.0 seconds

結果のプロット

関数 pctdemo_plot_optim を使用して、効率的フロンティアのグラフを表示します。詳細は、pctdemo_plot_optim のコードを参照pctdemo_plot_optim のコードを参照してください。

pctdemo_plot_optim(fig, risk, ret);