シミュレートされた観測のデータ フレームがあり、特定のレベルのリスクに対して最大限の成功を収めるための最適化を考えようとしています。問題は、制約でプログラムする方法がわからないことです。これは私の DF のサブセットです。行はチームで、X1:X10 は成功と失敗のシミュレートされた結果です。
X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
1 0 1 0 1 0 0 0 1 1 0
2 0 1 0 0 1 1 1 1 1 1
3 1 0 0 0 0 0 0 1 1 0
4 1 0 1 1 1 0 0 1 0 1
5 0 0 1 0 1 0 1 1 1 0
6 0 1 0 1 0 1 1 0 1 1
7 1 0 0 0 0 1 1 1 1 0
8 0 0 1 1 0 0 1 1 0 1
9 1 0 0 0 0 1 1 1 1 0
10 0 1 1 0 0 1 0 1 0 0
目標は最大化することですsum(colMeans(DF))
以下のコメントに基づいて、解決しようとしている数学を書き出すことにしました。これを行うにはいくつかの異なる方法がありますが、調査によると思われますが、制約を記述する方法がわかりません。私のより大きなデータセットは 10,000 X 10,000 です。
1 つのアプローチ
目的関数 = 最大 (平均 (合計 (シミュレーション [i])
制約:
観測はバイナリです
観察 = 4
SD(ポートフォリオ)) < X 、または最小(成功) > 3
その他のアプローチ:
目的関数 = 最小 (SD (合計 (シミュレーション [i])) または最大 ((平均 (合計 (シミュレーション [i]))/(SD (ポートフォリオ)
制約:
観測はバイナリです
観察 = 4
Average(sum(シミュレーション[i])) > 5
それで、私はこれをもう少しいじっていて、どこかに行き始めています。
library(quantprog)
library(Matrix)
dmat = cov(t(df))
dmat = dmat$mat
dvec = rowMeans(df)
n = nrow(dmat)
Amat = matrix(1,nrow = n)
bvec = 1
meq = 1
sol <- solve.QP(dmat, dvec = -dvec, Amat = Amat, meq = meq)
sol
$solution
[1] -2.2700081 -1.0040420 5.9587712 -2.8265966 0.2037187 1.1641067 -2.0099030 1.5024252 -2.0099030
[10] 1.2914309
$value
[1] -0.730477
$unconstrained.solution
[1] 6.750 6.750 6.750 -81.000 -38.250 -78.750 -12.375 36.000 -12.375 -29.250
$iterations
[1] 2 0
$Lagrangian
[1] 0.5626516
$iact
[1] 1
この変更を行う bvec = c(1, rep(0|-.25, n))
と、基本的にすべて 0 の解が得られます。
$solution
[1] 6.018572e-17 -5.455221e-16 4.873879e-13 -4.176466e-15 -8.236146e-17 -2.663993e-16 9.764273e-17
[8] -4.092027e-17 -2.630662e-13 0.000000e+00
tseries を使用して、これらの結果を得ました。
portfolio.optim(t(df), covmat = as.matrix(dmat) )
$pw
[1] -6.146157e-17 8.336774e-20 1.818182e-01 2.272727e-01 1.212121e-01 3.030303e-01 0.000000e+00
[8] 2.658696e-17 6.164972e-15 1.666667e-01
$px
[1] 0.4090909 0.4696970 0.5151515 0.5303030 0.3484848 0.4696970 0.4242424 0.6969697 0.6060606 0.5303030
$pm
[1] 0.5
$ps
[1] 0.1005038
tseries の重み制約を取得できれば、それも機能します。
制約の編集に関するヒントは、最小成功率も制約として追加したいと考えています。ありがとう、