Qiskit-Beispiel - Portfoliooptimierung

Sep 06 2020

Ich habe kürzlich versucht, dieses Beispiel über Qiskit (Portfolio Optimization) auszuführen.

Ich konnte RandomDataProvider in YahooDataProvider ändern und es zu realen Aktienkursen ausführen.

Es gibt jedoch eine besondere Herausforderung, vor der ich stehe - ich bin mir nicht sicher, ob es mein Unverständnis ist. Bei diesem bestimmten Code

budget = num_assets // 2  # set budget
penalty = num_assets      # set parameter to scale the budget penalty term
qubitOp, offset = portfolio.get_operator(mu, sigma, q, budget, penalty)

Egal für welches Budget oder welche Strafe ich dies festlege, ich erhalte immer ein Portfolio mit etwa der Hälfte der Gesamtzahl der Vermögenswerte. Wenn meine Gesamtzahl an Assets beispielsweise 5 beträgt, beträgt mein Budget 2 (vom obigen Code). Das Ergebnis enthält immer 2 Assets [0 0 1 1 0]

Wenn ich mein Budget auf ändere

budget = num_assets // 3

und mein Gesamtvermögen beträgt 5, dann erwarte ich nur 1 Vermögen im resultierenden Portfolio. Ich sehe jedoch 2

Wenn ich meine num_assets auf 10 erhöhe und mache

budget = num_assets

Ich bekomme immer noch ein Portfolio von 5 oder 6 Aktien (fast die Hälfte von 10) und kein Portfolio von 10.

Hinweis - Ich verwende qasm_simulator

Gibt es eine Lücke in meinem Verständnis? Welche Rolle spielen diese Variablen - Budget und Strafe - beim Aufbau des Portfolios?

Antworten

1 tsgeorgios Sep 06 2020 at 13:47

Die Budgetbeschränkung wird im Hamilton-Operator nur als Strafbegriff (multipliziert mit dem Strafkoeffizienten) hinzugefügt und erzwingt keine Gleichheit. Dies bedeutet, dass die Zielfunktion ist$$ \text{min}_{x\in\{0,1\}^n} \hspace{0.5em} q x^T \Sigma x - \mu^T x + \text{penalty} \cdot (B - 1^T x)^2$$