Přeskočit na hlavní obsah

Quantum Portfolio Optimizer: funkce Qiskit od Global Data Quantum

poznámka

Qiskit Functions jsou experimentální funkce dostupné pouze uživatelům plánů IBM Quantum® Premium Plan, Flex Plan a On-Prem (prostřednictvím IBM Quantum Platform API) Plan. Jsou ve stavu náhledového vydání a mohou se změnit.

Přehled

Quantum Portfolio Optimizer je funkce Qiskit, která řeší problém dynamické optimalizace portfolia – standardní problém ve financích, jehož cílem je pravidelně přebalancovávat investice napříč sadou aktiv tak, aby se maximalizovaly výnosy a minimalizovala rizika. Díky nasazení špičkových technik kvantové optimalizace tato funkce celý proces zjednodušuje, takže z jejích výhod při hledání optimálních investičních trajektorií mohou těžit i uživatelé bez znalostí kvantového počítání. Tento nástroj je ideální pro portfolio manažery, výzkumníky v oblasti kvantitativních financí a individuální investory a umožňuje zpětné testování obchodních strategií při optimalizaci portfolia.

Popis funkce

Funkce Quantum Portfolio Optimizer využívá algoritmus Variational Quantum Eigensolver (VQE) k řešení problému Quadratic Unconstrained Binary Optimization (QUBO), čímž řeší problémy dynamické optimalizace portfolia. Stačí poskytnout data o cenách aktiv a definovat investiční omezení; funkce pak spustí proces kvantové optimalizace, který vrátí sadu optimalizovaných investičních trajektorií.

Proces sestává ze čtyř hlavních fází. Nejprve jsou vstupní data mapována na problém kompatibilní s kvantovým počítáním: je zkonstruováno QUBO problému dynamické optimalizace portfolia a transformováno do kvantového operátoru (Isingův hamiltonián). Dále jsou vstupní problém a algoritmus VQE přizpůsobeny pro spuštění na kvantovém hardwaru. Algoritmus VQE je pak spuštěn na kvantovém hardwaru a nakonec jsou výsledky post-zpracovány tak, aby poskytly optimální investiční trajektorie. Systém také zahrnuje post-zpracování zohledňující šum (založené na SQD) pro maximalizaci kvality výstupu.

Tato funkce Qiskit vychází z publikovaného článku od Global Data Quantum. Vizualizace pracovního postupu funkce

Vstup

Vstupní argumenty funkce jsou popsány v následující tabulce. Musí být poskytnuta data aktiv a ostatní specifikace problému; navíc lze zahrnout nastavení VQE pro přizpůsobení procesu optimalizace.

NázevTypPopisPovinnýVýchozí hodnotaPříklad
assetsjsonSlovník s cenami aktivAno--
qubo_settingsjsonNastavení QUBOAno-Viz příklady v tabulce níže
ansatz_settingsjsonNastavení ansatzuNeNoneViz příklady v tabulce níže.
optimizer_settingsjsonNastavení optimalizátoruNeNoneViz příklady v tabulce níže.
backendstrNázev backendového QPUNe-"ibm_torino"
previous_session_idlist of strSeznam ID Session pro načtení dat z předchozích spuštění(*)NePrázdný seznam["session_id_1", "session_id_2"]
apply_postprocessboolPoužít post-zpracování SQD zohledňující šumNeTrueTrue
tagslist of stringsSeznam štítků pro identifikaci experimentuNePrázdný seznam["optimization", "quantum_computing"]

Chceš-li pokračovat v provádění nebo načíst úlohy zpracované v jedné či více předchozích Session, musíš do parametru previous_session_id předat seznam ID Session. To je zvláště užitečné v případech, kdy optimalizační úloha nedokončila kvůli chybě v průběhu procesu a je třeba dokončit provádění. K tomu musíš poskytnout stejné argumenty jako při prvotním spuštění spolu se seznamem previous_session_id, jak je popsáno.

Upozornění

Načítání dat pro předchozí Session (za účelem obnovení optimalizace) může trvat až jednu hodinu.

assets

Data musí být strukturována jako objekt JSON, který uchovává informace o závěrečných cenách finančních aktiv k určitým datům. Formát je následující:

  • Primární klíč (řetězec): Název nebo tickerový symbol finančního aktiva (například „8801.T").
  • Sekundární klíč (řetězec): Datum ve formátu YYYY-MM-DD.
  • Hodnota (číslo): Závěrečná cena aktiva k danému datu. Ceny lze zadat normalizované i nenormalizované.

Všimni si, že všechny slovníky musí mít stejný sekundární klíč (data). Pokud určité aktivum nemá datum, které mají ostatní, musí být data doplněna tak, aby byla zajištěna konzistence. Toho lze docílit například použitím poslední sledované závěrečné ceny daného aktiva.

Příklad

{
"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,
...
},
...
}
Poznámka

Data aktiv musí obsahovat alespoň závěrečné ceny v (nt+1) * dt (viz sekci vstupu qubo_settings) časových razítkách (například dnech).

qubo_settings

Následující tabulka popisuje klíče slovníku qubo_settings. Slovník vytvoř tak, že zadáš počet časových kroků nt, počet rozlišovacích Qubitů nq a max_investment – nebo změň jiné výchozí hodnoty.

NázevTypPopisPovinnýVýchozíPříklad
ntintPočet časových krokůAno-4
nqintPočet rozlišovacích QubitůAno-4
max_investmentfloatMaximální počet investovaných měnových jednotek napříč všemi aktivyAno-10
dt*intČasové okno uvažované v každém časovém kroku. Jednotka odpovídá časovým intervalům mezi klíči v datech aktivNe30-
risk_aversionfloatKoeficient averze k rizikuNe1000-
transaction_feefloatKoeficient transakčního poplatkuNe0.01-
restriction_coefffloatLagrangeův multiplikátor používaný k vynucení omezení problému v QUBO formulaciNe1-

ansatz_settings

Chceš-li změnit výchozí možnosti, vytvoř slovník pro parametr ansatz_settings s následujícími klíči. Výchozí ansatz je nastaven na "real_amplitudes" a obě doplňkové možnosti (viz následující tabulka) jsou nastaveny na False.

NázevTypPopisPovinnýVýchozí
ansatz*strAnsatz, který se má použítNe"real_amplitudes"
multiple_passmanager**boolPovoluje podprogram multiple passmanager (není k dispozici pro Tailored ansatz)NeFalse
dd_enableboolPřidává dynamické oddělováníNeFalse

* Dostupné ansatze

  • real_amplitudes
  • cyclic
  • optimized_real_amplitudes
  • tailored (Pouze pro Backend ibm_torino, 7 aktiv, 4 časové kroky a 4 rozlišovací Qubity)

** Pokud je multiple_passmanager nastaven na False, funkce používá výchozí správce průchodů Qiskit s optimization_level=3. Pokud je nastaven na True, podprogram multiple_passmanager porovná tři správce průchodů: předchozí výchozí správce průchodů Qiskit, správce průchodů mapující Qubity na řetězec nejbližších sousedů QPU a služby AI transpileru. Poté je vybrán správce průchodů s odhadovanou nižší kumulativní chybou.

optimizer_settings

Tento parametr je slovník s některými nastavitelnými možnostmi optimalizačního procesu.

NázevTypPopisPovinnýVýchozí
primitive_optionsjsonNastavení primitivuNe-
optimizerstrVybraný klasický optimalizátorNe"differential_evolution"
optimizer_optionsjsonKonfigurace optimalizátoruNe-
Poznámka

V současnosti je jedinou dostupnou možností optimalizátoru "differential_evolution".

Pod klíči primitive_options a optimizer_options nastavujeme slovníky s následujícími parametry:

primitive_options

NázevTypPopisPovinnýVýchozíPříklad
sampler_shotsintPočet výstřelů Sampleru.Ne100000-
estimator_shotsintPočet výstřelů Estimatoru.Ne25000-
estimator_precisionfloatPožadovaná přesnost očekávané hodnoty. Je-li zadána, bude místo estimator_shots použita přesnost.NeNone0.015625 · (1 / sqrt(4096))
max_timeint nebo strMaximální doba, po kterou může runtime Session zůstat otevřená, než bude násilně uzavřena. Lze zadat v sekundách (int) nebo jako řetězec, například "2h 30m 40s". Musí být menší než systémem stanovené maximum.NeNone"1h 15m"

optimizer_options

NázevTypPopisPovinnýVýchozí
num_generationsintPočet generacíNe20
population_sizeintVelikost populaceNe20
mutation_rangelistMaximální a minimální mutační faktorNe[0, 0.25]
recombinationfloatRekombinační faktorNe0.4
max_parallel_jobsintMaximální počet úloh QPU prováděných paralelněNe3
max_batchsizeintMaximální velikost dávkyNe200
Poznámka
  • Počet generací vyhodnocených diferenciální evolucí je num_generations + 1, protože je zahrnuta počáteční populace.

  • Celkový počet Circuitů se vypočítá jako (num_generations + 1) * population_size.

  • Větší velikost populace a více generací obecně zlepšuje kvalitu výsledků optimalizace. Nedoporučuje se však překročit velikost populace 120 a počet generací větší než 20 (například 120 * 21 = 2520 Circuitů celkem), protože by to vygenerovalo nadměrné množství Circuitů, jejichž zpracování může být výpočetně nákladné a časově náročné.

  • Funkce ti umožňuje obnovit předchozí optimalizaci a vždy je možné zvýšit počet generací (zadáním stejného vstupu kromě previous_session_id a zvýšeného num_generations).

Poznámka

Zajisti soulad s limity úloh Qiskit Runtime.

  • Sampler: sampler_shots <= 10_000_000.
  • Estimator: max_batchsize * estimator_shots * observable_size <= 10_000_000 (pro tuto funkci všechny členy pozorovatelné veličiny komutují, takže observable_size=1).

Více informací najdeš v průvodci Limity úloh.

Výstup

Funkce vrací dva slovníky: slovník "result", který obsahuje nejlepší výsledky optimalizace, včetně optimálního řešení a souvisejících minimálních nákladů cílové funkce; a "metadata", s daty ze všech výsledků získaných během procesu optimalizace, spolu s jejich příslušnými metrikami.

První slovník se zaměřuje na nejlépe fungující řešení, zatímco druhý poskytuje podrobné informace o všech řešeních, včetně nákladů cílové funkce a dalších relevantních metrik.

Výstupní slovníky:

NázevTypPopisPříklad
resultdict[str, dict[str, float]]Obsahuje investiční strategii v čase; každý časový okamžik je mapován na váhy investic pro jednotlivá aktiva (každá váha je výše investice normalizovaná celkovou investovanou částkou).{'time_1': {'asset_1': 0.2, 'asset_2': 0.3, ...\}, ...\}
metadatadict[str, Any]Data vygenerovaná během analýzy, včetně řešení, nákladů a metrik.Viz příklady níže

Popis slovníku metadata

NázevTypPopisPříklad
session_idstrJedinečný identifikátor relace IBM Quantum."d0h30qjvpqf00084fgw0"
all_samples_metricsdictSlovník obsahující různé metriky pro každý postprocesovaný vzorek, jako jsou náklady nebo omezení.Viz popis níže
sampler_countsdict[str, int]Slovník, kde klíče jsou bitové reprezentace vzorkovaných řešení a hodnoty jsou jejich počty.{"101010": 3, "111000": 1\}
asset_orderlist[str]Seznam odpovídajícího pořadí investic do aktiv v každém časovém kroku v rámci investičních strategií.["Asset_0", "Asset_1", "Asset_3"]
QUBOlist[list[float]]QUBO matice problému.[[-6.96e-01, 5.81e-01, -1.26e-02, 0.00e+00], ...]
resource_summarydict[str, dict[str, float]]Přehled časů využití CPU a QPU (v sekundách) v různých fázích procesu.{'RUNNING: EXECUTING_QPU': {'CPU_TIME': 412.84, 'QPU_TIME': 87.22\}, ...\}

Popis slovníku all_samples_metrics

NázevTypPopisPříklad
investment_trajectorieslist[list]Investiční strategie odvozené z dekódovaných kvantových stavů.[[1, 2, 2], [1, 2, 1]]

| counts | list[int] | Počet, kolikrát byla každá investiční trajektorie vzorkována. Index odpovídá investment_trajectories. | [5, 3] | | objective_costs | list[float] | Hodnota účelové funkce pro každou investiční trajektorii, seřazená od nejnižší po nejvyšší. | [0.98, 1.25] | | sharpe_ratios | list[float] | Rizikově upravený výkon (Sharpeho poměr) pro každou investiční trajektorii. Indexy jsou zarovnány. | [1.1, 0.7] | | returns | list[float] | Očekávaný výnos pro každou investiční trajektorii. Indexy jsou zarovnány. | [0.15, 0.10] | | rest_breaches | list[float] | Maximální odchylka od omezení v rámci každé investiční trajektorie. Indexy jsou zarovnány. | [0.0, 0.25] | | transaction_costs | list[float] | Odhadované transakční náklady spojené s každou investiční trajektorií. Indexy jsou zarovnány. | [0.01, 0.02] |

Začínáme

Autentizuj se pomocí svého API klíče a vyber Qiskit Function takto. (Tento úryvek předpokládá, že sis již uložil(a) účet do svého lokálního prostředí.)

from qiskit_ibm_catalog import QiskitFunctionsCatalog

catalog = QiskitFunctionsCatalog(channel="ibm_quantum_platform")

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

Příklad: Dynamická optimalizace portfolia se sedmi aktivy

Tento příklad ukazuje, jak spustit funkci dynamické optimalizace portfolia (DPO) a upravit její nastavení pro optimální výkon. Zahrnuje podrobné kroky pro doladění parametrů s cílem dosáhnout požadovaných výsledků.

V tomto případě se jedná o sedm aktiv, čtyři časové kroky a čtyři rozlišovací qubity, což dohromady vyžaduje 112 qubitů.

1. Načti aktiva zahrnutá v portfoliu.

Pokud jsou všechna aktiva v portfoliu uložena ve složce na určité cestě, můžeš je načíst do objektu pandas.DataFrame a převést do formátu dict pomocí následující funkce.

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()

V tomto příkladu jsme použili aktiva 8801.T, CLF, GBPJPY, ITX.MC, META, TMBMKDE-10Y a XS2239553048. Následující obrázek znázorňuje data použitá v tomto příkladu – vývoj denních závěrečných cen aktiv od 1. ledna do 1. září 2023.

V tomto příkladu jsme dny bez obchodování doplnili závěrečnou cenou z předchozího dostupného data, abychom zajistili jednotnost dat napříč daty. Tento krok aplikujeme proto, že vybraná aktiva pocházejí z různých trhů s odlišnými obchodními dny, a proto je nezbytné dataset standardizovat pro konzistenci. Vizualizace historických dat aktiv

2. Definuj problém.

Definuj specifikace problému konfigurací parametrů ve slovníku 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. Definuj nastavení optimalizátoru a ansatzu. (Volitelné)

Volitelně definuj konkrétní požadavky na optimalizační proces, včetně výběru optimalizátoru a jeho parametrů, a také specifikaci primitivu a jeho konfigurací.

Pro Tailored Ansatz byl zvolený počet jedinců populace (population_size) na základě předchozích experimentů, které ukázaly, že tato hodnota přináší stabilní a efektivní optimalizaci.

V případě Real Amplitudes Ansatzu lze použít lineární vztah mezi population_size a počtem qubitů v Circuit. Jako přibližné pravidlo se doporučuje používat minimálně population_size ~ 0.8 * n_qubits pro ansatz real_amplitudes.

Očekává se, že Optimized Real Amplitudes bude mít lepší optimalizační výkon než ansatz Real Amplitudes. Počet proměnných k optimalizaci v tomto ansatzu však roste mnohem rychleji než v případě Real Amplitudes (viz článek). Proto u rozsáhlých problémů vyžaduje Optimized Real Amplitudes více spuštění Circuit. Optimized Real Amplitudes bude pravděpodobně užitečný pro problémy vyžadující až 100 qubitů, ale při nastavování parametru population_size je doporučeno postupovat obezřetně. Jako příklad tohoto škálování population_size předchozí tabulka ukazuje, že u problému s 84 qubity vyžaduje Optimize Real Amplitudes population_size 120, zatímco pro problém s 56 qubity postačuje 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,
},
}

Je také možné zvolit konkrétní ansatz. Následující kód používá ansatz 'Tailored'.

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

4. Spusť problém.

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. Načtení výsledků.

Jak je uvedeno v části Výstup, funkce vrací slovník s investičními trajektoriemi seřazenými od nejnižší po nejvyšší podle hodnoty jejich účelové funkce. Tato sada výsledků umožňuje identifikovat trajektorii s nejnižšími náklady a příslušná investiční hodnocení. Navíc umožňuje analýzu různých trajektorií, čímž usnadňuje výběr těch, které nejlépe odpovídají konkrétním potřebám nebo cílům. Tato flexibilita zajišťuje, že volby lze přizpůsobit různým preferencím nebo scénářům. Začni tím, že zobrazíš výslednou strategii, která dosáhla nejnižších nákladů účelové funkce nalezených v průběhu procesu.

# 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}}

Poté můžeš pomocí metadat přistupovat k výsledkům všech vzorkovaných strategií. Díky tomu můžeš dále analyzovat alternativní trajektorie vrácené optimalizátorem. K tomu si přečti slovník uložený v dpo_result['metadata']['all_samples_metrics'], který obsahuje nejen doplňující informace o optimální strategii, ale také podrobnosti o ostatních kandidátních strategiích vyhodnocených během optimalizace.

Následující příklad ukazuje, jak číst tyto informace pomocí pandas a extrahovat klíčové metriky spojené s optimální strategií. Patří mezi ně Odchylka od omezení, Sharpeho poměr a odpovídající investiční výnos.

# 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. Analýza výkonu

Nakonec analyzuj výkon své optimalizační aplikace. Konkrétně porovnej své výsledky získané v předchozím příkladu s náhodným výchozím stavem, abys zhodnotil/-a účinnost našeho přístupu. Pokud kvantový algoritmus prokazatelně a konzistentně produkuje výsledky s nižšími hodnotami nákladů, svědčí to o efektivním optimalizačním procesu.

Obrázek zobrazuje rozdělení pravděpodobnosti nákladů účelové funkce. Aby bylo možné tato rozdělení vygenerovat, vezmi seznam hodnot nákladů účelové funkce z výsledku funkce a spočítej výskyty každé hodnoty nákladů (hodnoty zaokrouhlené na dvě desetinná místa). Poté aktuálně aktualizuj sloupec počtu sloučením počtů identických zaokrouhlených hodnot. Všimni si, že pro lepší vizuální porovnání byly počty výskytů normalizovány tak, aby každé rozdělení bylo zobrazeno v rozsahu 0 až 1. Vizualizace řešení optimalizace Jak je znázorněno na obrázku (modrá plná čára), rozdělení nákladů pro náš přístup Variačního kvantového vlastního řešitele (po zpracování pomocí SQD) je ostře soustředěno na nižší hodnoty nákladů účelové funkce, což naznačuje dobrou optimalizační výkonnost. Naopak zašuměný výchozí stav vykazuje širší rozdělení soustředěné kolem vyšších hodnot nákladů. Šedá přerušovaná svislá čára představuje střední hodnotu náhodného rozdělení a dále zdůrazňuje konzistenci funkce při vracení optimalizovaných investičních strategií. Pro dodatečné srovnání odpovídá černá přerušovaná čára na obrázku řešení získanému pomocí optimalizátoru Gurobi (bezplatná verze). Všechny tyto výsledky jsou dále prozkoumány v níže uvedených benchmarcích pro příklad „Smíšená aktiva" vyhodnocený s ansatzem „Tailored".

Benchmarky

Tato funkce byla testována v různých konfiguracích rozlišovacích Qubitů, Circuit ansatzů a skupin aktiv z různých sektorů: kombinace různých aktiv (Sada 1), ropné deriváty (Sada 2) a IBEX35 (Sada 3). Další podrobnosti viz následující tabulka.

SadaDatumAktiva
Sada 101/01/20238801.T, CL=F, GBPJPY=X, ITX.MC, META, TMBMKDE-10Y, XS2239553048
Sada 201/06/2023CL=F, BZ=F, HO=F, NG=F, XOM, RB=F, 2222.SR
Sada 301/11/2022ACS.MC, ITX.MC, FER.MC, ELE.MC, SCYR.MC, AENA.MC, AMS.MC

K hodnocení kvality řešení byly použity dvě klíčové metriky.

  1. Náklady účelové funkce, které měří efektivitu optimalizace porovnáním hodnoty funkce nákladů z každého experimentu s výsledky z Gurobi (bezplatná verze).
  2. Sharpeho poměr, který zachycuje výnos každého portfolia s přihlédnutím k riziku a nabízí pohled na finanční výkonnost řešení.

Společně tyto metriky slouží jako benchmark pro výpočetní i finanční aspekty kvantově generovaných portfolií.

PříkladQubityAnsatzHloubkaVyužití běhu (s)Celkové využití (s)Náklady účelové funkceSharpeNáklady účelové funkce GurobiSharpe Gurobi
Smíšená aktiva (Sada 1, 4 časové kroky, 4-bit)112Tailored831273513095-3.7824.82-4.2524.71
Smíšená aktiva (Sada 1, 4 časové kroky, 4 časové kroky, 4-bit)112Real Amplitudes3591173911903-3.3923.64-4.2524.71
Ropné deriváty (Sada 2, 4 časové kroky, 3-bit)84Optimized Real Amplitudes7861806350-3.7319.13-4.1921.71
IBEX35 (Sada 3, 4 časové kroky, 2-bit)56Optimized Real Amplitudes9633143523-3.6714.48-4.1116.44

Výsledky ukazují, že kvantový optimalizátor s ansatzy přizpůsobenými konkrétnímu problému efektivně identifikuje eficientní investiční strategie napříč různými typy portfolií. Níže uvádíme jak velikost populace, tak počet generací zadaných ve slovníku optimizer_options. Všechny ostatní parametry byly nastaveny na výchozí hodnoty.

Příkladpopulation_sizenum_generations
Portfolio smíšených aktiv9020
Portfolio smíšených aktiv9220
Portfolio ropných derivátů12020
Portfolio IBEX354020

Počet generací byl nastaven na 20, protože tato hodnota se ukázala jako dostatečná pro dosažení konvergence. Výchozí hodnoty interních parametrů optimalizátoru byly navíc ponechány beze změny, protože konzistentně poskytovaly dobrý výkon a jsou obecně doporučovány literaturou a pokyny k implementaci.

Získání podpory

Pokud potřebuješ pomoc, můžeš poslat e-mail na adresu qpo.support@globaldataquantum.com. Ve své zprávě uveď ID úlohy funkce.

Další kroky

Doporučení