Quantum Portfolio Optimizer: funkce Qiskit od Global Data Quantum
Viz referenci API
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.
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.
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.
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.
| Sada | Datum | Aktiva |
|---|---|---|
| Sada 1 | 01/01/2023 | 8801.T, CL=F, GBPJPY=X, ITX.MC, META, TMBMKDE-10Y, XS2239553048 |
| Sada 2 | 01/06/2023 | CL=F, BZ=F, HO=F, NG=F, XOM, RB=F, 2222.SR |
| Sada 3 | 01/11/2022 | ACS.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.
- 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).
- 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říklad | Qubity | Ansatz | Hloubka | Využití běhu (s) | Celkové využití (s) | Náklady účelové funkce | Sharpe | Náklady účelové funkce Gurobi | Sharpe Gurobi |
|---|---|---|---|---|---|---|---|---|---|
| Smíšená aktiva (Sada 1, 4 časové kroky, 4-bit) | 112 | Tailored | 83 | 12735 | 13095 | -3.78 | 24.82 | -4.25 | 24.71 |
| Smíšená aktiva (Sada 1, 4 časové kroky, 4 časové kroky, 4-bit) | 112 | Real Amplitudes | 359 | 11739 | 11903 | -3.39 | 23.64 | -4.25 | 24.71 |
| Ropné deriváty (Sada 2, 4 časové kroky, 3-bit) | 84 | Optimized Real Amplitudes | 78 | 6180 | 6350 | -3.73 | 19.13 | -4.19 | 21.71 |
| IBEX35 (Sada 3, 4 časové kroky, 2-bit) | 56 | Optimized Real Amplitudes | 96 | 3314 | 3523 | -3.67 | 14.48 | -4.11 | 16.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říklad | population_size | num_generations |
|---|---|---|
| Portfolio smíšených aktiv | 90 | 20 |
| Portfolio smíšených aktiv | 92 | 20 |
| Portfolio ropných derivátů | 120 | 20 |
| Portfolio IBEX35 | 40 | 20 |
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
- Přečti si příslušný výzkumný článek.
-
- Navštiv referenci API pro tuto funkci Qiskit.
- Požádej o přístup k funkci vyplněním tohoto formuláře.
- Vyzkoušej tutoriál Dynamická optimalizace portfolia.