Referencia de la API de Quantum Portfolio Optimizer
Qiskit Functions — Herramientas preconfiguradas creadas por organizaciones asociadas — que abstraen partes del flujo de trabajo de desarrollo de software para simplificar y acelerar el descubrimiento de algoritmos y el desarrollo de aplicaciones a escala industrial. Haz clic aquí para ver la guía de esta función de Qiskit.
Guía de funciones de Quantum Portfolio Optimizer para Qiskit
Entrada
Los argumentos de entrada de la función se describen en la siguiente lista. Se deben proporcionar los datos de los activos y otras especificaciones del problema; además, se pueden incluir los parámetros de VQE para personalizar el proceso de optimización.
assets
Tipo: `json`
Diccionario con los precios de los activos. Los datos deben estar estructurados como un objeto JSON que contenga información sobre los precios de cierre de los activos financieros en fechas concretas. El formato es el siguiente:
- Clave primaria (cadena de caracteres): El nombre o el símbolo bursátil del activo financiero (por ejemplo, « 8801.T »).
- Clave secundaria (cadena): La fecha en formato AAAA-MM-DD.
- Valor (número): El precio de cierre del activo en la fecha indicada. Los precios pueden introducirse normalizados o sin normalizar.
Ten en cuenta que todos los diccionarios deben tener la misma clave secundaria (fechas). Si un activo concreto carece de una fecha que otros sí tienen, hay que completar los datos para garantizar la coherencia. Por ejemplo, esto se puede hacer utilizando el último precio de cierre registrado de ese activo.
- Obligatorio: Sí
- Ejemplo:
{
"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,
...
},
...
}Los datos de los activos deben incluir, como mínimo, los precios de cierre en los (nt+1) * dt momentos indicados (véase la sección qubo_settings de entrada) (por ejemplo, días).
qubo_settings
Tipo: `json`
Configuración del QUBO. En la siguiente tabla se describen las claves del diccionario qubo_settings . Crea el diccionario especificando el número de pasos temporales nt, el número de qubits de resolución nq y el max_investment - o modifica otros valores predeterminados.
Nombre | Tipo | Descripción | Obligatorio | Valor predeterminado | Ejemplo |
|---|---|---|---|---|---|
nt | int | Número de intervalos de tiempo | Sí | - | 4 |
nq | int | Número de qubits de resolución | Sí | - | 4 |
max_investment | flotante | Número máximo de unidades monetarias invertidas en todos los activos | Sí | - | 10 |
dt* | int | Intervalo de tiempo considerado en cada paso temporal. La unidad ajusta los intervalos de tiempo entre las claves de los datos de los activos | No | 30 | - |
risk_aversion | flotante | Coeficiente de aversión al riesgo | No | 1.000 | - |
transaction_fee | flotante | Coeficiente de comisión por transacción | No | 0.01 | - |
restriction_coeff | flotante | Multiplicador de Lagrange utilizado para garantizar el cumplimiento de la restricción del problema en la formulación QUBO | No | 1 | - |
- Obligatorio: Sí
ansatz_settings
Tipo: `json`
Valor predeterminado: `None`
Configuración del Ansatz. Para modificar las opciones predeterminadas, crea un diccionario para el ansatz_settings parámetro con las siguientes claves. Por defecto, el ansatz está configurado en "real_amplitudes", y ambas opciones adicionales (véase la tabla siguiente) están configuradas en False.
Nombre | Tipo | Descripción | Obligatorio | Valor predeterminado |
|---|---|---|---|---|
ansatz* | str | Enfoque que se utilizará | No | "real_amplitudes" |
multiple_passmanager** | bool | Habilita la subrutina de gestión de pases múltiples (no disponible para el enfoque «Tailored») | No | False |
dd_enable | bool | Añade desacoplamiento dinámico | No | False |
* Enfoques disponibles
real_amplitudescyclicoptimized_real_amplitudestailored(Solo paraibm_torinoel backend, 7 activos, 4 pasos temporales y 4 qubits de resolución)
** Si multiple_passmanager se establece en False, la función utiliza el gestor de pases predeterminado de Qiskit con optimization_level=3. Si se establece en True, la multiple_passmanager subrutina compara tres gestores de pasadas: el gestor de pasadas predeterminado anterior de Qiskit, un gestor de pasadas que asigna los qubits a la cadena de vecinos más cercanos de la QPU y los servicios del transpilador de IA. A continuación, se selecciona el gestor de pases con el error acumulativo estimado más bajo.
- Requisito: No
optimizer_settings
Tipo: `json`
Valor predeterminado: `None`
Configuración del optimizador. Este parámetro es un diccionario que contiene algunas opciones configurables del proceso de optimización.
Nombre | Tipo | Descripción | Obligatorio | Valor predeterminado |
|---|---|---|---|---|
primitive_options | json | Configuración de la primitiva | No | - |
optimizer | str | Optimizador clásico seleccionado | No | "differential_evolution" |
optimizer_options | json | Configuración del optimizador | No | - |
Actualmente, la única opción de optimizador disponible es "differential_evolution".
Bajo las claves primitive_options``optimizer_options y configuramos diccionarios con los siguientes parámetros:
primitive_options
Nombre | Tipo | Descripción | Obligatorio | Valor predeterminado | Ejemplo |
|---|---|---|---|---|---|
sampler_shots | int | Número de disparos del Sampler. | No | 100000 | - |
estimator_shots | int | Número de disparos del Estimator. | No | 25000 | - |
estimator_precision | flotante | Precisión deseada del valor esperado. Si se especifica, se utilizará la precisión en lugar del estimator_shots. | No | None | 0.015625 · (1 / √4096) |
max_time | int o str | Tiempo máximo durante el cual una sesión de ejecución puede permanecer abierta antes de que se cierre de forma forzada. Se puede indicar en segundos (int) o como una cadena, como "2h 30m 40s". Debe ser inferior al máximo establecido por el sistema. | No | None | "1h 15m" |
optimizer_options
Nombre | Tipo | Descripción | Obligatorio | Valor predeterminado |
|---|---|---|---|---|
num_generations | int | Número de generaciones | No | 20 |
population_size | int | Tamaño de la población | No | 20 |
mutation_range | list de | Factor de mutación máximo y mínimo | No | [0, 0.25] |
recombination | flotante | Factor de recombinación | No | 0.4 |
max_parallel_jobs | int | Número máximo de trabajos de QPU ejecutados en paralelo | No | 3 |
max_batchsize | int | Tamaño máximo de lote | No | 200 |
-
El número de generaciones evaluadas por la evolución diferencial es
num_generations+1, ya que se incluye la población inicial. -
El número total de circuitos se calcula de la siguiente manera
(num_generations + 1) * population_size: -
El uso de un tamaño de población mayor y de más generaciones suele mejorar la calidad de los resultados de la optimización. Sin embargo, no se recomienda superar un tamaño de población de 120 individuos ni un número de generaciones superior a 20 (por ejemplo,
120 * 21 = 2520el número total de iteraciones), ya que esto generaría un número excesivo de iteraciones, cuyo procesamiento puede resultar muy costoso desde el punto de vista computacional y llevar mucho tiempo. -
Esta función permite reanudar la optimización anterior, y siempre es posible aumentar el número de generaciones (introduciendo los mismos datos de entrada, salvo por
previous_session_idy un valor mayor denum_generations).
- Requisito: No
backend
Tipo: `str`
El nombre del backend de la QPU
- Requisito: No
- Ejemplo:
ibm_torino
previous_session_id
Tipo: `list` of `str`
Valor predeterminado: Empty list
Lista de identificadores de sesión para recuperar datos de ejecuciones anteriores. Para reanudar una ejecución o recuperar trabajos que se procesaron en una o varias sesiones anteriores, es necesario indicar la lista de ID de sesión en el previous_session_id parámetro. Esto resulta especialmente útil en los casos en que una tarea de optimización no se ha completado debido a algún error en el proceso y es necesario finalizar la ejecución. Para ello, debes proporcionar los mismos argumentos que se utilizaron en la ejecución inicial, junto con la previous_session_id lista tal y como se ha descrito.
- Requisito: No
- Ejemplo:
["session_id_1", "session_id_2"]
apply_postprocess
Tipo: `bool`
Valor predeterminado: `True`
Aplicar un posprocesamiento SQD sensible al ruido.
- Requisito: No
- Ejemplo:
True
tags
Tipo: `list` of `str`
Valor predeterminado: Empty list
Lista de etiquetas para identificar el experimento.
- Requisito: No
- Ejemplo:
["optimization", "quantum_computing"]
La carga de datos de sesiones anteriores (para reanudar una optimización) puede llevar hasta una hora de tiempo de cálculo clásico. Esto no consume recursos de tiempo de ejecución de Quantum.
Asegúrese de que se respeten los límites de trabajo de Qiskit Runtime.
- Muestra:
sampler_shots <= 10_000_000. - Estimador:
max_batchsize * estimator_shots * observable_size <= 10_000_000(para esta función, todos los términos de la observable conmutan, por lo queobservable_size=1).
Consulta la guía sobre límites de tareas para obtener más información.
Resultado
La función devuelve dos diccionarios: "result" dictionary, que contiene los mejores resultados de la optimización, incluida la solución óptima y el coste objetivo mínimo asociado; y "metadata", con los datos de todos los resultados obtenidos durante el proceso de optimización, junto con sus respectivas métricas.
El primer diccionario se centra en la solución con mejor rendimiento, mientras que el segundo ofrece información detallada sobre todas las soluciones, incluidos los costes objetivos y otras métricas relevantes.
result diccionario
Tipo: dict[str, dict[str, float]]
Contiene la estrategia de inversión a lo largo del tiempo, de modo que cada marca temporal se corresponde con las ponderaciones de inversión específicas de cada activo (cada ponderación es el importe de la inversión normalizado con respecto al importe total de la inversión).
- Ejemplo:
{'time_1': {'asset_1': 0.2, 'asset_2': 0.3, ...}, ...}
metadata diccionario
Tipo: dict[str, Any]
Datos generados durante el análisis, incluyendo soluciones, costes y métricas.
Nombre | Type | Descripción | Ejemplo |
|---|---|---|---|
session_id | str | Identificador único de la sesión de IBM Quantum. | "d0h30qjvpqf00084fgw0" |
all_samples_metrics | dict | Diccionario que contiene diversas métricas para cada muestra posprocesada, como costes o restricciones. | Ver descripción |
sampler_counts | [d] ictstr, int | Diccionario en el que las claves son representaciones en forma de cadena de bits de soluciones muestreadas y los valores son sus recuentos. | {"101010": 3, "111000": 1} |
asset_order | [liststr] | Enumera el orden de inversión de los activos en cada intervalo de tiempo dentro de las estrategias de inversión. | ["Asset_0", "Asset_1", "Asset_3"] |
QUBO | lista[ [listfloat] ] | Matriz QUBO del problema. | [[-6.96e-01, 5.81e-01, -1.26e-02, 0.00e+00], ...] |
resource_summary | dict[cadena, [cadena] _diccionario, número] | Resumen de los tiempos de uso de la CPU y la QPU (en segundos) en las diferentes fases del proceso. | {'RUNNING: EXECUTING_QPU': {'CPU_TIME': 412.84, 'QPU_TIME': 87.22}, ...} |
Descripción del all_samples_metrics diccionario
Nombre | Type | Descripción | Ejemplo |
|---|---|---|---|
investment_trajectories | [l] ista | Estrategias de inversión derivadas de estados cuánticos descodificados. | [[1, 2, 2], [1, 2, 1]] |
counts | [escuchando] | Número de veces que se tomó una muestra de cada trayectoria de inversión. El índice coincide investment_trajectories. | [5, 3] |
objective_costs | [listfloat] | Valor de la función objetivo para cada trayectoria de inversión, ordenados de menor a mayor. | [0.98, 1.25] |
sharpe_ratios | [listfloat] | Rendimiento ajustado al riesgo (índice de Sharpe) para cada trayectoria de inversión. Ordenado por índice. | [1.1, 0.7] |
returns | [listfloat] | Rentabilidad prevista para cada trayectoria de inversión. Ordenado por índice. | [0.15, 0.10] |
rest_breaches | [listfloat] | Desviación máxima de la restricción dentro de cada trayectoria de inversión. Ordenado por índice. | [0.0, 0.25] |
transaction_costs | [listfloat] | Coste estimado de transacción asociado a cada trayectoria de inversión. Ordenado por índice. | [0.01, 0.02] |