2013-05-11 2 views
2

Я создаю процесс контроля четности, когда мне нужно использовать метод 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 

любая идея, почему система не сходится, а взрывается вместо этого?

ответ

1

Наконец, если я инициализировать состояние переменной и tempSumBeta, моя система сходятся через 0,57:

Condition = 0 
    seuil = 0.57 

While Condition < seuil 

    tempSumBeta = 0 
    Condition = 0 
Смежные вопросы