カスタムのモーメント関数を定義する
制約付き最適化の多くのケースでは、ポートフォリオ・マネージャーやアナリストが、特定の手法でモーメントを推定したり、set.portfolio.moments() の考え方をさらに拡張したりしたい場合があります。ユーザー定義のカスタム・モーメント関数は、任意の名前付き引数を取れます。ただし、資産リターンを表す R とポートフォリオオブジェクトを表す portfolio という引数名は自動的に検出され、効率的に処理されます。したがって、資産リターンのオブジェクトには R、ポートフォリオのオブジェクトには portfolio を使うことを強く推奨します。
カスタム・モーメント関数は、各要素がモーメントを表す名前付きリストを返す必要があります。
$mu: 第1モーメント(期待リターンベクトル)$sigma: 第2モーメント(分散共分散行列)$m3: 第3モーメント(コスキューネス行列)$m4: 第4モーメント(コカートシス行列)
この演習では、ロバストな方法を用いて分散共分散行列を推定するカスタム・モーメント関数を作成します。ここでは MASS パッケージの cov.rob() 関数を使います。関数のシグネチャには、資産リターンを表す引数名 R と、仕様オブジェクトを表す引数名 portfolio を含めてください。関数は名前付きリストを返す必要があります。今回は第2モーメントのみを推定するので、要素が1つだけのリストを適切な名前で返せば十分です。これらのルールは、ファクターモデル、GARCHモデル、その他サンプル推定より理論的に優れていると考えられる任意のモデルのカスタム・モーメント関数にも応用できます。
この演習はコースの一部です
Rで学ぶ中級ポートフォリオ分析
演習の手順
"mcd"メソッドを使って資産リターンの分散共分散行列を推定するmoments_robustという関数を定義してください。- いま定義したポートフォリオ・モーメントを推定し、
momentsという変数に代入してください。これは、作成したカスタム・モーメント関数が想定どおり動作するかを確認するためです。 cov.rob()を使って分散共分散行列を直接計算し、それがmoments$sigmaと等しいかを確認してください。
実践的なインタラクティブ演習
このサンプルコードを完成させて、この演習に挑戦してみましょう。
# Define custom moment function
moments_robust <- function(R, portfolio){
out <- list()
out$___ <- cov.rob(R, method = ___)$cov
out
}
# Estimate the portfolio moments using the function you just defined
moments <- moments_robust(R = ___, portfolio = ___)
# Check the moment estimate
cov.rob(___, method = ___)$cov == moments$___