{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "7b51ae77-8333-41c8-b6e1-90f2155a7cb7",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Quantum Portfolio Optimizer - Una funzione Qiskit di Global Data Quantum\"\n",
        "description: \"Una funzione Qiskit per risolvere problemi di ottimizzazione dinamica ( Portfolio Optimization ) utilizzando un'implementazione ottimizzata del VQE.\"\n",
        "---\n",
        "\n",
        "<span id=\"quantum-portfolio-optimizer-a-qiskit-function-by-global-data-quantum\" />\n",
        "\n",
        "# Quantum Portfolio Optimizer: una funzione Qiskit di Global Data Quantum\n",
        "\n",
        "{/* cspell:ignore rebalance, GBPJPY, TMBMKDE  */}\n",
        "\n",
        "*Consulta la [documentazione dell'API](/docs/api/functions/global-data-quantum-optimizer)*\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "a95af5a5-933c-4f11-a841-65483946a528",
      "metadata": {
        "tags": [
          "version-info"
        ]
      },
      "source": [
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "0466d79d-52b1-4ae4-bdbe-94357784cf7f",
      "metadata": {},
      "source": [
        "<Admonition type=\"note\">\n",
        "  Le funzioni Qiskit sono una funzione sperimentale disponibile solo per gli utenti di IBM Quantum® Premium Plan, Flex Plan e On-Prem (tramite IBM Quantum Platform API) Plan. Sono in stato di anteprima e sono soggetti a modifiche.\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "f350e597-000e-4c64-8e5d-c5b95851d26c",
      "metadata": {},
      "source": [
        "<span id=\"overview\" />\n",
        "\n",
        "## Panoramica\n",
        "\n",
        "Il Quantum Portfolio Optimizer è una funzione di Qiskit che affronta il problema dell'ottimizzazione dinamica del portafoglio, un problema standard in finanza che mira a riequilibrare gli investimenti periodici in un insieme di attività, per massimizzare i rendimenti e minimizzare i rischi. Utilizzando tecniche di ottimizzazione quantistica all'avanguardia, questa funzione semplifica il processo in modo che gli utenti, senza alcuna competenza in materia di calcolo quantistico, possano beneficiare dei suoi vantaggi nel trovare traiettorie di investimento ottimali. Ideale per i gestori di portafoglio, i ricercatori di finanza quantitativa e i singoli investitori, questo strumento consente di effettuare test retrospettivi delle strategie di trading nell'ambito dell'ottimizzazione del portafoglio.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "977a893a-9bbe-47f9-b4be-d9f6b8d27a72",
      "metadata": {},
      "source": [
        "<span id=\"function-description\" />\n",
        "\n",
        "## Descrizione funzione\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "9038f89a-7452-45bf-a96c-8a5ba8b061d0",
      "metadata": {},
      "source": [
        "La funzione Quantum Portfolio Optimizer utilizza l'algoritmo Variational Quantum Eigensolver (VQE) per risolvere un problema di Quadratic Unconstrained Binary Optimization (QUBO), affrontando problemi di ottimizzazione dinamica del portafoglio. Gli utenti devono semplicemente fornire i dati relativi ai prezzi degli asset e definire i vincoli di investimento, quindi la funzione esegue il processo di ottimizzazione quantistica che restituisce un insieme di traiettorie di investimento ottimizzate.\n",
        "\n",
        "Il processo si articola in quattro fasi principali. In primo luogo, i dati di input vengono mappati su un problema compatibile con la meccanica quantistica, costruendo il QUBO del problema di ottimizzazione dinamica del portafoglio e trasformandolo in un operatore quantistico (Hamiltoniano di Ising). Successivamente, il problema di input e l’algoritmo VQE vengono adattati per essere eseguiti sull’hardware quantistico. L'algoritmo VQE viene quindi eseguito sull'hardware quantistico e, infine, i risultati vengono sottoposti a post-elaborazione per fornire le traiettorie di investimento ottimali. Il sistema include inoltre una post-elaborazione sensibile al rumore ( [basata](/docs/addons/qiskit-addon-sqd) su SQD) per ottimizzare la qualità del risultato finale.\n",
        "\n",
        "Questa funzione Qiskit si basa sul [manoscritto pubblicato](https://arxiv.org/abs/2412.19150) da Global Data Quantum.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "3667fa72-ebef-476a-94a1-553389889623",
      "metadata": {},
      "source": [
        "![Visualizzazione del flusso di lavoro della funzione](https://quantum.cloud.ibm.com/docs/images/guides/global-data-quantum-optimizer/function_workflow.svg)\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "32a1bfa7-0e6d-4e64-9169-3b285597cfe1",
      "metadata": {},
      "source": [
        "<span id=\"get-started\" />\n",
        "\n",
        "# Introduzione\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "8c2eeb5b-14c5-4c49-a02b-612ebcd64960",
      "metadata": {},
      "source": [
        "Effettua l'autenticazione utilizzando [la](/) tua chiave API e seleziona la funzione Qiskit come indicato di seguito. (Questo frammento di codice presuppone che tu abbia già [salvato il tuo account](/docs/guides/functions-get-started#install-qiskit-functions-catalog-client) nell'ambiente locale.)\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "d62b10b4-432b-4885-b4a1-c4266d675386",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "[QiskitFunction(qunova/hivqe-chemistry),\n",
              " QiskitFunction(global-data-quantum/quantum-portfolio-optimizer),\n",
              " QiskitFunction(algorithmiq/tem),\n",
              " QiskitFunction(qedma/qesem),\n",
              " QiskitFunction(multiverse/singularity),\n",
              " QiskitFunction(ibm/circuit-function),\n",
              " QiskitFunction(q-ctrl/optimization-solver),\n",
              " QiskitFunction(colibritd/quick-pde),\n",
              " QiskitFunction(q-ctrl/performance-management),\n",
              " QiskitFunction(kipu-quantum/iskay-quantum-optimizer)]"
            ]
          },
          "execution_count": 1,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit_ibm_catalog import QiskitFunctionsCatalog\n",
        "\n",
        "catalog = QiskitFunctionsCatalog(channel=\"ibm_quantum_platform\")\n",
        "\n",
        "# Verify that you have access to the function\n",
        "catalog.list()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "b0a820cb-a3e1-4156-a156-0da2e9db9640",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Access function\n",
        "dpo_solver = catalog.load(\"global-data-quantum/quantum-portfolio-optimizer\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "0503669b-15e6-4533-b4ef-7f6c9e7d9f4f",
      "metadata": {},
      "source": [
        "<span id=\"example-dynamic-portfolio-optimization-with-seven-assets\" />\n",
        "\n",
        "## Esempio: ottimizzazione dinamica del portafoglio con sette attività\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "298a6e60-52cd-491c-8777-cdd3038ab490",
      "metadata": {},
      "source": [
        "Questo esempio mostra come eseguire la funzione di ottimizzazione dinamica del portafoglio (DPO) e come regolarne le impostazioni per ottenere prestazioni ottimali. Include passaggi dettagliati per la regolazione fine dei parametri per ottenere i risultati desiderati.\n",
        "\n",
        "Questo caso prevede sette asset, quattro fasi temporali e quattro qubit di risoluzione, per un fabbisogno totale di 112 qubit.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "736b0557-f4bf-43ad-a8e3-f1b871f67398",
      "metadata": {},
      "source": [
        "<span id=\"1-read-the-assets-included-in-the-portfolio\" />\n",
        "\n",
        "### 1. Leggi le risorse incluse nel portfolio\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "276c3f55-f75b-4320-807b-007a3881bdaa",
      "metadata": {},
      "source": [
        "Se tutte le risorse del portafoglio sono memorizzate in una cartella in un percorso specifico, è possibile caricarle in un `pandas.DataFrame` e convertirle in un oggetto in formato `dict` utilizzando la seguente funzione.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "c961d730-8a65-4a2b-b312-1006af8565ca",
      "metadata": {},
      "outputs": [],
      "source": [
        "import os\n",
        "import glob\n",
        "import pandas as pd\n",
        "\n",
        "\n",
        "def read_and_join_csv(file_pattern):\n",
        "    \"\"\"\n",
        "    Reads multiple CSV files matching the file pattern and combines them\n",
        "    into a single DataFrame.\n",
        "\n",
        "    Parameters:\n",
        "    file_pattern (str): The pattern to match CSV files.\n",
        "\n",
        "    Returns:\n",
        "    pd.DataFrame: Combined DataFrame with data from all CSV files.\n",
        "    \"\"\"\n",
        "    # Find all files matching the pattern\n",
        "    csv_files = glob.glob(file_pattern)\n",
        "    # Get the base file names without the .csv extension\n",
        "    file_names = [os.path.basename(f).replace(\".csv\", \"\") for f in csv_files]\n",
        "    # Read each CSV file into a DataFrame and set the first column as the index\n",
        "    df_list = [pd.read_csv(f).set_index(\"Unnamed: 0\") for f in csv_files]\n",
        "\n",
        "    # Rename columns in each DataFrame to the base file names\n",
        "    for df, name in zip(df_list, file_names):\n",
        "        df.columns = [name]\n",
        "\n",
        "    # Combine all DataFrames into one by merging them side by side\n",
        "    combined_df = pd.concat(df_list, axis=1)\n",
        "    return combined_df\n",
        "\n",
        "\n",
        "file_pattern = \"route/to/folder/with/assets/data/*.csv\"\n",
        "assets = read_and_join_csv(file_pattern).to_dict()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "29b4f417-c61d-4c6f-9779-15e052b90076",
      "metadata": {},
      "source": [
        "Per questo esempio, abbiamo utilizzato gli asset [8801.T](https://finance.yahoo.com/quote/8801.T), [CLF](https://finance.yahoo.com/quote/CLF), [GBPJPY](https://finance.yahoo.com/quote/GBPJPY), [ITX.MC](https://finance.yahoo.com/quote/ITX.MC), [META](https://finance.yahoo.com/quote/META), [TMBMKDE-10Y](https://finance.yahoo.com/quote/TMBMKDE-10Y), e [XS2239553048](https://finance.yahoo.com/quote/XS2239553048). La figura seguente illustra i dati utilizzati in questo esempio, mostrando l'evoluzione del prezzo di chiusura giornaliero delle attività dal 1° gennaio al 1° settembre del 2023.\n",
        "\n",
        "In questo esempio, per garantire l'uniformità tra le date, abbiamo riempito i giorni di non negoziazione con il prezzo di chiusura della data precedente disponibile. Applichiamo questa fase perché gli asset selezionati provengono da mercati diversi con giorni di negoziazione variabili, rendendo essenziale la standardizzazione del set di dati per garantire la coerenza.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "fb8b3592-5c1c-4dde-b635-a8b46e66f500",
      "metadata": {},
      "source": [
        "![Visualizzazione dei dati storici degli asset](https://quantum.cloud.ibm.com/docs/images/guides/global-data-quantum-optimizer/assets.avif)\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "708bf084-29bb-4201-a904-acefb2c85af8",
      "metadata": {},
      "source": [
        "<span id=\"2-define-the-problem\" />\n",
        "\n",
        "### 2. Definire il problema\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "d6f9c0f2-48be-48a4-bef4-b98f5f85b8b1",
      "metadata": {},
      "source": [
        "Definire le specifiche del problema configurando i parametri nel dizionario `qubo_settings` .\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "b92835c1-eb14-429e-ba22-846ee849764c",
      "metadata": {},
      "outputs": [],
      "source": [
        "qubo_settings = {\n",
        "    \"nt\": 4,\n",
        "    \"nq\": 4,\n",
        "    \"dt\": 30,\n",
        "    \"max_investment\": 25,\n",
        "    \"risk_aversion\": 1000.0,\n",
        "    \"transaction_fee\": 0.01,\n",
        "    \"restriction_coeff\": 1.0,\n",
        "}"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "98da8a80-2f9b-4b62-abfe-364a1dc712f4",
      "metadata": {},
      "source": [
        "<span id=\"3-define-the-optimizer-and-ansatz-settings-optional\" />\n",
        "\n",
        "### 3. Definire le impostazioni dell'ottimizzatore e dell'ansatz (facoltativo)\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "526df9d9-d52c-4a81-89ca-ff047eda5eb5",
      "metadata": {},
      "source": [
        "Definire i requisiti specifici per il processo di ottimizzazione, compresa la selezione dell'ottimizzatore e dei suoi parametri, nonché la specifica della primitiva e delle sue configurazioni.\n",
        "\n",
        "Per il Tailored Ansatz, la dimensione della popolazione scelta si è basata su precedenti esperimenti che hanno dimostrato che questo valore produce un'ottimizzazione stabile ed efficiente.\n",
        "\n",
        "Nel caso dell'Ansatz delle Ampiezze Reali, è possibile seguire una relazione lineare tra `population_size` e il numero di qubit nel circuito. Come regola empirica approssimativa, si raccomanda di utilizzare un **minimo di** `population_size ~ 0.8 * n_qubits` per l'ansatz `real_amplitudes` .\n",
        "\n",
        "Si prevede che le Ampiezze reali ottimizzate avranno una migliore performance di ottimizzazione rispetto al surrogato delle Ampiezze reali. Tuttavia, il numero di variabili da ottimizzare in questo surrogato aumenta molto più rapidamente che nel caso delle ampiezze reali (si veda il [manoscritto](https://arxiv.org/pdf/2412.19150) ). Pertanto, per problemi di grandi dimensioni, l'Ampiezza reale ottimizzata richiede un maggior numero di esecuzioni del circuito. L'Ampiezza reale ottimizzata è probabilmente utile per i problemi che richiedono fino a 100 qubit, ma si raccomanda di prestare attenzione quando si impostano i parametri `population_size` . Come esempio di questa scalabilità in `population_size`, la tabella precedente mostra che per un problema a 84 qubit, l'ottimizzazione delle ampiezze reali richiede 120 `population_size`, mentre per un problema a 56 qubit è sufficiente una `population_size` di 40.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "1ad03fde-4c78-4ec3-a027-cf0e2599d857",
      "metadata": {},
      "outputs": [],
      "source": [
        "optimizer_settings = {\n",
        "    \"de_optimizer_settings\": {\n",
        "        \"num_generations\": 20,\n",
        "        \"population_size\": 90,\n",
        "        \"recombination\": 0.4,\n",
        "        \"max_parallel_jobs\": 5,\n",
        "        \"max_batchsize\": 4,\n",
        "        \"mutation_range\": [0.0, 0.25],\n",
        "    },\n",
        "    \"optimizer\": \"differential_evolution\",\n",
        "    \"primitive_settings\": {\n",
        "        \"estimator_shots\": 25_000,\n",
        "        \"estimator_precision\": None,\n",
        "        \"sampler_shots\": 100_000,\n",
        "    },\n",
        "}"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "253955cb-87cd-4e39-a0fa-21c457db0106",
      "metadata": {},
      "source": [
        "È anche possibile scegliere un'ansatz specifica. Di seguito si utilizza l'ansatz di `'Tailored'` .\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "9fa3c8be-c755-49e7-8c3e-322e5da7c802",
      "metadata": {},
      "outputs": [],
      "source": [
        "ansatz_settings = {\n",
        "    \"ansatz\": \"tailored\",\n",
        "    \"multiple_passmanager\": False,\n",
        "}"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6e7b6809-aca0-4d04-bb99-c258e758a0b4",
      "metadata": {},
      "source": [
        "<span id=\"4-run-the-problem\" />\n",
        "\n",
        "### 4. Eseguire il problema\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "09553772-82e9-4d42-bc8f-f75f20c7d355",
      "metadata": {},
      "outputs": [],
      "source": [
        "dpo_job = dpo_solver.run(\n",
        "    assets=assets,\n",
        "    qubo_settings=qubo_settings,\n",
        "    optimizer_settings=optimizer_settings,\n",
        "    ansatz_settings=ansatz_settings,\n",
        "    backend_name=\"<backend name>\",\n",
        "    previous_session_id=[],\n",
        "    apply_postprocess=True,\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "f6890c97-0c0e-4750-bc31-114e7dc830e0",
      "metadata": {},
      "source": [
        "<span id=\"5-retrieve-results\" />\n",
        "\n",
        "### 5. Recuperare i risultati\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "fe8cfc2e-3305-4a33-89cc-a73fb64ada69",
      "metadata": {},
      "source": [
        "La funzione restituisce un dizionario contenente le traiettorie di investimento ordinate dal valore più basso a quello più alto in base al valore della funzione obiettivo (vedere la sezione [\"Output\"](/docs/api/functions/global-data-quantum-optimizer#output) della documentazione dell'API). Questa serie di risultati consente di individuare il percorso con il costo più basso e le relative valutazioni di investimento. Inoltre, consente di analizzare diverse traiettorie, facilitando la selezione di quelle che meglio rispondono a esigenze o obiettivi specifici. Questa flessibilità garantisce che le opzioni possano essere personalizzate in base a una varietà di preferenze o situazioni.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "eb7eeefd-935c-4c7e-8ea0-f2ef07498641",
      "metadata": {},
      "source": [
        "Iniziare presentando la strategia risultante che ha raggiunto il costo obiettivo più basso trovato durante il processo.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "c1bc72c1-d5a1-4834-9737-f573b8f0f4d6",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "{'time_step_0': {'8801.T': 0.11764705882352941,\n",
              "  'ITX.MC': 0.20588235294117646,\n",
              "  'META': 0.38235294117647056,\n",
              "  'GBPJPY=X': 0.058823529411764705,\n",
              "  'TMBMKDE-10Y': 0.0,\n",
              "  'CLF': 0.058823529411764705,\n",
              "  'XS2239553048': 0.17647058823529413},\n",
              " 'time_step_1': {'8801.T': 0.11428571428571428,\n",
              "  'ITX.MC': 0.14285714285714285,\n",
              "  'META': 0.2,\n",
              "  'GBPJPY=X': 0.02857142857142857,\n",
              "  'TMBMKDE-10Y': 0.42857142857142855,\n",
              "  'CLF': 0.0,\n",
              "  'XS2239553048': 0.08571428571428572},\n",
              " 'time_step_2': {'8801.T': 0.0,\n",
              "  'ITX.MC': 0.09375,\n",
              "  'META': 0.3125,\n",
              "  'GBPJPY=X': 0.34375,\n",
              "  'TMBMKDE-10Y': 0.0,\n",
              "  'CLF': 0.0,\n",
              "  'XS2239553048': 0.25},\n",
              " 'time_step_3': {'8801.T': 0.3939393939393939,\n",
              "  'ITX.MC': 0.09090909090909091,\n",
              "  'META': 0.12121212121212122,\n",
              "  'GBPJPY=X': 0.18181818181818182,\n",
              "  'TMBMKDE-10Y': 0.0,\n",
              "  'CLF': 0.0,\n",
              "  'XS2239553048': 0.21212121212121213}}"
            ]
          },
          "execution_count": 6,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Get the results of the job\n",
        "dpo_result = dpo_job.result()\n",
        "\n",
        "# Show the solution strategy\n",
        "dpo_result[\"result\"]"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "043ab9f6-c50c-4387-9de1-fe4de3491980",
      "metadata": {},
      "source": [
        "Successivamente, utilizzando i metadati, è possibile accedere ai risultati di tutte le strategie campionate. È quindi possibile analizzare ulteriormente le traiettorie alternative restituite dall'ottimizzatore. Per farlo, si legge il dizionario memorizzato in `dpo_result['metadata']['all_samples_metrics']`, che contiene non solo informazioni aggiuntive sulla strategia ottimale, ma anche dettagli sulle altre strategie candidate valutate durante l'ottimizzazione.\n",
        "\n",
        "L'esempio seguente mostra come leggere queste informazioni utilizzando `pandas` per estrarre le metriche chiave associate alla strategia ottimale. Questi includono la deviazione di restrizione, lo Sharpe Ratio e il corrispondente rendimento dell'investimento.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "6d79bf57-3f68-4981-aa66-7a0cf17c4155",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Minimum Objective Cost Found: -3.78\n",
            "Best Solution:\n",
            "  - Restriction Deviation: 40.0\n",
            "  - Sharpe Ratio: 24.82\n",
            "  - Return: 0.46\n"
          ]
        }
      ],
      "source": [
        "# Convert metadata to a DataFrame\n",
        "df = pd.DataFrame(dpo_result[\"metadata\"][\"all_samples_metrics\"])\n",
        "\n",
        "# Find the minimum objective cost\n",
        "min_cost = df[\"objective_costs\"].min()\n",
        "print(f\"Minimum Objective Cost Found: {min_cost:.2f}\")\n",
        "\n",
        "# Extract the row with the lowest cost\n",
        "best_row = df[df[\"objective_costs\"] == min_cost].iloc[0]\n",
        "\n",
        "# Display the results associated with the best solution\n",
        "print(\"Best Solution:\")\n",
        "print(f\"  - Restriction Deviation: {best_row['rest_breaches']}%\")\n",
        "print(f\"  - Sharpe Ratio: {best_row['sharpe_ratios']:.2f}\")\n",
        "print(f\"  - Return: {best_row['returns']}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "51797701-c647-4b1a-b863-be743d359ffe",
      "metadata": {},
      "source": [
        "<span id=\"6-performance-analysis\" />\n",
        "\n",
        "### 6. Analisi delle prestazioni\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "f595acfc-e26b-44fd-8c1c-8b1bc81611aa",
      "metadata": {},
      "source": [
        "Infine, analizzate le prestazioni dell'applicazione di ottimizzazione. In particolare, confrontate i vostri risultati, ottenuti nell'esempio precedente, con una linea di base casuale per valutare l'efficacia del nostro approccio. Se l'algoritmo quantistico produce in modo dimostrabile e costante risultati con valori di costo inferiori, indica un processo di ottimizzazione efficace.\n",
        "\n",
        "La figura presenta le distribuzioni di probabilità dei costi obiettivo. Per generare queste distribuzioni, prendere l'elenco dei costi obiettivo dal risultato della funzione e contare le occorrenze di ciascun valore di costo (valori arrotondati alla seconda cifra decimale). Quindi, aggiornare la colonna del conteggio unendo i conteggi dei valori arrotondati identici. Si noti che, per un migliore confronto visivo, i conteggi delle occorrenze sono stati normalizzati in modo che ciascuna distribuzione sia visualizzata tra 0 e 1.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "560912e7-6722-4f06-87b1-83fd4ac2073f",
      "metadata": {},
      "source": [
        "![Visualizzazione della soluzione del problema di ottimizzazione](https://quantum.cloud.ibm.com/docs/images/guides/global-data-quantum-optimizer/cost_distribution.avif)\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "0bd0704d-83a0-4b29-b3aa-cb1eddef412d",
      "metadata": {},
      "source": [
        "Come mostrato nella figura (linea solida blu), la distribuzione dei costi per il nostro approccio Variational Quantum Eigensolver (post-processato con SQD) si concentra nettamente sui valori più bassi del costo obiettivo, indicando buone prestazioni di ottimizzazione. Al contrario, la linea di base rumorosa presenta una distribuzione più ampia, centrata sui valori di costo più elevati. La linea verticale grigia tratteggiata rappresenta il valore medio della distribuzione casuale, evidenziando ulteriormente la coerenza della funzione nel restituire strategie di investimento ottimizzate. Per un ulteriore confronto, la linea nera tratteggiata nella figura corrisponde alla soluzione ottenuta con l'ottimizzatore Gurobi (versione gratuita). Tutti questi risultati sono ulteriormente approfonditi nei benchmark che seguono per l'esempio \"Mixed Assets\" valutato con l'ansatz \"Tailored\".\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "de293919-a802-4ebe-95e3-173083268741",
      "metadata": {},
      "source": [
        "<span id=\"benchmarks\" />\n",
        "\n",
        "# Benchmark\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "bb44f36c-de99-44ed-921b-003ec3030e86",
      "metadata": {},
      "source": [
        "Questa funzione è stata testata con diverse configurazioni di qubit di risoluzione, circuiti di ansatz e raggruppamenti di asset di vari settori: un mix di asset diversi (Set 1), derivati del petrolio (Set 2) e IBEX35 (Set 3). Per maggiori dettagli, consultare la tabella seguente.\n",
        "\n",
        "| Imposta     | Data       | Asset                                                           |\n",
        "| ----------- | ---------- | --------------------------------------------------------------- |\n",
        "| **Set 1**   | 01/01/2023 | 8801.T, CL=F, GBPJPY=X, ITX.MC, META, TMBMKDE-10Y, XS2239553048 |\n",
        "| **Set 2**   | 01/06/2023 | CL=F, BZ=F, HO=F, NG=F, XOM, RB=F, 2222.SR                      |\n",
        "| **Serie 3** | 01/11/2022 | ACS.MC, ITX.MC, FER.MC, ELE.MC, SCYR.MC, AENA.MC, AMS.MC        |\n",
        "\n",
        "Per valutare la qualità della soluzione sono state utilizzate due metriche chiave.\n",
        "\n",
        "1. Il costo obiettivo, che misura l'efficienza dell'ottimizzazione confrontando il valore della funzione costo di ogni esperimento con i risultati di Gurobi (versione gratuita).\n",
        "2. Il rapporto di Sharpe, che cattura il rendimento corretto per il rischio di ciascun portafoglio, offrendo una visione della performance finanziaria delle soluzioni.\n",
        "\n",
        "Insieme, queste metriche consentono di valutare gli aspetti computazionali e finanziari dei portafogli generati dai quanti.\n",
        "\n",
        "| Esempio                                                            | Qubit | Ansatz                     | Profondità | Utilizzo del tempo di esecuzione (s) | Utilizzo totale (s) | Costo obiettivo | Sharpe | Costo obiettivo di Gurobi | Gurobi Sharpe |\n",
        "| ------------------------------------------------------------------ | ----- | -------------------------- | ---------- | ------------------------------------ | ------------------- | --------------- | ------ | ------------------------- | ------------- |\n",
        "| Attività miste (Set 1, 4 passi temporali, 4 bit)                   | 112   | Su misura                  | 83         | 12735                                | 13095               | -3.78           | 24.82  | -4.25                     | 24.71         |\n",
        "| Attività miste (Set 1,4 passi temporali, 4 passi temporali, 4 bit) | 112   | Ampiezze reali             | 359        | 11739                                | 11903               | -3.39           | 23.64  | -4.25                     | 24.71         |\n",
        "| Derivati del petrolio (set 2, 4 fasi temporali, 3 bit)             | 84    | Ampiezze reali ottimizzate | 78         | 6180                                 | 6350                | -3.73           | 19.13  | -4.19                     | 21.71         |\n",
        "| IBEX35 (Set 3, 4 passi temporali, 2 bit)                           | 56    | Ampiezze reali ottimizzate | 96         | 3314                                 | 3523                | -3.67           | 14.48  | -4.11                     | 16.44         |\n",
        "\n",
        "I risultati dimostrano che l'ottimizzatore quantistico, con ansatzes specifici per il problema, identifica efficacemente strategie di investimento efficienti in vari tipi di portafoglio.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "2db3bd86-393e-4e88-851c-fd496f956aed",
      "metadata": {},
      "source": [
        "Di seguito vengono illustrati in dettaglio sia la dimensione della popolazione sia il numero di generazioni specificate nel dizionario `optimizer_options` . Tutti gli altri parametri sono stati impostati sui valori predefiniti.\n",
        "\n",
        "| **Esempio**                           | `population_size` | `num_generations` |\n",
        "| ------------------------------------- | ----------------- | ----------------- |\n",
        "| Portafoglio di attività miste         | 90                | 20                |\n",
        "| Portafoglio di attività miste         | 92                | 20                |\n",
        "| Portafoglio dei derivati del petrolio | 120               | 20                |\n",
        "| IBEX35 Portafoglio                    | 40                | 20                |\n",
        "\n",
        "Il numero di generazioni è stato impostato a 20, valore ritenuto sufficiente per raggiungere la convergenza. Inoltre, i valori predefiniti per i parametri interni dell'ottimizzatore sono stati lasciati invariati, poiché hanno sempre fornito buone prestazioni e sono generalmente raccomandati dalla letteratura e dalle linee guida per l'implementazione.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "021187a8-c6f9-4f31-89f8-32dbb85ec5f6",
      "metadata": {},
      "source": [
        "<span id=\"get-support\" />\n",
        "\n",
        "# Ottenere supporto\n",
        "\n",
        "Se hai bisogno di aiuto, puoi inviare un'e-mail a [qpo.support @ globaldataquantum.com](mailto:qpo.support@globaldataquantum.com). Nel messaggio, indicare l'ID della funzione.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "0a6148bb-1b04-4ad8-bbaf-3cba2b41b037",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Passi successivi\n",
        "\n",
        "<Admonition type=\"note\" title=\"Suggerimenti\">\n",
        "  * Leggete [il documento di ricerca associato](https://arxiv.org/pdf/2412.19150).\n",
        "  * * Consulta la documentazione [di riferimento dell'API](/docs/api/functions/global-data-quantum-optimizer) relativa a questa funzione di Qiskit.\n",
        "  * Richiedi l'accesso alla funzione compilando [questo modulo](https://globaldatum.io/qiskit-function/#form).\n",
        "  * Provate l'esercitazione [Dynamic Portfolio Optimization](/docs/tutorials/global-data-quantum-optimizer).\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "id": "a1b8767d",
      "source": "© IBM Corp., 2017-2026"
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 2
}