Lösen wir das Portfolio mit kontinuierlicher Optimierung
Nehmen wir an, dass 365 Daten 365 Szenarien sind. Angenommen, Sie haben ein Potenzial für 365 verschiedene Verkaufspreise, wenn Sie eine von Ihnen gekaufte Marke verkaufen. Ein häufiges Risiko besteht darin, die Variabilität zu betrachten, was sie nichtlinear und schwer zu lösen macht. Hier betrachten wir die Maximierung der Worst-Case-Renditen im Szenario.
Erstellen Sie zunächst zufällige Daten.
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)
#Datenerstellung mit Zufallszahlen
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])
Im Durchschnitt ist Aktie B am höchsten, wenn auch leicht. Schauen wir uns die Korrelation an.
python3
plt.subplot(131)
plt.title('Korrelation zwischen Beständen(A-B)')
plt.scatter(a[:, 0], a[:, 1])
plt.subplot(132)
plt.title('Korrelation zwischen Beständen(A-C)')
plt.scatter(a[:, 0], a[:, 2])
plt.subplot(133)
plt.title('Korrelation zwischen Beständen(B-C)')
plt.scatter(a[:, 1], a[:, 2]);
Definiert eine Funktionslösung, die das Optimierungsproblem löst. Separat geprüft betrug der maximale Schwellenwert (garantierter Wert im schlimmsten Fall) 98,58. Lassen Sie uns das Ergebnis zu diesem Zeitpunkt sehen.
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])
Die erste 1 repräsentiert die "optimale Lösung" und die folgende Sequenz repräsentiert das Einkaufsverhältnis jeder Aktie.
Da B im Durchschnitt hoch ist, schauen wir uns die Histogramme für jedes Szenario des Falls an, in dem nur B gekauft wird (maximaler Gewinn) und der Fall früher gelöst wurde (minimales Maximum).
python3
plt.rcParams['figure.figsize'] = 6, 4
plt.title('Profit-Histogramm nach Zweck')
plt.hist(a.dot([0,1,0]), bins=12, range=(97, 103), alpha=0.5, label='Maximaler Gewinn')
plt.hist(a.dot(r[1]), bins=12, range=(97, 103), alpha=0.5, label='Minimum Maximum')
plt.legend();
Anstatt nur eine Aktie zu kaufen, kann die Kombination von Aktien mit inverser Korrelation Schwankungen der Preisbewegungen reduzieren.
Selbst wenn Sie sich das Diagramm ansehen, können Sie sehen, dass die Breite der Verteilung im Fall "Minimum Maximum" schmaler ist.
Schauen wir uns auch das Portfolio an, wenn der Schwellenwert geändert wird.
python3
x = np.linspace(97, 98.58, 10)
y = np.array([solve(a, th)[1] for th in x])
plt.title('Prozentsatz der Änderungen der Schwelle')
plt.plot(x, y)
plt.legend(['A','B','C']);
Im Durchschnitt ist B das Beste. Wenn Sie also die Risiken ignorieren, ist nur B das Beste. Bei maximaler Risikobewertung sind A und C umgekehrt korreliert, daher ist es besser, A und C zu kombinieren. Wie Sie sehen können, ändert sich der Anteil von B von 1 auf 0.
das ist alles
Recommended Posts