[PYTHON] Résolvons le portefeuille avec une optimisation continue

introduction

Résolvons le portefeuille avec une optimisation continue

--Il existe 365 données pour chacun des trois stocks (A, B, C). ――Il existe une corrélation entre chaque problème. ――Le prix d'achat est aujourd'hui de 99 yens.

Façon de penser

Supposons que 365 données sont 365 scénarios. Supposons que vous ayez un potentiel de 365 prix de vente différents lorsque vous vendez une marque que vous avez achetée. Un risque courant est de regarder la variabilité, ce qui la rend non linéaire et difficile à résoudre. Ici, nous envisageons de maximiser les pires rendements du scénario.

Essayez de l'exécuter en Python.

Tout d'abord, créez des données aléatoires.

python3


%matplotlib inline
import numpy as np, matplotlib.pyplot as plt
from pulp import *
from ortoolpy import addvars
plt.rcParams['figure.figsize'] = 16, 4
plt.rcParams['font.family'] = 'IPAexGothic'
N = 365
np.random.seed(1)
#Création de données avec des nombres aléatoires
a = np.random.multivariate_normal([100, 100, 100],
    [[1, 0.5, -0.5],[0.5, 1, 0.2], [-0.5, -0.1, 1]], N)
a.mean(axis=0)
>>>
array([  99.99327092,  100.06971451,  100.03864796])

En moyenne, le stock B est le plus élevé, quoique légèrement. Regardons la corrélation.

python3


plt.subplot(131)
plt.title('Corrélation entre les stocks(A-B)')
plt.scatter(a[:, 0], a[:, 1])
plt.subplot(132)
plt.title('Corrélation entre les stocks(A-C)')
plt.scatter(a[:, 0], a[:, 2])
plt.subplot(133)
plt.title('Corrélation entre les stocks(B-C)')
plt.scatter(a[:, 1], a[:, 2]);

image

--A et B sont positivement corrélés --A et C sont corrélés négativement --B et C sont presque non corrélés

Définit une fonction résoudre qui résout le problème d'optimisation. Vérifié séparément, le seuil maximal (valeur garantie dans le pire des cas) était de 98,58. Voyons le résultat à ce moment-là.

python3


def solve(a, th):
    m = LpProblem()
    x = addvars(3)
    m += lpSum(x) == 1
    for e in a * np.array(x):
        m += lpSum(e) >= th
    m.solve()
    return m.status, [value(i) for i in x]
r = solve(a, 98.58)
r
>>>
(1, [0.4815265, 0.00026221562, 0.51821129])

Le premier 1 représente la «solution optimale» et la séquence suivante représente le ratio d'achat de chaque stock.

Puisque B est élevé en moyenne, regardons les histogrammes pour chaque scénario du cas où seul B est acheté (profit maximum) et le cas résolu plus tôt (minimum maximum).

python3


plt.rcParams['figure.figsize'] = 6, 4
plt.title('Histogramme des bénéfices par objectif')
plt.hist(a.dot([0,1,0]), bins=12, range=(97, 103), alpha=0.5, label='Profit maximum')
plt.hist(a.dot(r[1]), bins=12, range=(97, 103), alpha=0.5, label='Minimum Maximum')
plt.legend();

image

Il est possible de réduire les fluctuations des mouvements de prix en combinant des problèmes avec une corrélation inverse plutôt qu'en achetant un seul numéro.

Même si vous regardez le graphique, vous pouvez voir que la largeur de la distribution est plus étroite dans le cas du «minimum maximum».

Jetons également un œil au portefeuille lorsque le seuil est modifié.

python3


x = np.linspace(97, 98.58, 10)
y = np.array([solve(a, th)[1] for th in x])
plt.title('Pourcentage de changements de seuil')
plt.plot(x, y)
plt.legend(['A','B','C']);

image

En moyenne, B est le meilleur, donc si vous ignorez les risques, seul B est le meilleur. Lors de l'évaluation du risque maximal, A et C sont inversement corrélés, il est donc préférable de combiner A et C. Comme vous pouvez le voir, la proportion de B passe de 1 à 0.

c'est tout

Recommended Posts

Résolvons le portefeuille avec une optimisation continue
Paver la route avec l'optimisation des combinaisons
Empilons les livres à plat avec l'optimisation des combinaisons
Lisons le fichier RINEX avec Python ①
Résolvez le problème du voyageur de commerce avec OR-Tools
Essayez de résoudre le problème du fizzbuzz avec Keras
Résolvons des équations linéaires simultanées avec Python sympy!
Décidons le cours de date par optimisation de combinaison
Essayez de résoudre le diagramme homme-machine avec Python
Résolution du problème N Queen avec l'optimisation continue / combinée
Résolution du problème N Queen avec l'optimisation des combinaisons
Optimisation de portefeuille avec Python (modèle de distribution moyenne de Markovitz)
J'ai essayé de résoudre le problème d'optimisation du placement de la machine virtuelle (version simple) avec blueqat
Transposons la matrice et multiplions les matrices par numpy.
Essayez de résoudre le livre des défis de programmation avec python3
Optimisation apprise avec OR-Tools [plan linéaire: raffinons l'huile]
Essayez de résoudre le problème d'affectation du médecin de formation avec Python
J'ai essayé de résoudre Soma Cube avec python
J'ai essayé de résoudre le problème avec Python Vol.1
Résolvez AtCoder 167 avec python
Aménagement routier par optimisation
Résoudre des maths avec Python
Introduction à l'optimisation
Résoudre des maths avec PuLP
Résolvez POJ 2386 avec python
Résoudre le calcul du masque
Décidons la conférence de PyCon JP 2016 par optimisation de combinaison
Je voulais résoudre le concours de programmation Panasonic 2020 avec Python
Tweettons en frappant le terminal tout en criant avec Selenium! !!
Décidons la position du service d'incendie par optimisation combinée
Exécutons la commande à temps avec le bot discord
Touchons l'API de Netatmo Weather Station avec Python. #Python #Netatmo
J'ai essayé de résoudre le problème d'optimisation des combinaisons avec Qiskit
Résolvez le livre en spirale (algorithme et structure de données) avec python!
Résolvez des exercices de modèle d'optimisation mathématique avec les outils OR de Google
Visualisons le nombre de personnes infectées par le virus corona avec matplotlib
Utilisons rapidement l'expression distribuée des mots avec fastText!
Déplaçons word2vec avec Chainer et voyons la progression de l'apprentissage
Réduisons le travail requis pour la configuration du serveur avec Ansible