2013-05-11 54 views
2

我正在創建一個風險平價過程,在這裏我需要使用Power方法,它是一個反覆查找系統特徵值的過程。電源方法 - 非收斂系統

目標是找到你準備投資的資產重量。

爲了實現我需要實現功率的方法,所以我想每個資產的權重,而我期待,如果不符合當前條件:

sqr((1/(N-1))Sum((Xi*Betai - 1/N)^2) < epsilon 

哪裏SQR是平方根 ñ資產的數量 僖每個資產 β1的每個資產 的beta小量的閾值,我決定

貝塔可以發現

01的重量

我是資產i和p組合

時,不尊重我的病情,我重新分配我的測試我的新的權重,直到我的病情得到尊重。

問題是系統不會收斂而是爆炸。我想,我尊重丹尼斯乙查韋斯賈森C.許菲菲李和奧米德Shakernia完美的文章:

Efficient Algorithms for Computing Risk Parity Portfolio Weights

我試着7頁

這對實現算法2是我的代碼:

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