#r #while-loop #finance #scenarios #r-portfolioanalytics
Вопрос:
Я работаю над алгоритмом оптимизации портфеля, и часть проблемы заключается в создании сценария сопоставления моментов.
Мой выбор из-за его простоты и быстроты состоял в том, чтобы прочитать статью «Алгоритм генерации сценариев, соответствующих моменту, с применением к оптимизации финансового портфеля» (Пономарева, Роман и Дата).
Проблема в том, что, хотя математика очень проста, я застрял на том факте, что некоторые веса вероятности pi
отрицательны, хотя формулы в статье должны гарантировать обратное. Если я помещу цикл для запуска алгоритма до тех пор, пока он не найдет положительную комбинацию, он, по сути, будет работать вечно.
Я поместил кусочек кода на основе бумаги, если что-то застрянет:
dummy1 = 0
while (dummy1 <=0 | dummy1 >= 1) {
dummy1 = round(rnorm(1, mean = 0.5, sd = 0.25), 2)
}
diag.cov.returns = diag(cov.returns)
Z = dummy1 * sqrt (diag.cov.returns) #Vector Z according to paper formula
ZZT = Z %*% t(Z)
LLT = cov.returns - ZZT
L = chol(LLT) #cholesky decomposition to get matrix L
s = sample (1:5, 1)
F1 = 0
F2 = -1
S = (2*N*s) 3
while (((4*F2)-(3*F1*F1)) < 0) {
#Gamma = (2*s*s)*(((N*mean.fourth) - (0.75*(sum(Z^4)* (N*mean.third/sum(Z^3))^2)))/sum(L^4))
#Gamma is necessary if we want to get p from Uniform Distribution
#U = runif(s, 0, 1)
U = rgamma(s, shape = 1, scale = ((1/exp(1)):1))
#p = (s*(N/Gamma)) ((1/(2*N*s)) - (s/(N*Gamma)))*U
p = (-log(U, base = exp(1)))
p = p/(((2*sum(p)) max(p))*N*s) #this is the array expected to have positive and bounded between 0 and 1
q1 = 1/p
pz = p
p[s 1] = (1-(2*N*sum(p))) #extra point necessary to get the 3 moment mathcing probabilities
F1 = (N*mean.third*sqrt(p[s 1]))/(sum(Z^3))
F2 = p[s 1]*(((N*mean.fourth) - (1/(2*s*s))*sum(L^4)*(sum(1/p)))/sum(Z^4))
}
alpha = (0.5*F1) 0.5*sqrt((4*F2)-(3*F1*F1))
beta = -(0.5*F1) 0.5*sqrt((4*F2)-(3*F1*F1))
w1 = 1/(alpha*(alpha beta))
w2 = 1/(beta*(alpha beta))
w0 = 1 - (1/(alpha*beta))
P = rep(pz, 2*N) #Vector with Probabilities starting from p 3 extra probabilities to match third and fourth moments
P[(2*N*s) 1] = p[s 1]*w0
P[(2*N*s) 2] = p[s 1]*w1
P[(2*N*s) 3] = p[s 1]*w2
К сожалению, я не могу изменить цвет входного набора данных, содержащего возврат средств. Однако я, безусловно, могу быть более конкретным. Начиная с data.frame()
содержит N возвратов активов (в моем случае 11 средств и ежемесячные возвраты с 30/01/2001 по 30/09/2020). Как только среднее значение возвращается, вычисляется матрица ковариации, центральные третий и четвертый моменты (НЕ асимметрия и эксцесс) и средние значения. Алгоритм следует так, как я сообщил в задаче. Точка, в которой я застрял, заключается в том, что p принимает также отрицательные значения. Это проблема, так как первые s элементов p позже используются в качестве вероятностей в P.
Я надеюсь, что таким образом проблема станет более ясной. Я также хочу добавить, что в статье приводятся данные, используемые авторами, к сожалению, для их импорта в R потребуется импортировать их вручную. Однако я повторяю, что подойдет любая data.frame()
доходность активов, содержащих активы.
Комментарии:
1. Не могли бы вы опубликовать минимальный воспроизводимый пример, например, предоставив некоторые входные данные. Кроме того, не могли бы вы добавить комментарий к коду, чтобы описать, что пытается сделать каждый шаг? Какую переменную вы ожидаете увидеть положительной?
2. Я отредактировал текст, чтобы быть более ясным и конкретным. Я понял, что на самом деле я дал очень мало информации об этой проблеме. Надеюсь, это поможет.