Перейти до основного вмісту

Quantum Portfolio Optimizer: Qiskit Function від Global Data Quantum

примітка

Qiskit Functions — це експериментальна функція, доступна лише користувачам тарифних планів IBM Quantum® Premium Plan, Flex Plan та On-Prem (через IBM Quantum Platform API). Вони перебувають у стані попереднього релізу та можуть змінюватися.

Огляд

Quantum Portfolio Optimizer — це Qiskit Function, яка вирішує задачу динамічної оптимізації портфеля, стандартну задачу у фінансах, що спрямована на перебалансування періодичних інвестицій між набором активів з метою максимізації прибутку та мінімізації ризиків. Використовуючи передові методи квантової оптимізації, ця функція спрощує процес так, щоб користувачі без будь-яких знань у сфері квантових обчислень могли скористатися її перевагами у пошуку оптимальних інвестиційних траєкторій. Ідеально підходить для портфельних менеджерів, дослідників у кількісних фінансах та індивідуальних інвесторів — цей інструмент дає змогу проводити бектестування торгових стратегій при оптимізації портфеля.

Опис функції

Функція Quantum Portfolio Optimizer використовує алгоритм Варіаційного Квантового Власного Розкладача (VQE) для розв'язання задачі Квадратичної Незв'язаної Бінарної Оптимізації (QUBO), вирішуючи задачі динамічної оптимізації портфеля. Користувачам потрібно лише надати дані про ціни активів і задати інвестиційні обмеження, після чого функція запускає процес квантової оптимізації, який повертає набір оптимізованих інвестиційних траєкторій.

Процес складається з чотирьох основних етапів. Спочатку вхідні дані відображаються у квантово-сумісну задачу: будується QUBO для задачі динамічної оптимізації портфеля та перетворюється на квантовий оператор (Ізінговий гамільтоніан). Далі вхідна задача і алгоритм VQE адаптуються для роботи на квантовому залізі. Після цього алгоритм VQE запускається на квантовому залізі, і нарешті результати постобробляються для отримання оптимальних інвестиційних траєкторій. Система також включає шумозахисну постобробку на основі (SQD) для максимізації якості вихідних даних.

Ця Qiskit Function базується на опублікованій статті компанії Global Data Quantum. Візуалізація робочого процесу функції

Вхідні дані

Вхідні аргументи функції описані в таблиці нижче. Дані про активи та інші параметри задачі є обов'язковими; крім того, можна задати налаштування VQE для налаштування процесу оптимізації.

НазваТипОписОбов'язковийЗа замовчуваннямПриклад
assetsjsonСловник із цінами активівТак--
qubo_settingsjsonНалаштування QUBOТак-Дивись приклади в таблиці нижче
ansatz_settingsjsonНалаштування ансатцуНіNoneДивись приклади в таблиці нижче.
optimizer_settingsjsonНалаштування оптимізатораНіNoneДивись приклади в таблиці нижче.
backendstrНазва бекенду QPUНі-"ibm_torino"
previous_session_idlist of strСписок ідентифікаторів сесій для отримання даних із попередніх запусків(*)НіПорожній список["session_id_1", "session_id_2"]
apply_postprocessboolЗастосувати шумозахисну постобробку SQDНіTrueTrue
tagslist of stringsСписок тегів для ідентифікації експериментуНіПорожній список["optimization", "quantum_computing"]

*Щоб відновити виконання або отримати завдання, оброблені в одній або кількох попередніх сесіях, необхідно передати список ідентифікаторів сесій у параметрі previous_session_id. Це особливо корисно у випадках, коли задача оптимізації не завершилася через будь-яку помилку в процесі, і виконання потрібно довести до кінця. Для цього потрібно вказати ті самі аргументи, що й при початковому виконанні, разом зі списком previous_session_id, як описано вище.

Попередження

Завантаження даних із попередніх сесій (для відновлення оптимізації) може тривати до однієї години.

assets

Дані мають бути структуровані як JSON-об'єкт, що містить інформацію про ціни закриття фінансових активів на певні дати. Формат такий:

  • Первинний ключ (рядок): Назва або тикер фінансового активу (наприклад, "8801.T").
  • Вторинний ключ (рядок): Дата у форматі YYYY-MM-DD.
  • Значення (число): Ціна закриття активу на вказану дату. Ціни можна вводити як нормалізовані, так і ненормалізовані.

Зверни увагу, що всі словники мають мати однаковий вторинний ключ (дати). Якщо певному активу бракує дати, наявної в інших, дані слід доповнити для забезпечення однорідності. Наприклад, це можна зробити, використавши останню відому ціну закриття цього активу.

Приклад

{
"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,
...
},
...
}
# Added by doQumentation — required packages for this notebook
!pip install -q pandas qiskit-ibm-catalog
{
"asset_name": {
"date": closing_value,
...
},
...
}
Примітка

Дані про активи мають містити щонайменше ціни закриття для (nt+1) * dt (дивись розділ вхідних даних qubo_settings) часових міток (наприклад, днів).

qubo_settings

Наступна таблиця описує ключі словника qubo_settings. Побудуй словник, вказавши кількість часових кроків nt, кількість qubits роздільної здатності nq та max_investment — або зміни інші значення за замовчуванням.

НазваТипОписОбов'язковийЗа замовчуваннямПриклад
ntintКількість часових кроківТак-4
nqintКількість qubits роздільної здатностіТак-4
max_investmentfloatМаксимальна кількість одиниць валюти, що інвестується в усі активиТак-10
dt*intЧасове вікно, що розглядається на кожному часовому кроці. Одиниця відповідає інтервалам між ключами в даних про активиНі30-
risk_aversionfloatКоефіцієнт несприйняття ризикуНі1000-
transaction_feefloatКоефіцієнт транзакційного зборуНі0.01-
restriction_coefffloatМножник Лагранжа, що використовується для виконання обмеження задачі у QUBO-формуляціїНі1-

ansatz_settings

Щоб змінити параметри за замовчуванням, створи словник для параметра ansatz_settings з такими ключами. За замовчуванням ансатц встановлений на "real_amplitudes", а обидва додаткові параметри (дивись таблицю нижче) мають значення False.

НазваТипОписОбов'язковийЗа замовчуванням
ansatz*strАнсатц для використанняНі"real_amplitudes"
multiple_passmanager**boolВмикає підпрограму multiple passmanager (недоступна для Tailored ansatz)НіFalse
dd_enableboolДодає динамічне роз'єднанняНіFalse

* Доступні ансатци

  • real_amplitudes
  • cyclic
  • optimized_real_amplitudes
  • tailored (лише для бекенду ibm_torino, 7 активів, 4 часові кроки та 4 qubits роздільної здатності)

** Якщо multiple_passmanager встановлено в False, функція використовує стандартний менеджер проходів Qiskit з optimization_level=3. Якщо встановлено в True, підпрограма multiple_passmanager порівнює три менеджери проходів: попередній стандартний менеджер проходів Qiskit, менеджер проходів, що відображає qubits на ланцюжок найближчих сусідів QPU, та сервіси AI transpiler. Потім обирається менеджер проходів з оцінено нижчою накопиченою похибкою.

optimizer_settings

Цей параметр — словник із деякими налаштовуваними параметрами процесу оптимізації.

НазваТипОписОбов'язковийЗа замовчуванням
primitive_optionsjsonНалаштування примітивуНі-
optimizerstrВибраний класичний оптимізаторНі"differential_evolution"
optimizer_optionsjsonКонфігурація оптимізатораНі-
Примітка

Наразі єдиний доступний варіант оптимізатора — "differential_evolution".

Під ключами primitive_options та optimizer_options задаються словники з такими параметрами:

primitive_options

НазваТипОписОбов'язковийЗа замовчуваннямПриклад
sampler_shotsintКількість вимірів Sampler.Ні100000-
estimator_shotsintКількість вимірів Estimator.Ні25000-
estimator_precisionfloatБажана точність очікуваного значення. Якщо вказано, замість estimator_shots буде використана точність.НіNone0.015625 · (1 / sqrt(4096))
max_timeint або strМаксимальний час, протягом якого сесія runtime може залишатися відкритою до примусового закриття. Можна вказати в секундах (int) або у вигляді рядка, наприклад "2h 30m 40s". Має бути менше системного максимуму.НіNone"1h 15m"

optimizer_options

НазваТипОписОбов'язковийЗа замовчуванням
num_generationsintКількість поколіньНі20
population_sizeintРозмір популяціїНі20
mutation_rangelistМаксимальний та мінімальний коефіцієнт мутаціїНі[0, 0.25]
recombinationfloatКоефіцієнт рекомбінаціїНі0.4
max_parallel_jobsintМаксимальна кількість паралельно виконуваних завдань QPUНі3
max_batchsizeintМаксимальний розмір пакетуНі200
Примітка
  • Кількість поколінь, що оцінюються диференціальною еволюцією, дорівнює num_generations + 1, оскільки початкова популяція включена.

  • Загальна кількість схем обчислюється як (num_generations + 1) * population_size.

  • Використання більшого розміру популяції та більшої кількості поколінь загалом покращує якість результатів оптимізації. Однак не рекомендується перевищувати розмір популяції 120 та кількість поколінь більше 20 (наприклад, 120 * 21 = 2520 схем загалом), оскільки це генерує надмірну кількість схем, що може бути обчислювально витратним і трудомістким.

  • Функція дозволяє відновити попередню оптимізацію, і завжди можна збільшити кількість поколінь (надаючи ті самі вхідні дані, крім previous_session_id та збільшеного num_generations).

Примітка

Забезпечуй дотримання обмежень на завдання Qiskit Runtime.

  • Sampler: sampler_shots <= 10_000_000.
  • Estimator: max_batchsize * estimator_shots * observable_size <= 10_000_000 (для цієї функції всі члени спостережуваної величини комутують, тому observable_size=1).

Дивись посібник Обмеження завдань для отримання додаткової інформації.

Вихідні дані

Функція повертає два словники: словник "result", що містить найкращі результати оптимізації, включаючи оптимальне рішення та його мінімальне значення цільової функції; та "metadata" — з даними про всі результати, отримані під час процесу оптимізації, разом із відповідними метриками.

Перший словник зосереджений на найефективнішому рішенні, тоді як другий надає детальну інформацію про всі рішення, включаючи значення цільових функцій та інші відповідні метрики.

Вихідні словники:

НазваТипОписПриклад
resultdict[str, dict[str, float]]Містить інвестиційну стратегію в часі, де кожна часова мітка відповідає часткам інвестицій у конкретні активи (кожна частка — це сума інвестиції, нормована на загальну суму).{'time_1': {'asset_1': 0.2, 'asset_2': 0.3, ...\}, ...\}
metadatadict[str, Any]Дані, згенеровані під час аналізу, включаючи рішення, витрати та метрики.Дивись приклади нижче

Опис словника metadata

НазваТипОписПриклад
session_idstrУнікальний ідентифікатор сесії IBM Quantum."d0h30qjvpqf00084fgw0"
all_samples_metricsdictСловник, що містить різні метрики для кожного постобробленого зразка, наприклад витрати або обмеження.Дивись опис нижче
sampler_countsdict[str, int]Словник, де ключами є бітрядкові представлення відібраних рішень, а значеннями — їх кількості.{"101010": 3, "111000": 1\}
asset_orderlist[str]Список із відповідним порядком інвестування активів на кожному часовому кроці в інвестиційних стратегіях.["Asset_0", "Asset_1", "Asset_3"]
QUBOlist[list[float]]QUBO-матриця задачі.[[-6.96e-01, 5.81e-01, -1.26e-02, 0.00e+00], ...]
resource_summarydict[str, dict[str, float]]Зведення часу використання CPU та QPU (у секундах) на різних етапах процесу.{'RUNNING: EXECUTING_QPU': {'CPU_TIME': 412.84, 'QPU_TIME': 87.22\}, ...\}

Опис словника all_samples_metrics

НазваТипОписПриклад
investment_trajectorieslist[list]Інвестиційні стратегії, отримані з декодованих квантових станів.[[1, 2, 2], [1, 2, 1]]

| counts | list[int] | Кількість разів, коли кожна інвестиційна траєкторія була відібрана. Індекс відповідає investment_trajectories. | [5, 3] | | objective_costs | list[float] | Значення цільової функції для кожної інвестиційної траєкторії, впорядковані від найменшого до найбільшого. | [0.98, 1.25] | | sharpe_ratios | list[float] | Скоригована на ризик ефективність (коефіцієнт Шарпа) для кожної інвестиційної траєкторії. Вирівняно за індексом. | [1.1, 0.7] | | returns | list[float] | Очікувана прибутковість для кожної інвестиційної траєкторії. Вирівняно за індексом. | [0.15, 0.10] | | rest_breaches | list[float] | Максимальне відхилення від обмеження в межах кожної інвестиційної траєкторії. Вирівняно за індексом. | [0.0, 0.25] | | transaction_costs | list[float] | Розрахована транзакційна вартість, пов'язана з кожною інвестиційною траєкторією. Вирівняно за індексом. | [0.01, 0.02] |

Початок роботи

Пройди автентифікацію за допомогою свого API-ключа та вибери Qiskit Function таким чином. (Цей фрагмент передбачає, що ти вже зберіг свій обліковий запис у локальному середовищі.)

from qiskit_ibm_catalog import QiskitFunctionsCatalog

catalog = QiskitFunctionsCatalog(channel="ibm_quantum_platform")

# Access function
dpo_solver = catalog.load("global-data-quantum/quantum-portfolio-optimizer")

Приклад: динамічна оптимізація портфеля з сімома активами

Цей приклад демонструє, як виконати функцію динамічної оптимізації портфеля (DPO) та налаштувати її параметри для оптимальної продуктивності. Він включає детальні кроки з тонкого налаштування параметрів для досягнення бажаних результатів.

Цей випадок включає сім активів, чотири часові кроки та чотири qubits роздільної здатності, що разом потребує 112 qubits.

1. Зчитай активи, що входять до портфеля.

Якщо всі активи портфеля зберігаються в папці за певним шляхом, ти можеш завантажити їх у pandas.DataFrame та перетворити на об'єкт у форматі dict за допомогою такої функції.

import os
import glob
import pandas as pd

def read_and_join_csv(file_pattern):
"""
Reads multiple CSV files matching the file pattern and combines them into a single DataFrame.

Parameters:
file_pattern (str): The pattern to match CSV files.

Returns:
pd.DataFrame: Combined DataFrame with data from all CSV files.
"""
# Find all files matching the pattern
csv_files = glob.glob(file_pattern)
# Get the base file names without the .csv extension
file_names = [os.path.basename(f).replace(".csv", "") for f in csv_files]
# Read each CSV file into a DataFrame and set the first column as the index
df_list = [pd.read_csv(f).set_index("Unnamed: 0") for f in csv_files]

# Rename columns in each DataFrame to the base file names
for df, name in zip(df_list, file_names):
df.columns = [name]

# Combine all DataFrames into one by merging them side by side
combined_df = pd.concat(df_list, axis=1)
return combined_df

file_pattern = "route/to/folder/with/assets/data/*.csv"
assets = read_and_join_csv(file_pattern).to_dict()

Для цього прикладу ми використали активи 8801.T, CLF, GBPJPY, ITX.MC, META, TMBMKDE-10Y та XS2239553048. Наступний графік ілюструє дані, використані в цьому прикладі, показуючи динаміку денних цін закриття активів з 1 січня по 1 вересня 2023 року.

У цьому прикладі, щоб забезпечити однорідність дат, ми заповнили неторгові дні ціною закриття з попередньої доступної дати. Ми застосовуємо цей крок, оскільки обрані активи належать до різних ринків із різними торговими днями, тому стандартизація набору даних є необхідною для узгодженості. Візуалізація історичних даних активів

2. Визнач задачу.

Визнач специфікації задачі, налаштувавши параметри в словнику qubo_settings.

qubo_settings = {
"nt": 4,
"nq": 4,
"dt": 30,
"max_investment": 25,
"risk_aversion": 1000.0,
"transaction_fee": 0.01,
"restriction_coeff": 1.0,
}

3. Визнач налаштування оптимізатора та ансатцу. (Необов'язково)

За бажанням визнач конкретні вимоги до процесу оптимізації, включаючи вибір оптимізатора та його параметрів, а також специфікацію примітиву та його конфігурацій.

Для Tailored Ansatz обраний розмір популяції базується на попередніх експериментах, які показали, що це значення забезпечує стабільну та ефективну оптимізацію.

У випадку Real Amplitudes Ansatz можна дотримуватися лінійного зв'язку між population_size та кількістю qubits у схемі. Як наближене правило, рекомендується використовувати мінімум population_size ~ 0.8 * n_qubits для ансатцу real_amplitudes.

Очікується, що Optimized Real Amplitudes матиме кращу продуктивність оптимізації, ніж ансатц Real Amplitudes. Однак кількість змінних для оптимізації в цьому ансатці зростає значно швидше, ніж у випадку Real Amplitudes (дивись статтю). Тому для великих задач Optimized Real Amplitudes потребує більше виконань схем. Optimized Real Amplitudes, мабуть, буде корисним для задач до 100 qubits, але рекомендується бути уважним при встановленні параметрів population_size. Як приклад такого масштабування population_size: для задачі з 84 qubits Optimize Real Amplitudes потребує 120 population_size, тоді як для задачі з 56 qubits достатньо population_size 40.

optimizer_settings = {
"de_optimizer_settings": {
"num_generations": 20,
"population_size": 90,
"recombination": 0.4,
"max_parallel_jobs": 5,
"max_batchsize": 4,
"mutation_range": [0.0, 0.25],
},
"optimizer": "differential_evolution",
"primitive_settings": {
"estimator_shots": 25_000,
"estimator_precision": None,
"sampler_shots": 100_000,
},
}

Також можна вибрати конкретний ансатц. Нижче використовується ансатц 'Tailored'.

ansatz_settings = {
"ansatz": "tailored",
"multiple_passmanager": False,
}

4. Запусти задачу.

dpo_job = dpo_solver.run(
assets=assets,
qubo_settings=qubo_settings,
optimizer_settings=optimizer_settings,
ansatz_settings=ansatz_settings,
backend_name="<backend name>",
previous_session_id=[],
apply_postprocess=True,
)

5. Отримай результати.

Як зазначено в розділі Вихідні дані, функція повертає словник з інвестиційними траєкторіями, впорядкованими від найменшого до найбільшого за значенням цільової функції. Цей набір результатів дозволяє визначити траєкторію з найнижчою вартістю та відповідні інвестиційні оцінки. Крім того, він забезпечує аналіз різних траєкторій, полегшуючи вибір тих, що найкраще відповідають конкретним потребам або цілям. Така гнучкість дозволяє адаптувати вибір до різноманітних уподобань або сценаріїв. Почни з відображення результуючої стратегії, яка досягла найнижчої цільової вартості, знайденої в процесі.

# Get the results of the job
dpo_result = dpo_job.result()

# Show the solution strategy
dpo_result["result"]
{'time_step_0': {'8801.T': 0.11764705882352941,
'ITX.MC': 0.20588235294117646,
'META': 0.38235294117647056,
'GBPJPY=X': 0.058823529411764705,
'TMBMKDE-10Y': 0.0,
'CLF': 0.058823529411764705,
'XS2239553048': 0.17647058823529413},
'time_step_1': {'8801.T': 0.11428571428571428,
'ITX.MC': 0.14285714285714285,
'META': 0.2,
'GBPJPY=X': 0.02857142857142857,
'TMBMKDE-10Y': 0.42857142857142855,
'CLF': 0.0,
'XS2239553048': 0.08571428571428572},
'time_step_2': {'8801.T': 0.0,
'ITX.MC': 0.09375,
'META': 0.3125,
'GBPJPY=X': 0.34375,
'TMBMKDE-10Y': 0.0,
'CLF': 0.0,
'XS2239553048': 0.25},
'time_step_3': {'8801.T': 0.3939393939393939,
'ITX.MC': 0.09090909090909091,
'META': 0.12121212121212122,
'GBPJPY=X': 0.18181818181818182,
'TMBMKDE-10Y': 0.0,
'CLF': 0.0,
'XS2239553048': 0.21212121212121213}}

Далі, використовуючи метадані, ти можеш отримати доступ до результатів усіх відібраних стратегій. Завдяки цьому можна додатково проаналізувати альтернативні траєкторії, повернуті оптимізатором. Для цього зчитай словник, збережений у dpo_result['metadata']['all_samples_metrics'], який містить не лише додаткову інформацію про оптимальну стратегію, а й деталі інших стратегій-кандидатів, оцінених під час оптимізації.

Наступний приклад показує, як зчитати цю інформацію за допомогою pandas для вилучення ключових метрик, пов'язаних з оптимальною стратегією. До них належать відхилення від обмеження, коефіцієнт Шарпа та відповідна інвестиційна прибутковість.

# Convert metadata to a DataFrame
df = pd.DataFrame(dpo_result["metadata"]["all_samples_metrics"])

# Find the minimum objective cost
min_cost = df["objective_costs"].min()
print(f"Minimum Objective Cost Found: {min_cost:.2f}")

# Extract the row with the lowest cost
best_row = df[df["objective_costs"] == min_cost].iloc[0]

# Display the results associated with the best solution
print("Best Solution:")
print(f" - Restriction Deviation: {best_row['rest_breaches']}%")
print(f" - Sharpe Ratio: {best_row['sharpe_ratios']:.2f}")
print(f" - Return: {best_row['returns']}")
Minimum Objective Cost Found: -3.78
Best Solution:
- Restriction Deviation: 40.0
- Sharpe Ratio: 24.82
- Return: 0.46

6. Аналіз продуктивності

Нарешті, проаналізуй продуктивність свого застосунку оптимізації. Зокрема, порівняй свої результати, отримані в попередньому прикладі, з випадковою базовою лінією, щоб оцінити ефективність підходу. Якщо квантовий алгоритм стабільно і переконливо дає результати з нижчими значеннями вартості, це вказує на ефективний процес оптимізації.

На рисунку представлені розподіли ймовірностей значень цільових функцій. Для побудови цих розподілів візьми список значень цільових функцій із результату функції та підрахуй кількість входжень кожного значення вартості (значення округлені до другого десяткового знаку). Потім оновлюй стовпець кількостей відповідно, об'єднуючи кількості ідентичних округлених значень. Зверни увагу, що для кращого візуального порівняння кількості входжень нормалізовані так, щоб кожен розподіл відображався в діапазоні від 0 до 1. Візуалізація рішення оптимізації Як показано на рисунку (суцільна синя лінія), розподіл вартості для нашого підходу Варіаційного Квантового Власного Розкладача (постобробленого з SQD) різко сконцентрований на нижчих значеннях цільової функції, що свідчить про хорошу продуктивність оптимізації. На противагу цьому, шумова базова лінія має ширший розподіл, зосереджений навколо вищих значень вартості. Сіра штрихова вертикальна лінія представляє середнє значення випадкового розподілу, додатково підкреслюючи стабільність функції у поверненні оптимізованих інвестиційних стратегій. Для додаткового порівняння чорна штрихова лінія на рисунку відповідає рішенню, отриманому за допомогою оптимізатора Gurobi (безкоштовна версія). Всі ці результати детальніше розглядаються в бенчмарках нижче для прикладу "Mixed Assets", оціненого з ансатцем "Tailored".

Бенчмарки

Ця функція тестувалася за різних конфігурацій qubits роздільної здатності, схем ансатцу та груп активів із різних секторів: суміш різних активів (Набір 1), нафтові деривативи (Набір 2) та IBEX35 (Набір 3). Докладніші відомості наведені в таблиці нижче.

НабірДатаАктиви
Набір 101/01/20238801.T, CL=F, GBPJPY=X, ITX.MC, META, TMBMKDE-10Y, XS2239553048
Набір 201/06/2023CL=F, BZ=F, HO=F, NG=F, XOM, RB=F, 2222.SR
Набір 301/11/2022ACS.MC, ITX.MC, FER.MC, ELE.MC, SCYR.MC, AENA.MC, AMS.MC

Для оцінювання якості рішень використовувалися дві ключові метрики.

  1. Цільова вартість, яка вимірює ефективність оптимізації, порівнюючи значення цільової функції з кожного експерименту з результатами Gurobi (безкоштовна версія).
  2. Коефіцієнт Шарпа, який відображає скориговану на ризик прибутковість кожного портфеля, надаючи уявлення про фінансову ефективність рішень.

Разом ці метрики є бенчмарком як обчислювальних, так і фінансових аспектів квантово-згенерованих портфелів.

ПрикладQubitsАнсатцГлибинаВикористання Runtime (с)Загальне використання (с)Цільова вартістьШарпЦільова вартість GurobiШарп Gurobi
Mixed Assets (Набір 1, 4 часові кроки, 4-бітний)112Tailored831273513095-3.7824.82-4.2524.71
Mixed Assets (Набір 1, 4 часові кроки, 4 часові кроки, 4-бітний)112Real Amplitudes3591173911903-3.3923.64-4.2524.71
Oil Derivatives (Набір 2, 4 часові кроки, 3-бітний)84Optimized Real Amplitudes7861806350-3.7319.13-4.1921.71
IBEX35 (Набір 3, 4 часові кроки, 2-бітний)56Optimized Real Amplitudes9633143523-3.6714.48-4.1116.44

Результати показують, що квантовий оптимізатор із задачно-специфічними ансатцами ефективно визначає ефективні інвестиційні стратегії для різних типів портфелів. Нижче детально описані розмір популяції та кількість поколінь, вказані в словнику optimizer_options. Усі інші параметри були встановлені на значення за замовчуванням.

Прикладpopulation_sizenum_generations
Mixed Assets Portfolio9020
Mixed Assets Portfolio9220
Oil Derivatives Portfolio12020
IBEX35 Portfolio4020

Кількість поколінь була встановлена на 20, оскільки це значення виявилося достатнім для досягнення збіжності. Крім того, значення внутрішніх параметрів оптимізатора за замовчуванням залишилися незмінними, оскільки вони стабільно забезпечували хорошу продуктивність і загалом рекомендуються відповідною літературою та настановами з реалізації.

Отримати підтримку

Якщо тобі потрібна допомога, надішли електронного листа на qpo.support@globaldataquantum.com. У повідомленні вкажи ідентифікатор завдання функції.

Наступні кроки

Рекомендації