Skip to main content
IBM Quantum Platform

Referência da API do Quantum Portfolio Optimizer

  • Qiskit Functions

    Qiskit Functions — ferramentas pré-configuradas criadas por organizações parceiras — abstraem partes do fluxo de trabalho de desenvolvimento de software para simplificar e acelerar a descoberta de algoritmos e o desenvolvimento de aplicativos em escala de serviços públicos. Clique para ver o guia desta função do Qiskit.


Entrada

Os argumentos de entrada da função estão descritos na lista a seguir. É necessário fornecer os dados dos ativos e outras especificações do problema; além disso, é possível incluir as configurações do VQE para personalizar o processo de otimização.

assets

Tipo: `json`

Dicionário com os preços dos ativos. Os dados devem estar estruturados como um objeto JSON que armazena informações sobre os preços de fechamento de ativos financeiros em datas específicas. O formato é o seguinte:

  • Chave primária (cadeia de caracteres): O nome ou código do ativo financeiro (por exemplo, “ 8801.T ”).
  • Chave secundária (cadeia de caracteres): A data no formato AAAA-MM-DD.
  • Valor (número): O preço de fechamento do ativo na data especificada. Os preços podem ser inseridos normalizados ou não normalizados.

Observe que todos os dicionários devem ter a mesma chave secundária (datas). Se um ativo específico não tiver uma data que outros possuem, os dados devem ser preenchidos para garantir a consistência. Por exemplo, isso pode ser feito utilizando o último preço de fechamento registrado desse ativo.

  • Necessário: sim
  • Exemplo:
{
    "8801.T": {
        "2023-01-01": 2374.0,
        "2023-01-02": 2374.0,
        "2023-01-03": 2374.0,
        "2023-01-04": 2356.5,
        ...
    },
    "AAPL": {
        "2023-01-01": 145.2,
        "2023-01-02": 146.5,
        "2023-01-03": 147.3,
        "2023-01-04": 148.1,
        ...
    },
    ...
}
{
    "asset_name": {
        "date": closing_value,
        ...
    },
    ...
}
Nota

Os dados dos ativos devem conter, no mínimo, os preços de fechamento com carimbos de data e hora (nt+1) * dt (por exemplo, dias) (consulte a seção qubo_settings de entrada).

qubo_settings

Tipo: `json`

Configurações do QUBO. A tabela a seguir descreve as chaves do qubo_settings dicionário. Crie o dicionário especificando o número de passos nttemporais, o número de qubits de nqresolução e o max_investment - ou altere outros valores padrão.

Nome
Tipo
Descrição
Necessário
Padrão
Exemplo
ntintNúmero de intervalos de tempoTrue-4
nqintNúmero de qubits de resoluçãoTrue-4
max_investmentvalor flutuanteNúmero máximo de unidades monetárias investidas em todos os ativosTrue-22
dt*intIntervalo de tempo considerado em cada etapa temporal. A unidade corresponde aos intervalos de tempo entre as chaves nos dados do ativoNão30-
risk_aversionvalor flutuanteCoeficiente de aversão ao riscoNão1000-
transaction_feevalor flutuanteCoeficiente da taxa de transaçãoNão0.01-
restriction_coeffvalor flutuanteMultiplicador de Lagrange utilizado para garantir o cumprimento da restrição do problema na formulação QUBONão1-
  • Necessário: sim

ansatz_settings

Tipo: `json`

Valor Padrão: `None`

Configurações do Ansatz. Para modificar as opções padrão, crie um dicionário para o ansatz_settings parâmetro com as seguintes chaves. Por padrão, o ansatz está definido como "real_amplitudes", e ambas as opções adicionais (consulte a tabela a seguir) estão definidas como False.

Nome
Tipo
Descrição
Necessário
Padrão
ansatz*strAbordagem a ser utilizadaNão"real_amplitudes"
multiple_passmanager**boolHabilita sub-rotinas múltiplas do gerenciador de passagens (não disponível para o método Tailored)NãoFalse
dd_enableboolAdiciona desacoplamento dinâmicoNãoFalse

* Abordagens disponíveis

  • real_amplitudes
  • cyclic
  • optimized_real_amplitudes
  • tailored (Apenas para ibm_torino o backend, 7 ativos, 4 passos temporais e 4 qubits de resolução)

** Se multiple_passmanager estiver definido como False, a função utiliza o gerenciador de passagens padrão do Qiskit com optimization_level=3. Se definido como True, a multiple_passmanager sub-rotina compara três gerenciadores de passagem: o gerenciador de passagem padrão anterior do Qiskit, um gerenciador de passagem que mapeia os qubits ao longo da cadeia de vizinhos mais próximos da QPU e os serviços do transpiler de IA. Em seguida, é selecionado o gerenciador de passagens com o menor erro cumulativo estimado.

  • Obrigatório: Não

optimizer_settings

Tipo: `json`

Valor Padrão: `None`

Configurações do otimizador. Este parâmetro é um dicionário que contém algumas opções ajustáveis do processo de otimização.

Nome
Tipo
Descrição
Necessário
Padrão
primitive_optionsjsonConfigurações da primitivaNão-
optimizerstrOtimizador clássico selecionadoNão"differential_evolution"
optimizer_optionsjsonConfiguração do otimizadorNão-
Nota

Atualmente, a única opção de otimizador disponível é "differential_evolution".

Nas chaves primitive_options``optimizer_options e definimos dicionários com os seguintes parâmetros:

primitive_options

Nome
Tipo
Descrição
Necessário
Padrão
Exemplo
sampler_shotsintNúmero de fotos do Sampler.Não100.000-
estimator_shotsintNúmero de disparos do Estimador.Não25000-
estimator_precisionvalor flutuantePrecisão desejada do valor esperado. Se especificada, a precisão será usada em vez do estimator_shots.NãoNone0.015625 · (1 / √4096)
max_timeint ou strTempo máximo durante o qual uma sessão de execução pode permanecer aberta antes de ser encerrada à força. Pode ser fornecido em segundos (int) ou como uma string, como "2h 30m 40s". Deve ser inferior ao máximo imposto pelo sistema.NãoNone"1h 15m"

optimizer_options

Nome
Tipo
Descrição
Necessário
Padrão
num_generationsintNúmero de geraçõesNão20
population_sizeintTamanho da populaçãoNão20
mutation_rangelistaFator de mutação máximo e mínimoNão[0, 0.25]
recombinationvalor flutuanteFator de recombinaçãoNão0.4
max_parallel_jobsintNúmero máximo de tarefas da QPU executadas em paraleloNão3
max_batchsizeintTamanho de lote máximoNão200
Nota
  • O número de gerações avaliadas pela evolução diferencial é num_generations +1, uma vez que a população inicial está incluída.

  • O número total de circuitos é calculado da seguinte forma (num_generations + 1) * population_size:

  • O uso de uma população maior e de mais gerações geralmente melhora a qualidade dos resultados da otimização. No entanto, não é recomendável exceder um tamanho de população de 120 e um número de gerações superior a 20 (por exemplo, circuitos 120 * 21 = 2520 totais), pois isso geraria um número excessivo de circuitos, o que pode ser computacionalmente oneroso e demorado de processar.

  • A função permite retomar a otimização anterior, e é sempre possível aumentar o número de gerações (fornecendo os mesmos dados de entrada, exceto por previous_session_id e um valor maior de num_generations).

  • Obrigatório: Não

backend

Tipo: `str`

O nome do backend da QPU

  • Obrigatório: Não
  • Exemplo:ibm_torino

previous_session_id

Tipo: `list` of `str`

Valor Padrão: Empty list

Lista de IDs de sessão para recuperar dados de execuções anteriores. Para retomar uma execução ou recuperar tarefas que foram processadas em uma ou mais sessões anteriores, a lista de IDs de sessão deve ser passada no previous_session_id parâmetro. Isso é particularmente útil nos casos em que uma tarefa de otimização não foi concluída devido a algum erro no processo e é necessário finalizar a execução. Para isso, é necessário fornecer os mesmos argumentos utilizados na execução inicial, juntamente com a previous_session_id lista conforme descrito.

  • Obrigatório: Não
  • Exemplo:["session_id_1", "session_id_2"]

apply_postprocess

Tipo: `bool`

Valor Padrão: `True`

Aplicar pós-processamento SQD sensível ao ruído.

  • Obrigatório: Não
  • Exemplo:True

tags

Tipo: `list` of `str`

Valor Padrão: Empty list

Lista de tags para identificar o experimento.

  • Obrigatório: Não
  • Exemplo:["optimization", "quantum_computing"]
Aviso

Carregar dados de sessões anteriores (para retomar uma otimização) pode levar até uma hora de tempo de computação clássico. Isso não consome recursos de tempo de execução do Quantum.

Nota

Assegure o cumprimento dos limites de tarefas do Qiskit Runtime.

  • Amostra: sampler_shots <= 10_000_000.
  • Estimador: max_batchsize * estimator_shots * observable_size <= 10_000_000 (para esta função, todos os termos do observável comutam, portanto observable_size=1).

Consulte o guia de limites de tarefas para obter mais informações.


Saída

A função retorna dois dicionários: "result" dictionary, que contém os melhores resultados da otimização, incluindo a solução ótima e seu custo objetivo mínimo associado; e "metadata", com dados de todos os resultados obtidos durante o processo de otimização, juntamente com suas respectivas métricas.

O primeiro dicionário concentra-se na solução com melhor desempenho, enquanto o segundo fornece informações detalhadas sobre todas as soluções, incluindo custos objetivos e outras métricas relevantes.

result dicionário

Tipo: dict[str, dict[str, float]]

Contém a estratégia de investimento ao longo do tempo, com cada data e hora correspondendo a ponderações de investimento específicas para cada ativo (cada ponderação é o valor do investimento normalizado pelo valor total do investimento).

  • Exemplo:{'time_1': {'asset_1': 0.2, 'asset_2': 0.3, ...}, ...}

metadata dicionário

Tipo: dict[str, Any]

Dados gerados durante a análise, incluindo soluções, custos e métricas.

Nome
Tipo
Descrição
Exemplo
session_idstrIdentificador único da sessão do IBM Quantum."d0h30qjvpqf00084fgw0"
all_samples_metricsdictDicionário que contém várias métricas para cada amostra pós-processada, tais como custos ou restrições.Veja a descrição
sampler_counts[d] ictstr, intDicionário em que as chaves são representações em cadeia de bits de soluções amostradas e os valores são suas contagens.{"101010": 3, "111000": 1}
asset_order[liststr]Lista com a ordem de investimento correspondente dos ativos em cada intervalo de tempo dentro das estratégias de investimento.["Asset_0", "Asset_1", "Asset_3"]
QUBOlista[ [listfloat] ]Matriz QUBO do problema.[[-6.96e-01, 5.81e-01, -1.26e-02, 0.00e+00], ...]
resource_summarydict[str, [dic] tstr, float]Resumo dos tempos de uso da CPU e da QPU (em segundos) nas diferentes etapas do processo.{'RUNNING: EXECUTING_QPU': {'CPU_TIME': 412.84, 'QPU_TIME': 87.22}, ...}

Descrição do all_samples_metrics dicionário

Nome
Tipo
Descrição
Exemplo
investment_trajectories[l] istaEstratégias de investimento derivadas de estados quânticos decodificados.[[1, 2, 2], [1, 2, 1]]
counts[listint]Número de vezes que cada trajetória de investimento foi amostrada. O índice corresponde investment_trajectories.[5, 3]
objective_costs[listfloat]Valor da função objetivo para cada trajetória de investimento, ordenado do menor para o maior.[0.98, 1.25]
sharpe_ratios[listfloat]Desempenho ajustado ao risco (índice de Sharpe) para cada trajetória de investimento. Ordenado por índice.[1.1, 0.7]
returns[listfloat]Retorno esperado para cada trajetória de investimento. Ordenado por índice.[0.15, 0.10]
rest_breaches[listfloat]Desvio máximo da restrição dentro de cada trajetória de investimento. Ordenado por índice.[0.0, 0.25]
transaction_costs[listfloat]Custo de transação estimado associado a cada trajetória de investimento. Ordenado por índice.[0.01, 0.02]
Esta página foi útil?
Relate um bug, erro de digitação ou solicite conteúdo no GitHub.