Expliquons l'allocation d'actifs par le modèle Black Ritterman (avec un exemple d'exécution par Python)

introduction

Le modèle Black-Litterman est la méthode optimale de sélection de portefeuille pour l'investissement. Il est largement utilisé dans la pratique financière en raison de sa facilité d'utilisation car il fournit des résultats intuitifs et faciles à comprendre par rapport à l'optimisation utilisant l'approche traditionnelle de diversification moyenne. Dans cet article, je voudrais donner une explication approximative de ce que fait le modèle Black Ritterman, en utilisant également des chiffres. Veuillez vérifier les références pour plus de détails tels que la dérivation de formules.

Présentation du modèle Black Ritterman - Comparaison avec les méthodes d'optimisation traditionnelles

Les méthodes d'optimisation traditionnelles et leurs problèmes

L'approche de diversification moyenne de Markovitz calcule le portefeuille optimal en estimant le rendement attendu et le risque (matrice de covariance) de chaque actif et en résolvant le compromis entre maximiser le rendement et minimiser le risque en optimisant les calculs. Faire. BL1.PNG Bien que cette approche soit facile à comprendre, elle présente les inconvénients suivants pour une utilisation pratique. —— Les risques sont relativement stables et faciles à estimer, mais les rendements sont difficiles à prévoir

Par conséquent, en pratique, il est traité en imposant diverses contraintes (taille du poste, taux de rotation, etc.) dans le calcul d'optimisation. Pour éviter ce problème, le modèle Black Ritterman a été conçu et largement utilisé.

Flux d'optimisation de Black Ritterman

Le modèle Black Ritterman est facile à comprendre si vous y réfléchissez dans les trois étapes suivantes.

1. Trouvez un rendement attendu équilibré grâce à l'optimisation inversée

L'optimisation de Black Ritterman ne permet pas d'estimer directement les rendements attendus, qui sont difficiles à estimer. Au lieu de cela, l'ensemble du marché sélectionne le portefeuille par optimisation, c'est-à-dire que la pondération de la valeur marchande (= portefeuille de marché) sur le marché actuel est le résultat d'une optimisation qui entre le rendement estimé et le risque assumé par le marché. Supposons qu'il ait été obtenu. Sur la base de cette idée, le rendement attendu (appelé rendement équilibré ou rendement implicite) attendu par le marché peut être calculé à partir de la pondération de la valeur marchande (portefeuille de marché) et du risque estimé. Cette méthode est appelée optimisation inverse car elle inverse le calcul d'optimisation dans l'approche de dispersion moyenne. BL3.PNG

2. La mise à jour bayésienne allie le point de vue des investisseurs à des rendements attendus équilibrés

Ajustez la valeur de rendement attendue en mélangeant le point de vue de l'investisseur (perspectives) avec le rendement attendu équilibré obtenu par l'optimisation inverse en 1 à l'aide des statistiques bayésiennes. Le point de vue de l'investisseur est intégré dans le modèle sous la forme de prédictions telles que «Un actif surperforme l'actif B de 3%» et «C un actif retourne 5%». Vous pouvez saisir n'importe quel nombre de prévisions et vous pouvez également saisir la confiance des investisseurs dans chaque prévision en tant que paramètre. Les prédictions hautement fiables ont un impact plus important sur les rendements, et les prévisions moins fiables ont moins d'impact sur les rendements. BL4.PNG

3. Calculer le portefeuille par calcul d'optimisation

Enfin, le processus d'optimisation calcule le nouveau portefeuille en fonction des rendements et des risques attendus mis à jour. BL5.PNG

Exemple d'exécution de formule et Python

Jetons un coup d'œil aux formules qui apparaissent dans le modèle Black Ritterman, ainsi qu'au code implémenté en Python. Ici, [article de He & Litterman (1999)](https://www.google.co.jp/url?sa=t&rct=j&q=1esrc=s&source=web&cd=2&cad=rja&uact=8&ved=0ahUKEwiNza-vodvLAhVI02MKHU2QuAttbkF % 3A% 2F% 2Ffaculty.fuqua.duke.edu% 2F ~ charvey% 2FTeaching% 2FIntesaBci_2001% 2FGS_The_intuition_behind.pdf & usg = AFQjCNFAMN5avO_btVZg9P3jbGlEU5VMjw) Reproduire l'exemple numérique.

0. Préparation

L'article He & Litterman illustre un portefeuille d'indices boursiers dans sept pays (Australie, Canada, France, Allemagne, Japon, Royaume-Uni et États-Unis). Sa pondération en valeur marchande $ w $, sa matrice de corrélation et sa volatilité sont données en entrée.

Préparez ces données en Python. La matrice de covariance $ \ Sigma $ («Sigma») est calculée à partir de la matrice de corrélation («corrélation») et de la volatilité («std»).

python


import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

#poids
w = np.array([[0.016, 0.022, 0.052, 0.055, 0.116, 0.124, 0.615]]).T
#Matrice de corrélation
correlation = np.array([
        [1, 0.488, 0.478, 0.515, 0.439, 0.512, 0.491],
        [0.488, 1, 0.664, 0.655, 0.310, 0.608, 0.779],
        [0.478, 0.664, 1, 0.861, 0.355, 0.783, 0.668],
        [0.515, 0.655, 0.861, 1, 0.354, 0.777, 0.653],
        [0.439, 0.310, 0.355, 0.354, 1, 0.405, 0.306],
        [0.512, 0.608, 0.783, 0.777, 0.405, 1, 0.652],
        [0.491, 0.779, 0.668, 0.653, 0.306, 0.652, 1]])
#écart-type
std = np.array([[0.16, 0.203, 0.248, 0.271, 0.21, 0.2, 0.187]])
#Calculer la matrice de covariance à partir de la matrice de corrélation et de l'écart type
Sigma = correlation * np.dot(std.T, std)
#La valeur delta du paramètre est He&Litterman(1999)Suivre
delta = 2.5
#La valeur du paramètre tau est He&Litterman(1999)Suivre
tau = 0.05

De plus, les symboles qui apparaissent dans les formules suivantes sont les suivants. $ \ Pi $ Rendement attendu équilibré (vecteur nx1) $ \ Pi '$ Rendement attendu mis à jour pour la vue investisseur (vecteur nx1) $ w $ Poids initial (vecteur nx1) $ w '$ poids postérieur (vecteur nx1) $ \ Sigma $ Retourne la matrice de covariance Matrice $ P $, $ Q $ montrant les opinions des investisseurs $ \ Omega $ Matrix montrant la confiance dans le point de vue d'un investisseur Paramètre $ \ Delta $ (représente l'évitement du risque de l'investisseur) Paramètre $ \ tau $ (représente l'intervalle de confiance pour la matrice de covariance)

  1. Reverse Optimization

La première étape est l'optimisation inverse. En d'autres termes, c'est un calcul qui inverse l'optimisation. Comme expliqué ci-dessus, dans l'optimisation normale, le «rendement» et le «risque» sont entrés, et le compromis qui maximise le rendement et minimise le risque est optimisé et calculé pour obtenir le «portefeuille (poids)». Dans l'optimisation inverse, au contraire, «portefeuille (poids)» et «risque» sont saisis et «rendement» est calculé.

La fonction d'utilité dans le calcul d'optimisation est exprimée par la formule suivante, et $ w $ qui maximise ce $ U $ est le portefeuille optimal. $ \ Delta $ dans la formule est un paramètre qui spécifie le degré d'évitement du risque.

U = w^T\Pi - \frac{\delta}{2} w^T \Sigma w

Ce $ U $ est différencié par $ w $, et $ w $ où il devient 0 est le portefeuille optimal.

\frac{dU}{dw} = \Pi - \delta\Sigma w = 0

Résoudre cela pour $ \ Pi $

\Pi = \delta\Sigma w

Vous pouvez utiliser cette formule pour trouver le rendement attendu équilibré $ \ Pi $. En Python, procédez comme suit:

python


#Trouvez un rendement équilibré(reverse optimization)
r_eq = delta * np.dot(Sigma, w)

2. Combinez le point de vue de l'investisseur avec le rendement équilibré

Ensuite, spécifiez le point de vue de l'investisseur (prévision ou prévision) et mélangez-le au rendement équilibré précédemment calculé pour obtenir un nouveau rendement attendu. Dans le modèle Black Ritterman, la vue de l'investisseur est représentée par deux matrices $ P $ et $ Q $. Dans l'exemple de l'article He & Litterman,

P = \left( \begin{array}{cccccc} 0 & 0 & -0.295 & 1 & 0 & -0.705 & 0 \\\
0 & 1 & 0 & 0 & 0 & 0 & -1 \end{array} \right) \\\
Q = \left( \begin{array}{c} 0.05 \\\ 0.03 \end{array} \right)

Ça ressemble à ça. Cela représente deux points de vue: "l'Allemagne surperforme les autres pays d'Europe (France, Royaume-Uni) de 5%" et "le Canada surpasse les États-Unis de 3%". Spécifiez également le niveau de confiance de ces deux vues avec une matrice appelée $ \ Omega $. Dans l'exemple du papier, les valeurs sont les suivantes.

\Omega = \left( \begin{array}{cc} 0.001065 & 0 \\\ 0 & 0.000852 \end{array} \right)

Préparez également ces matrices en Python.

python


P = np.array([
        [0,0,-0.295,1,0,-0.705,0],
        [0,1,0,0,0,0,-1]]) # 2x7 matrix (2: number of views, 7: number of assets)
Q = np.array([[0.05],[0.03]]) # 2-vector
Omega = np.array([
        [0.001065383332,0],
        [0,0.0008517381]])

Enfin, en utilisant «l'équation principale» de Black-Litterman, nous combinons le point de vue de l'investisseur avec le rendement équilibré pour trouver un nouveau rendement. La formule est la suivante (la dérivation est expliquée en détail dans le document de référence).

\Pi' = \Pi + \tau \Sigma P^T \left( P \tau \Sigma P^T + \Omega \right)^{-1} \left( Q - P\Pi\right)

C'est une expression qui inclut la multiplication matricielle et la matrice inverse, mais elle ressemble à ceci lorsqu'elle est écrite en Python.

python


#Combiner le point de vue d'un investisseur avec des rendements équilibrés
r_posterior = r_eq + np.dot( np.dot( tau*np.dot(Sigma,P.T), np.linalg.inv(tau*np.dot(np.dot(P,Sigma),P.T)+Omega)), (Q-np.dot(P,r_eq)))

En même temps que le retour $ \ Pi $, la matrice de covariance $ \ Sigma $ est également mise à jour comme suit:

\Sigma' = \Sigma + \tau\Sigma - \tau\Sigma P^T \left( P \tau \Sigma P^T + \Omega \right)^{-1} P\tau\Sigma

Écrit en Python, cela ressemble à ceci:

python


Sigma_posterior = Sigma + tau*Sigma - tau*np.dot( np.dot( np.dot(Sigma,P.T), np.linalg.inv(tau*np.dot(np.dot(P,Sigma),P.T)+Omega)), tau*np.dot(P,Sigma))

3. Trouver de nouveaux poids par optimisation

Enfin, le calcul d'optimisation est effectué sur la base du retour mis à jour $ \ Pi '$ et de la matrice de covariance $ \ Sigma' $ pour obtenir le nouveau poids optimal $ w '$. Ici, le nouveau poids $ w '$ est calculé par l'équation suivante qui résout analytiquement le problème d'optimisation.

w' = \Pi' (\delta\Sigma')^{-1}

Si vous écrivez dans le code

python


#Effectuez l'optimisation avant pour trouver le poids optimal
w_posterior = np.dot(np.linalg.inv(delta*Sigma_posterior), r_posterior)

Ce sera.

Tracons l'ancien poids $ w $ et le nouveau poids $ w '$ sur le graphique. J'utilise la fonction de tracé des pandas.

python


df = pd.DataFrame([w.reshape(7),w_posterior.reshape(7)],
                  columns=['AUL','CAN','FRA','GER','JAP','UKG','USA'],
                  index=['Equilibrium Weights','Constrained Optimal Weights'])
df.T.plot(kind='bar', color='br')

Le résultat ressemble à ceci. Le bleu représente la pondération de la valeur marchande d'origine et le rouge la pondération du portefeuille nouvellement calculée qui intègre la vision de l'investisseur. Le résultat est que les pondérations du Canada et de l'Allemagne augmenteront et les pondérations de la France, du Royaume-Uni et des États-Unis diminueront en fonction des perspectives des investisseurs. bl graph.png

en conclusion

Dans l'implémentation du modèle, définir des paramètres tels que $ \ delta, \ tau, \ Omega $ est important, et diverses méthodes de paramétrage ont été discutées et il est devenu un article en soi, mais je l'ai omis cette fois. C'est un modèle de literman noir avec un son qui semble difficile, mais n'était-ce pas étonnamment facile? Comme expliqué dans l'article, il s'agit d'une méthode facile à utiliser car elle produit rarement des résultats inattendus comme la méthode d'optimisation conventionnelle à distribution moyenne. Si le nombre d'actifs est petit, il peut être calculé même avec Excel. La littérature japonaise est limitée, j'espère donc qu'elle vous aidera à comprendre.

Les références

Recommended Posts

Expliquons l'allocation d'actifs par le modèle Black Ritterman (avec un exemple d'exécution par Python)
[Python] Explique la différence entre strftime et strptime dans le module datetime avec un exemple
[Python] Récupère le répertoire d'exécution du script avec un chemin absolu
[Python] Simplifiez la fonction de format (Qu'est-ce qu'une chaîne f? Expliquez la différence avec la fonction de format avec un exemple)
[Python] Explique comment utiliser la fonction format avec un exemple
Affinons les hyper paramètres du modèle avec scikit-learn!
Lisons le fichier RINEX avec Python ①
Développons un algorithme d'investissement avec Python 1
Préparer l'environnement d'exécution de Python3 avec Docker
Écrivons FizzBuzz avec une erreur: Version Python
[Python] Clustering avec un modèle gaussien infiniment mélangé
Résolution du modèle Lorenz 96 avec Julia et Python
Reproduire l'exemple d'exécution du chapitre 4 de Hajipata en Python
Reproduire l'exemple d'exécution du chapitre 5 de Hajipata en Python
Exécutons jupyter nativement pris en charge par VS Code avec python3.8
Pourquoi puis-je utiliser le module en important avec python?
Tweettons en frappant le terminal tout en criant avec Selenium! !!
Créez un exemple de scène semblable à un jeu avec juste le script Blender 2.80
Touchons l'API de Netatmo Weather Station avec Python. #Python #Netatmo