Exemple Qiskit - Optimisation de portefeuille

Sep 06 2020

J'ai récemment essayé d'exécuter cet exemple à partir de Qiskit (optimisation de portefeuille)

J'ai pu changer RandomDataProvider en YahooDataProvider et l'exécuter sur les prix réels des actions.

Cependant, il y a un défi particulier auquel je suis confronté - je ne sais pas si c'est mon manque de compréhension. À ce code particulier

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)

Quel que soit le budget ou la pénalité que je fixe, je reçois toujours un portefeuille avec environ la moitié du nombre total d'actifs. Par exemple, si mon nombre total d'actifs est de 5, mon budget est de 2 (à partir du code ci-dessus). Le résultat contient toujours 2 éléments [0 0 1 1 0]

Si je change mon budget en

budget = num_assets // 3

et mon actif total est de 5, alors je m'attends à ne voir qu'un seul actif dans le portefeuille résultant. Cependant, je vois 2

Si j'augmente mes num_assets à 10 et fais

budget = num_assets

J'obtiens toujours un portefeuille de 5 ou 6 actions (près de la moitié de 10) et non un portefeuille de 10.

Remarque - J'exécute sur qasm_simulator

Y a-t-il une lacune dans ma compréhension? Quel rôle ces variables - budget et pénalité - jouent-elles lors de la constitution du portefeuille?

Réponses

1 tsgeorgios Sep 06 2020 at 13:47

La contrainte budgétaire est ajoutée uniquement comme terme de pénalité (multiplié par le coefficient de «pénalité») dans l'hamiltonien et n'applique pas l'égalité. Cela signifie que la fonction objectif est$$ \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$$