株式データ間のベンチマークに CCR データ包絡分析モデルを適用しています。そのために、ここで公開されている DEA の論文から R コードを実行しています。このドキュメントでは、lpSolve を使用して線形問題を解きます。lpSolve のドキュメントはこちらです。
このドキュメントには、以下のモデルを R で実装する方法についての段階的な説明が含まれています。
背景情報:
Data Envelopment Analysis (=DEA) は、複数のデータ入力を複数のデータ出力に変換する意思決定ユニットと呼ばれる一連のエンティティのパフォーマンスを評価するためのデータ指向のアプローチです。DEA は、意思決定ユニット (DMU) のパフォーマンスを評価および比較するために使用されます。効率フロンティアへの近さを考慮して、生産単位の相対的な効率を決定することによって。
評価する DMU が n 個あると仮定します。各 DMU は、さまざまな量のさまざまな入力を消費して、さまざまな出力を生成します。具体的には、入力量を消費し、出力量を生成します。さらに , ≥ 0 であり、各 DMU には少なくとも 1 つの正の入力値と 1 つの正の出力値があると仮定します。CCR モデルの目的は、線形計画法を使用して重み を決定し、各意思決定ユニットの複合効率を最大化することです。これは次の比率で定義されます。
これは、次のような線形問題に変わります。
応用:
この効率モデルを株式データの CAPM リスク要因に適用しています。
5入力-1出力の場合です
ここでの目的は、分析される各アセットの「最適な」重みのセット (1、1...5) を見つけることです。ここで「最良」という用語は、これらの重みがすべての DMU/株式 (1...10) のインプットとアウトプットに割り当てられたときに、上記の比率が他のすべての比率と比較して最大になることを意味するために使用されます。
これは、すべての値が 0 から 1 の間にあるように標準化された生のサンプル z スコア データです。
> dput(testdfst)
structure(list(Name = structure(1:10, .Label = c("Stock1", "Stock2",
"Stock3", "Stock4", "Stock5", "Stock6", "Stock7", "Stock8", "Stock9",
"Stock10"), class = "factor"), Date = structure(c(14917, 14917,
14917, 14917, 14917, 14917, 14917, 14917, 14917, 14917), class = "Date"),
`(Intercept)` = c(0.454991569278089, 1, 0, 0.459437188169979,
0.520523252955415, 0.827294243132907, 0.642696631099892,
0.166219881886161, 0.086341470900152, 0.882092217743293),
rmrf = c(0.373075150411683, 0.0349067218712968, 0.895550280607866,
1, 0.180151549474574, 0.28669170468735, 0.0939821798173586,
0, 0.269645291515763, 0.0900619760898984), smb = c(0.764987877309785,
0.509094491489323, 0.933653313048327, 0.355340700554647,
0.654000372286503, 1, 0, 0.221454091364611, 0.660571586102851,
0.545086931342479), hml = c(0.100608151187926, 0.155064872867367,
1, 0.464298576152336, 0.110803875258027, 0.0720803195598597,
0, 0.132407005239869, 0.059742053684015, 0.0661623383303703
), rmw = c(0.544512524466665, 0.0761995312858816, 1, 0, 0.507699534880555,
0.590607506295898, 0.460148690870041, 0.451871218073951,
0.801698199214685, 0.429094840372901), cma = c(0.671162426988512,
0.658898571758625, 0, 0.695830176886926, 0.567814542084284,
0.942862571603074, 1, 0.37571611336359, 0.72565234813082,
0.636762557753099), Returns = c(0.601347600017365, 0.806071701848376,
0.187500487065719, 0.602971876359073, 0.470386289298666,
0.655773224143057, 0.414258177255333, 0, 0.266112191477882,
1)), .Names = c("Name", "Date", "(Intercept)", "rmrf", "smb",
"hml", "rmw", "cma", "Returns"), row.names = c("Stock1.2010-11-04",
"Stock2.2010-11-04", "Stock3.2010-11-04", "Stock4.2010-11-04",
"Stock5.2010-11-04", "Stock6.2010-11-04", "Stock7.2010-11-04",
"Stock8.2010-11-04", "Stock9.2010-11-04", "Stock10.2010-11-04"
), class = "data.frame")
上記のデータを、冒頭で述べた論文から取得した R コードで実行します。データ フレームからの切片変数testdfst
は計算から除外されることに注意してください。
require(lpSolve)
dea_results <- list()
namesDMU <- testdfst[1]
inputs <- testdfst[c(4,5,6,7,8)]
outputs <- testdfst[9]
N <- dim(testdfst)[1] # number of DMU
s <- dim(inputs)[2] # number of inputs
m <- dim(outputs)[2] # number of outputs
f.rhs <- c(rep(0,N),1) # RHS constraints
f.dir <- c(rep("<=",N),"=") # directions of the constraints
aux <- cbind(-1*inputs,outputs) # matrix of constraint coefficients in (6)
for (i in 1:N) {
f.obj <- c(0*rep(1,s),outputs[i,]) # objective function coefficients
f.con <- rbind(aux, c(as.matrix(inputs[i,]), rep(0, m))) # add LHS of bTz=1
results <-lp("max",f.obj,f.con,f.dir,f.rhs,scale=1,compute.sens=TRUE) # solve LPP
multipliers <- results$solution # input and output weights
efficiency <- results$objval # efficiency score
duals <- results$duals # shadow prices
if (i==1) {
weights <- multipliers
effcrs <- efficiency
lambdas <- duals [seq(1,N)]
} else {
weights <- rbind(weights,multipliers)
effcrs <- rbind(effcrs , efficiency)
lambdas <- rbind(lambdas,duals[seq(1,N)])
}
}
report <- as.data.frame(cbind(effcrs,weights))
colnames(report) <- c('efficiency',names(inputs),
names(outputs)) # header
rownames(report) <- namesDMU[,1]
コードの説明:
私の問題に関連している可能性があります: z >= 0 の部分に注意してください。私が間違っている場合は訂正してください。ただし、この制限はコードに直接含まれていないため、lpSolve はデフォルトでこれを使用する必要がありますか? この部分を正しく識別できれば、問題を解決できるように微調整できます。
問題:
これが最終結果です。
> report
efficiency rmrf smb hml rmw cma Returns
Stock1 0.5674100 0 0.000000 0.1769187 0.0000000 1.4634319 0.9435640
Stock2 1.0000000 0 0.000000 0.0000000 0.7713486 1.4284803 1.2405844
Stock3 1.0000000 0 1.071061 0.0000000 0.0000000 7.4588210 5.3333195
Stock4 1.0000000 0 1.930968 0.0000000 0.7427269 0.4510419 1.6584521
Stock5 0.5218197 0 0.000000 0.2080023 0.0000000 1.7205486 1.1093429
Stock6 0.5498426 0 0.000000 9.3299443 0.0000000 0.3473408 0.8384645
Stock7 1.0000000 0 3.260381 0.0000000 0.0000000 1.0000000 2.4139536
Stock8 0.0000000 0 0.000000 0.0000000 2.2130199 0.0000000 0.0000000
Stock9 0.2756548 0 0.000000 11.5264372 0.0000000 0.4291132 1.0358592
Stock10 1.0000000 0 0.000000 0.1875005 0.0000000 1.5509620 1.0000000
RMRF 入力には、すべてのケースで 0 の重みが割り当てられています。この効率測定を私が適用している状況に関連させるには、各計算で 5 つの入力すべてを考慮する必要があります。
私が解決しようとしている問題は、重みをさらに制限することです。5 つの入力すべてを問題に組み込みたいので、「v」の重みを次のように制限したいと思います。
0.2 <= V(n) / V(n+1) <=5
と同じです
1/5 <= V(n) / V(n+1) <= 5/1
このようにして、すべてのウェイトを他のウェイトの最大 5 倍に制限し、最小で 5 分の 1 に制限する必要があります。
モデルの各変数をチェックし、いくつかの異なるデータセットも試しました。また、データ フレーム内の rmrf と smb の場所を入れ替えて、コードに問題があるのかデータに問題があるのかを確認しました。
efficiency smb rmrf hml rmw cma Returns
Stock1 1.0000000 0.2540156 0.0000000 1.1812905 1.043781 0.03466956 1.000000
Stock2 1.0000000 1.2150960 0.0000000 0.5443910 2.854127 0.00000000 2.422061
Stock3 1.0000000 0.0000000 0.0000000 1.0000000 0.000000 1.48815164 1.104670
Stock4 1.0000000 1.2348830 0.0000000 0.0000000 4.088438 0.89216307 3.674087
Stock5 0.8151261 0.0000000 0.0000000 0.5921236 1.173539 0.61261329 1.231220
Stock6 0.1491688 0.0000000 0.0000000 2.8715984 1.262761 0.00000000 1.148347
Stock7 1.0000000 2.0599619 0.0000000 0.0000000 0.000000 1.03785902 1.520484
Stock8 1.0000000 0.8346388 0.1206426 0.0000000 1.862840 0.00000000 1.535768
Stock9 0.0000000 0.0000000 0.0000000 0.0000000 1.167498 0.00000000 0.000000
Stock10 0.8065724 0.0000000 0.6973118 2.9529776 1.318778 0.00000000 1.357774
さまざまなデータセットを試してみたところ、RMRF が含まれている例外 (上記のような) があるようです。私の問題に対する答えは非常に単純であると信じ始めています。プログラムは、私の RMRF 入力を計算に含めないことが最適であると判断しました。そして、これに対する解決策は、重みに対する追加の制限です。
これは、標準化されていない入力を使用したソリューションの例です(データ内の数値の分布がまったく異なります)
efficiency smb rmrf hml rmw cma Returns
Stock1 1 0 1.0775390 0 0 0 346.1943
Stock2 0 0 1.3576882 0 0 0 0.0000
Stock3 0 0 0.7443477 0 0 0 0.0000
Stock4 0 0 0.6879011 0 0 0 0.0000
Stock5 0 0 1.2115507 0 0 0 0.0000
Stock6 0 0 1.1305046 0 0 0 0.0000
Stock7 0 0 1.2472639 0 0 0 0.0000
Stock8 0 0 1.4552312 0 0 0 0.0000
Stock9 0 0 1.1937843 0 0 0 0.0000
Stock10 0 0 1.3569824 0 0 0 0.0000