2

Power メソッドを使用する必要があるリスク パリティ プロセスを作成しています。これは、システムの固有値を見つけるための反復プロセスです。

目的は、投資する準備ができている各資産の重みを見つけることです。

べき乗法を実現する必要があることを理解するために、各資産の重みを推測し、現在の条件を満たしているかどうかを調べています。

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

ここで、sqr は平方根 N 資産の数 Xi 各資産の重み Betai 各資産のベータ イプシロン 私が決めたしきい値

ベータ版は次のように見つけることができます

Covariance i with P / variance of P

i は資産 i、P はポートフォリオ

私の状態が尊重されない場合、私の状態が尊重されるまで、ベータを新しい体重として再割り当てします。

問題は、システムが収束せずに爆発することです。私は、Denis B Chaves Jason C. Hsu Feifei Li と Omid Shakernia の記事を完全に尊重していると思いました。

リスク パリティ ポートフォリオ ウェイトを計算するための効率的なアルゴリズム

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

システムが収束せず、代わりに爆発する理由は何ですか?

4

1 に答える 1

1

最後に、変数 condition と tempSumBeta を初期化すると、システムは 0,57 まで収束します。

    Condition = 0
    seuil = 0.57

While Condition < seuil

     tempSumBeta = 0
     Condition = 0
于 2013-05-11T17:49:51.747 に答える