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.
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.
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]);
--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();
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']);
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