{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "7b51ae77-8333-41c8-b6e1-90f2155a7cb7",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Otimizador de portfólio quântico - Uma função Qiskit da Global Data Quantum\"\n",
        "description: \"Uma função Qiskit para resolver problemas dinâmicos de otimização de custo ( Portfolio Optimization ) usando uma implementação ajustada do VQE.\"\n",
        "---\n",
        "\n",
        "<span id=\"quantum-portfolio-optimizer-a-qiskit-function-by-global-data-quantum\" />\n",
        "\n",
        "# Otimizador de portfólio quântico: uma função Qiskit da Global Data Quantum\n",
        "\n",
        "{/* cspell:ignore rebalance, GBPJPY, TMBMKDE  */}\n",
        "\n",
        "*Consulte a [referência da 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",
        "  As funções do Qiskit são um recurso experimental disponível apenas para usuários dos planos IBM Quantum® Premium Plan, Flex Plan e On-Prem (via IBM Quantum Platform API). Eles estão no status de versão prévia e estão sujeitos a alterações.\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "f350e597-000e-4c64-8e5d-c5b95851d26c",
      "metadata": {},
      "source": [
        "<span id=\"overview\" />\n",
        "\n",
        "## Visão geral\n",
        "\n",
        "O Quantum Portfolio Optimizer é uma função do Qiskit que aborda o problema de otimização dinâmica de portfólio, um problema padrão em finanças que visa reequilibrar investimentos periódicos em um conjunto de ativos, para maximizar os retornos e minimizar os riscos. Ao implantar técnicas de otimização quântica de ponta, essa função simplifica o processo para que os usuários, sem conhecimento especializado em computação quântica, possam se beneficiar de suas vantagens para encontrar trajetórias de investimento ideais. Ideal para gerentes de portfólio, pesquisadores em finanças quantitativas e investidores individuais, essa ferramenta permite o back-testing de estratégias de negociação na otimização de portfólio.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "977a893a-9bbe-47f9-b4be-d9f6b8d27a72",
      "metadata": {},
      "source": [
        "<span id=\"function-description\" />\n",
        "\n",
        "## Descrição da função\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "9038f89a-7452-45bf-a96c-8a5ba8b061d0",
      "metadata": {},
      "source": [
        "A função Quantum Portfolio Optimizer usa o algoritmo Variational Quantum Eigensolver (VQE) para resolver um problema de Quadratic Unconstrained Binary Optimization (QUBO), abordando problemas de otimização dinâmica de portfólio. Os usuários só precisam fornecer os dados de preço do ativo e definir a restrição de investimento. Em seguida, a função executa o processo de otimização quântica que retorna um conjunto de trajetórias de investimento otimizadas.\n",
        "\n",
        "O processo consiste em quatro etapas principais. Primeiro, os dados de entrada são mapeados para um problema compatível com a computação quântica, construindo o QUBO do problema de otimização dinâmica de portfólio e transformando-o em um operador quântico (Hamiltoniano de Ising). Em seguida, o problema de entrada e o algoritmo VQE são adaptados para serem executados no hardware quântico. O algoritmo VQE é então executado no hardware quântico e, por fim, os resultados passam por um pós-processamento para fornecer as trajetórias de investimento ideais. O sistema também inclui um pós-processamento sensível ao ruído ( [base](/docs/addons/qiskit-addon-sqd) ado em SQD) para maximizar a qualidade do resultado final.\n",
        "\n",
        "Esta Função Qiskit é baseada no [manuscrito publicado](https://arxiv.org/abs/2412.19150) pela Global Data Quantum.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "3667fa72-ebef-476a-94a1-553389889623",
      "metadata": {},
      "source": [
        "![Visualização do fluxo de trabalho da função](https://eu-de.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",
        "# Introdução\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "8c2eeb5b-14c5-4c49-a02b-612ebcd64960",
      "metadata": {},
      "source": [
        "Faça a autenticação usando sua [chave de API](/) e selecione a função do Qiskit da seguinte maneira. (Este trecho pressupõe que você já tenha [salvo sua conta](/docs/guides/functions-get-started#install-qiskit-functions-catalog-client) no seu ambiente local.)\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",
        "## Exemplo: Otimização dinâmica de carteira com sete ativos\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "298a6e60-52cd-491c-8777-cdd3038ab490",
      "metadata": {},
      "source": [
        "Este exemplo demonstra como executar a função de otimização dinâmica de portfólio (DPO) e ajustar suas configurações para obter o melhor desempenho. Ele inclui etapas detalhadas para o ajuste fino dos parâmetros para alcançar os resultados desejados.\n",
        "\n",
        "Esse caso envolve sete ativos, quatro etapas de tempo e quatro qubits de resolução, resultando em um requisito total de 112 qubits.\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. Verifique os ativos incluídos na carteira\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "276c3f55-f75b-4320-807b-007a3881bdaa",
      "metadata": {},
      "source": [
        "Se todos os ativos do portfólio estiverem armazenados em uma pasta em um caminho específico, você poderá carregá-los em um `pandas.DataFrame` e convertê-lo em um objeto no formato `dict` usando a seguinte função.\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": [
        "Para este exemplo, usamos os ativos [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). A figura a seguir ilustra os dados usados neste exemplo, mostrando a evolução do preço de fechamento diário dos ativos de 1º de janeiro a 1º de setembro de 2023.\n",
        "\n",
        "Neste exemplo, para garantir a uniformidade entre as datas, preenchemos os dias sem negociação com o preço de fechamento da data disponível anterior. Aplicamos essa etapa porque os ativos selecionados vêm de diferentes mercados com dias de negociação variados, o que torna essencial a padronização do conjunto de dados para fins de consistência.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "fb8b3592-5c1c-4dde-b635-a8b46e66f500",
      "metadata": {},
      "source": [
        "![Visualização dos dados históricos dos ativos](https://eu-de.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. Defina o problema\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "d6f9c0f2-48be-48a4-bef4-b98f5f85b8b1",
      "metadata": {},
      "source": [
        "Defina as especificações do problema configurando os parâmetros no dicionário `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. Defina as configurações do otimizador e do ansatz (opcional)\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "526df9d9-d52c-4a81-89ca-ff047eda5eb5",
      "metadata": {},
      "source": [
        "Opcionalmente, defina requisitos específicos para o processo de otimização, incluindo a seleção do otimizador e seus parâmetros, bem como a especificação da primitiva e suas configurações.\n",
        "\n",
        "Para o Tailored Ansatz, o tamanho da população escolhido foi baseado em experimentos anteriores que mostraram que esse valor produz uma otimização estável e eficiente.\n",
        "\n",
        "No caso do Real Amplitudes Ansatz, você pode seguir uma relação linear entre o `population_size` e o número de qubits no circuito. Como regra geral aproximada, recomenda-se usar um **mínimo** `population_size ~ 0.8 * n_qubits` para o `real_amplitudes` ansatz.\n",
        "\n",
        "Espera-se que as Amplitudes Reais Otimizadas tenham um desempenho de otimização melhor do que o ansatz das Amplitudes Reais. No entanto, o número de variáveis a serem otimizadas nesse ansatz aumenta muito mais rapidamente do que no caso das Amplitudes Reais (consulte o [manuscrito](https://arxiv.org/pdf/2412.19150) ). Assim, para problemas grandes, as amplitudes reais otimizadas exigem mais execuções de circuito. É provável que a Optimized Real Amplitudes seja útil para problemas que exijam até 100 qubits, mas é recomendável ter cuidado ao definir os parâmetros do `population_size` . Como exemplo desse aumento de escala em `population_size`, a tabela anterior mostra que, para um problema de 84 qubits, o Optimize Real Amplitudes requer 120 `population_size`, enquanto para um problema de 56 qubits, um `population_size` de 40 é suficiente.\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": [
        "Também é possível escolher um ansatz específico. A seguir, usamos o `'Tailored'` ansatz.\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. Execute o 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. Obter os resultados\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "fe8cfc2e-3305-4a33-89cc-a73fb64ada69",
      "metadata": {},
      "source": [
        "A função retorna um dicionário com as trajetórias de investimento ordenadas da menor para a maior, de acordo com o valor da função objetivo (consulte a seção [Saída](/docs/api/functions/global-data-quantum-optimizer#output) da referência da API). Este conjunto de resultados permite identificar a trajetória de menor custo e as avaliações de investimento correspondentes. Além disso, permite a análise de diferentes trajetórias, facilitando a seleção daquelas que melhor se alinham às necessidades ou objetivos específicos. Essa flexibilidade garante que as opções possam ser adaptadas para atender a uma variedade de preferências ou situações.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "eb7eeefd-935c-4c7e-8ea0-f2ef07498641",
      "metadata": {},
      "source": [
        "Comece apresentando a estratégia resultante que atingiu o menor custo objetivo encontrado durante o 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": [
        "Depois disso, usando os metadados, você pode acessar os resultados de todas as estratégias amostradas. Dessa forma, você pode analisar melhor as trajetórias alternativas retornadas pelo otimizador. Para fazer isso, leia o dicionário armazenado em `dpo_result['metadata']['all_samples_metrics']`, que contém não apenas informações adicionais sobre a estratégia ideal, mas também detalhes das outras estratégias candidatas avaliadas durante a otimização.\n",
        "\n",
        "O exemplo a seguir mostra como ler essas informações usando o site `pandas` para extrair as principais métricas associadas à estratégia ideal. Isso inclui o Desvio de Restrição, o Índice de Sharpe e o retorno de investimento correspondente.\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. Análise de desempenho\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "f595acfc-e26b-44fd-8c1c-8b1bc81611aa",
      "metadata": {},
      "source": [
        "Por último, analise o desempenho de seu aplicativo de otimização. Especificamente, compare seus resultados, obtidos no exemplo anterior, com uma linha de base aleatória para avaliar a eficácia de nossa abordagem. Se o algoritmo quântico produzir resultados demonstráveis e consistentes com valores de custo mais baixos, isso indica um processo de otimização eficaz.\n",
        "\n",
        "A figura apresenta as distribuições de probabilidade dos custos objetivos. Para gerar essas distribuições, pegue a lista de custos objetivos do resultado da função e conte as ocorrências de cada valor de custo (valores arredondados para a segunda casa decimal). Em seguida, atualize a coluna de contagem de acordo, unindo as contagens de valores arredondados idênticos. Observe que, para uma melhor comparação visual, as contagens de ocorrências foram normalizadas de modo que cada distribuição seja exibida entre 0 e 1.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "560912e7-6722-4f06-87b1-83fd4ac2073f",
      "metadata": {},
      "source": [
        "![Visualização da solução do problema de otimização](https://eu-de.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": [
        "Conforme mostrado na figura (linha sólida azul), a distribuição de custos da nossa abordagem Variational Quantum Eigensolver (pós-processada com SQD) está fortemente concentrada nos valores de custo objetivo mais baixos, indicando um bom desempenho de otimização. Em contrapartida, a linha de base com ruído apresenta uma distribuição mais ampla, centralizada em valores de custo mais altos. A linha vertical tracejada em cinza representa o valor médio da distribuição aleatória, destacando ainda mais a consistência da função no retorno de estratégias de investimento otimizadas. Para uma comparação adicional, a linha tracejada preta na figura corresponde à solução obtida com o otimizador Gurobi (versão gratuita). Todos esses resultados são explorados com mais detalhes nos benchmarks abaixo para o exemplo \"Mixed Assets\" avaliado com o ansatz \"Tailored\".\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "de293919-a802-4ebe-95e3-173083268741",
      "metadata": {},
      "source": [
        "<span id=\"benchmarks\" />\n",
        "\n",
        "# Referências\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "bb44f36c-de99-44ed-921b-003ec3030e86",
      "metadata": {},
      "source": [
        "Essa função foi testada em diferentes configurações de qubits de resolução, circuitos ansatz e agrupamentos de ativos de vários setores: uma mistura de diferentes ativos (Conjunto 1), derivados de petróleo (Conjunto 2) e IBEX35 (Conjunto 3). Veja mais detalhes na tabela a seguir.\n",
        "\n",
        "| Configurar     | Data       | Ativos                                                          |\n",
        "| -------------- | ---------- | --------------------------------------------------------------- |\n",
        "| **conjunto 1** | 01/01/2023 | 8801.T, CL=F, GBPJPY=X, ITX.MC, META, TMBMKDE-10Y, XS2239553048 |\n",
        "| **conjunto 2** | 01/06/2023 | CL=F, BZ=F, HO=F, NG=F, XOM, RB=F, 2222.SR                      |\n",
        "| **Conjunto 3** | 01/11/2022 | ACS.MC, ITX.MC, FER.MC, ELE.MC, SCYR.MC, AENA.MC, AMS.MC        |\n",
        "\n",
        "Duas métricas principais foram usadas para avaliar a qualidade da solução.\n",
        "\n",
        "1. O custo objetivo, que mede a eficiência da otimização comparando o valor da função de custo de cada experimento com os resultados do Gurobi (versão gratuita).\n",
        "2. O índice Sharpe, que captura o retorno ajustado ao risco de cada portfólio, oferecendo uma visão do desempenho financeiro das soluções.\n",
        "\n",
        "Juntas, essas métricas avaliam os aspectos computacionais e financeiros dos portfólios gerados por quantum.\n",
        "\n",
        "| Exemplo                                                                  | Qubits | Ansatz                      | Profundidade | Uso do tempo de execução (s) | Uso total (s) | Custo objetivo | Sharpe | Custo objetivo do Gurobi | Gurobi Sharpe |\n",
        "| ------------------------------------------------------------------------ | ------ | --------------------------- | ------------ | ---------------------------- | ------------- | -------------- | ------ | ------------------------ | ------------- |\n",
        "| Ativos mistos (Conjunto 1, 4 etapas de tempo, 4 bits)                    | 112    | Sob medida                  | 65           | 12735                        | 13095         | -3.78          | 24.82  | -4.25                    | 24.71         |\n",
        "| Ativos mistos (Conjunto 1, 4 etapas de tempo, 4 etapas de tempo, 4 bits) | 112    | Amplitudes reais            | 359          | 11739                        | 11903         | -3.39          | 23.64  | -4.25                    | 24.71         |\n",
        "| Derivativos de petróleo (Conjunto 2, 4 etapas de tempo, 3 bits)          | 84     | Amplitudes reais otimizadas | 78           | 6180                         | 6350          | -3.73          | 19.13  | -4.19                    | 21.71         |\n",
        "| IBEX35 (Conjunto 3, 4 etapas de tempo, 2 bits)                           | 56     | Amplitudes reais otimizadas | 96           | 3314                         | 3523          | -3.67          | 14.48  | -4.11                    | 16.44         |\n",
        "\n",
        "Os resultados mostram que o otimizador quântico, com ansatzes específicas do problema, identifica com eficácia estratégias de investimento eficientes em vários tipos de portfólio.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "2db3bd86-393e-4e88-851c-fd496f956aed",
      "metadata": {},
      "source": [
        "A seguir, detalhamos o tamanho da população e o número de gerações especificados no dicionário `optimizer_options` . Todos os outros parâmetros foram definidos com seus valores padrão.\n",
        "\n",
        "| **Exemplo**                         | `population_size` | `num_generations` |\n",
        "| ----------------------------------- | ----------------- | ----------------- |\n",
        "| Portfólio de ativos mistos          | 105               | 20                |\n",
        "| Portfólio de ativos mistos          | 92                | 20                |\n",
        "| Carteira de Derivativos de Petróleo | 120               | 20                |\n",
        "| IBEX35 Portfólio                    | 40                | 20                |\n",
        "\n",
        "O número de gerações foi definido como 20, pois esse valor foi considerado suficiente para atingir a convergência. Além disso, os valores padrão dos parâmetros internos do otimizador foram mantidos inalterados, uma vez que proporcionaram consistentemente um bom desempenho e são geralmente recomendados pela literatura e pelas diretrizes de implementação.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "021187a8-c6f9-4f31-89f8-32dbb85ec5f6",
      "metadata": {},
      "source": [
        "<span id=\"get-support\" />\n",
        "\n",
        "# Obtenha suporte\n",
        "\n",
        "Se precisar de ajuda, envie um e-mail para [qpo.support @ globaldataquantum.com](mailto:qpo.support@globaldataquantum.com). Em sua mensagem, forneça o ID do trabalho da função.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "0a6148bb-1b04-4ad8-bbaf-3cba2b41b037",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Próximas etapas\n",
        "\n",
        "<Admonition type=\"note\" title=\"Recomendações\">\n",
        "  * Leia [o artigo de pesquisa associado](https://arxiv.org/pdf/2412.19150).\n",
        "  * * Consulte a [referência da API](/docs/api/functions/global-data-quantum-optimizer) para esta função do Qiskit.\n",
        "  * Solicite acesso à função preenchendo [este formulário](https://globaldatum.io/qiskit-function/#form).\n",
        "  * Experimente o tutorial do [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
}