Я создаю процесс контроля четности, когда мне нужно использовать метод Power, это итеративный процесс для поиска собственных значений системы.Метод мощности - Не сходящаяся система
Цель состоит в том, чтобы найти вес в активе eaach, который вы готовы инвестировать.
Для того, чтобы понять, что мне нужно реализовать способ питания, таким образом, я предполагаю, что вес каждого актива, и я ищу, если действительно удовлетворяет текущее состояние:
sqr((1/(N-1))Sum((Xi*Betai - 1/N)^2) < epsilon
Где SQR квадратный корень N количество активов Си вес каждого актива Betai бета каждого актива эпсилон порогового значения, что я решил
бета может быть найдена как
Covariance i with P/variance of P
я это я актив и P портфель
, когда мое состояние не соблюдается, я перераспределить свои бета, как мой новый вес, пока мое состояние не соблюдаются.
Проблема в том, что система не сходится, а взрывается. Я думал, что я уважал отлично статью Denis B Шавеш Jason C. Hsu Feifei Ли и Омид Shakernia:
Efficient Algorithms for Computing Risk Parity Portfolio Weights
Я пытался реализовать алгоритм 2 на странице 7
Это мой код:
Sub RiskParityPowerMethod()
'prendre des poids equiponderes
Dim lastColumnReturn As Long
Dim lastRowReturn As Long
Dim tempReturnPtf As Double
lastRowReturn = Cells(Rows.Count, 1).End(xlUp).Row
lastColumnReturn = Cells(1, Columns.Count).End(xlToLeft).Column
'calcul du rendement du portefeuille pour les 90 premieres dates
Sheets("Return").Select
For k = 3 To 92
tempReturnPtf = 0
For j = 3 To lastColumnReturn
tempReturnPtf = tempReturnPtf + (1/(lastColumnReturn - 2) * Cells(k, j))
Next j
Sheets("Portfolio").Cells(k, 2).Value = tempReturnPtf
Cells(k, 2).Value = tempReturnPtf
Next k
ReDim vecteurPoids(3 To lastColumnReturn)
ReDim covarIP(3 To lastColumnReturn)
ReDim matrixVarCovar(92 To lastRowReturn, 3 To lastColumnReturn, 3 To lastColumnReturn)
ReDim matrixVarCovarFinal(3 To lastColumnReturn, 3 To lastColumnReturn)
ReDim beta(3 To lastColumnReturn)
For k = 92 To lastRowReturn
'initialisation des poids
For i = 3 To lastColumnReturn
vecteurPoids(i) = 1/(lastColumnReturn - 2)
Next i
Condition = 1
seuil = 0.05
While Condition > seuil
'calcul du return du portefeuille
tempReturnPtf = 0
For i = 3 To lastColumnReturn
tempReturnPtf = tempReturnPtf + vecteurPoids(i) * Sheets("Return").Cells(k, i).Value
Next i
Sheets("Portfolio").Cells(k, 2).Value = tempReturnPtf
Cells(k, 2).Value = tempReturnPtf
'calcul de la covariance de l'actif i avec le portefeuille
For i = 3 To lastColumnReturn
covarIP(i) = Application.WorksheetFunction.Covar(Range(Cells(k - 90, i), Cells(k, i)), Range(Cells(k - 90, 2), Cells(k, 2)))
Next i
'i is the asset i
For i = 3 To lastColumnReturn
'j is the asset j
For j = 3 To lastColumnReturn
'Sheets("Return").Select
matrixVarCovar(k, i, j) = Application.WorksheetFunction.Covar(Range(Cells(k - 90, i), Cells(k, i)), Range(Cells(k - 90, j), Cells(k, j)))
matrixVarCovarFinal(i, j) = matrixVarCovar(k, i, j)
Next j
Next i
'calcul de la volatilite du portefeuille
tempVolPtf = 0
For i = 3 To lastColumnReturn
For j = 3 To lastColumnReturn
tempVolPtf = tempVolPtf + (matrixVarCovar(k, i, j)) * vecteurPoids(i) * vecteurPoids(j)
Next j
Next i
volPtfCarre = tempVolPtf
'calcul du beta pour chaque actif
For i = 3 To lastColumnReturn
beta(i) = covarIP(i)/volPtfCarre
Next i
'condition d'iteration
For i = 3 To lastColumnReturn
tempCondition = tempCondition + (vecteurPoids(i) * beta(i) - (1/(lastColumnReturn - 2)))^(2)
'MsgBox tempCondition
Next i
tempCondition = (1/(lastColumnReturn - 2 - 1)) * tempCondition
'MsgBox tempCondition
Condition = Sqr(tempCondition)
MsgBox Condition
If Condition > seuil Then
'changement des poids
tempSumBeta = 0
For i = 3 To lastColumnReturn
tempSumBeta = tempSumBeta + (1/beta(i))
Next i
sumBeta = tempSumBeta
For i = 3 To lastColumnReturn
vecteurPoids(i) = (1/beta(i))/(1/sumBeta)
'MsgBox vecteurPoids(i)
Next i
End If
Wend
Next k
End Sub
любая идея, почему система не сходится, а взрывается вместо этого?