Přeskočit na hlavní obsah

Quantum Portfolio Optimizer: funkce Qiskit od Global Data Quantum

Viz referenci API

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

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í.)

# Added by doQumentation — required packages for this notebook
!pip install -q pandas qiskit-ibm-catalog
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ů

Funkce vrací slovník s investičními trajektoriemi seřazenými od nejnižší po nejvyšší podle hodnoty jejich účelové funkce (viz část Výstup v referenci API). 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é odpovídajícím způsobem 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í