Referência da API do Quantum Portfolio Optimizer
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.
Guia de funções do Quantum Portfolio Optimizer no 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,
...
},
...
}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 |
|---|---|---|---|---|---|
nt | int | Número de intervalos de tempo | True | - | 4 |
nq | int | Número de qubits de resolução | True | - | 4 |
max_investment | valor flutuante | Número máximo de unidades monetárias investidas em todos os ativos | True | - | 22 |
dt* | int | Intervalo de tempo considerado em cada etapa temporal. A unidade corresponde aos intervalos de tempo entre as chaves nos dados do ativo | Não | 30 | - |
risk_aversion | valor flutuante | Coeficiente de aversão ao risco | Não | 1000 | - |
transaction_fee | valor flutuante | Coeficiente da taxa de transação | Não | 0.01 | - |
restriction_coeff | valor flutuante | Multiplicador de Lagrange utilizado para garantir o cumprimento da restrição do problema na formulação QUBO | Não | 1 | - |
- 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* | str | Abordagem a ser utilizada | Não | "real_amplitudes" |
multiple_passmanager** | bool | Habilita sub-rotinas múltiplas do gerenciador de passagens (não disponível para o método Tailored) | Não | False |
dd_enable | bool | Adiciona desacoplamento dinâmico | Não | False |
* Abordagens disponíveis
real_amplitudescyclicoptimized_real_amplitudestailored(Apenas paraibm_torinoo 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_options | json | Configurações da primitiva | Não | - |
optimizer | str | Otimizador clássico selecionado | Não | "differential_evolution" |
optimizer_options | json | Configuração do otimizador | Não | - |
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_shots | int | Número de fotos do Sampler. | Não | 100.000 | - |
estimator_shots | int | Número de disparos do Estimador. | Não | 25000 | - |
estimator_precision | valor flutuante | Precisão desejada do valor esperado. Se especificada, a precisão será usada em vez do estimator_shots. | Não | None | 0.015625 · (1 / √4096) |
max_time | int ou str | Tempo 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ão | None | "1h 15m" |
optimizer_options
Nome | Tipo | Descrição | Necessário | Padrão |
|---|---|---|---|---|
num_generations | int | Número de gerações | Não | 20 |
population_size | int | Tamanho da população | Não | 20 |
mutation_range | lista | Fator de mutação máximo e mínimo | Não | [0, 0.25] |
recombination | valor flutuante | Fator de recombinação | Não | 0.4 |
max_parallel_jobs | int | Número máximo de tarefas da QPU executadas em paralelo | Não | 3 |
max_batchsize | int | Tamanho de lote máximo | Não | 200 |
-
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 = 2520totais), 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_ide um valor maior denum_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"]
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.
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, portantoobservable_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_id | str | Identificador único da sessão do IBM Quantum. | "d0h30qjvpqf00084fgw0" |
all_samples_metrics | dict | Dicioná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, int | Dicioná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"] |
QUBO | lista[ [listfloat] ] | Matriz QUBO do problema. | [[-6.96e-01, 5.81e-01, -1.26e-02, 0.00e+00], ...] |
resource_summary | dict[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] ista | Estraté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] |