我正在研究投资组合优化算法,部分问题在于生成时刻匹配场景。
由于其简单性和快速性,我的选择是阅读论文“一种用于金融投资组合优化的时刻匹配场景生成算法”(Ponomareva、Roman 和 Date)。
问题是,即使数学非常简单,我仍然坚持这样一个事实,即一些概率权重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 也取负值。这是一个问题,因为 p 的前 s 个元素后来被用作 P 中的概率。我希望通过这种方式问题更清楚。我还想补充一点,在论文中报告了作者使用的数据,不幸的是,在 R 中导入它们需要手动导入它们。但是我重复任何data.frame()
包含资产的回报就可以了。