Lumaktaw sa pangunahing nilalaman

Quantum Portfolio Optimizer: Isang Qiskit Function ng Global Data Quantum

Tingnan ang API reference

tala

Ang mga Qiskit Function ay isang eksperimental na feature na available lamang sa mga gumagamit ng IBM Quantumยฎ Premium Plan, Flex Plan, at On-Prem (sa pamamagitan ng IBM Quantum Platform API) Plan. Nasa preview release status ang mga ito at maaaring magbago.

Pangkalahatang-ideyaโ€‹

Ang Quantum Portfolio Optimizer ay isang Qiskit Function na tumutugon sa dynamic portfolio optimization na problema โ€” isang karaniwang problema sa pananalapi na naglalayong muling i-balance ang mga pana-panahong pamumuhunan sa iba't ibang asset upang mapakinabangan ang kita at mabawasan ang panganib. Sa pamamagitan ng paggamit ng pinakabagong mga teknik sa quantum optimization, pinapasimple ng function na ito ang proseso para makinabang ang mga gumagamit โ€” kahit walang kaalaman sa quantum computing โ€” mula sa mga kalamangan nito sa paghanap ng pinakamainam na mga trajectory ng pamumuhunan. Perpekto para sa mga portfolio manager, mananaliksik sa quantitative finance, at mga indibidwal na mamumuhunan, pinapahintulutan ng tool na ito ang back-testing ng mga trading strategy sa portfolio optimization.

Paglalarawan ng functionโ€‹

Ginagamit ng Quantum Portfolio Optimizer function ang Variational Quantum Eigensolver (VQE) algorithm para malutas ng Quadratic Unconstrained Binary Optimization (QUBO) na problema, na tumutugon sa mga dynamic portfolio optimization na problema. Kailangan lamang ng mga gumagamit na ibigay ang datos ng presyo ng asset at tukuyin ang constraint ng pamumuhunan, pagkatapos ay pinapatakbo ng function ang proseso ng quantum optimization na nagbabalik ng isang set ng mga na-optimize na trajectory ng pamumuhunan.

Ang proseso ay binubuo ng apat na pangunahing yugto. Una, ang input data ay imi-map sa isang quantum-compatible na problema, itinatayo ang QUBO ng dynamic portfolio optimization na problema, at binabago ito sa isang quantum operator (Ising Hamiltonian). Susunod, ang input na problema at ang VQE algorithm ay ina-adapt para patakbuhin sa quantum hardware. Pagkatapos ay pinapatakbo ang VQE algorithm sa quantum hardware, at sa wakas, ang mga resulta ay pinoproseso upang maibigay ang pinakamainam na mga trajectory ng pamumuhunan. Kasama rin sa sistema ang isang noise-aware (SQD-based) na post-processing upang mapakinabangan ang kalidad ng output.

Ang Qiskit Function na ito ay batay sa nailathala na manuskrito ng Global Data Quantum. Visualization ng workflow ng function

Magsimula

Mag-authenticate gamit ang iyong API key at piliin ang Qiskit Function tulad ng sumusunod. (Ipinapalagay ng snippet na ito na nai-save mo na ang iyong account sa iyong lokal na kapaligiran.)

# 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")

Halimbawa: Dynamic portfolio optimization na may pitong assetโ€‹

Ipinapakita ng halimbawang ito kung paano isagawa ang dynamic portfolio optimization (DPO) function at i-adjust ang mga setting nito para sa pinakamainam na pagganap. Kasama nito ang mga detalyadong hakbang para i-fine-tune ang mga parameter upang makamit ang mga nais na resulta.

Ang kasong ito ay kinabibilangan ng pitong asset, apat na time step, at apat na resolution qubit, na nagresulta sa kabuuang pangangailangan na 112 qubit.

1. Basahin ang mga asset na kasama sa portfolio.โ€‹

Kung ang lahat ng asset sa portfolio ay nakaimbak sa isang folder sa isang partikular na path, maaari mo itong i-load sa isang pandas.DataFrame at i-convert ito sa isang object na may format na dict gamit ang sumusunod na function.

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

Para sa halimbawang ito, ginamit namin ang mga asset na 8801.T, CLF, GBPJPY, ITX.MC, META, TMBMKDE-10Y, at XS2239553048. Inilalarawan ng sumusunod na figure ang datos na ginamit sa halimbawang ito, na nagpapakita ng ebolusyon ng pang-araw-araw na closing price ng mga asset mula 1 Enero hanggang 1 Setyembre 2023.

Sa halimbawang ito, para matiyak ang pagkakatugma sa iba't ibang petsa, pinuno namin ang mga araw na hindi nagtatrabaho ng closing price mula sa nakaraang available na petsa. Inilalapat namin ang hakbang na ito dahil ang mga napiling asset ay nagmumula sa iba't ibang merkado na may magkakaibang araw ng pangangalakal, na ginagawa itong mahalaga na i-standardize ang dataset para sa konsistensya. Visualization ng makasaysayang datos ng mga asset

2. Tukuyin ang problema.โ€‹

Tukuyin ang mga detalye ng problema sa pamamagitan ng pag-configure ng mga parameter sa dictionary na 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. Tukuyin ang mga setting ng optimizer at ansatz (Opsyonal)โ€‹

Opsyonal na tukuyin ang mga tiyak na pangangailangan para sa proseso ng optimization, kasama ang pagpili ng optimizer at mga parameter nito, pati na rin ang pagtukoy ng primitive at mga konfigurasyong nito.

Para sa Tailored Ansatz, ang napiling laki ng populasyon ay batay sa mga nakaraang eksperimento na nagpapakita na ang halagang ito ay nagbubunga ng stable at mahusay na optimization.

Sa kaso ng Real Amplitudes Ansatz, maaari kang sumunod sa linear na relasyon sa pagitan ng population_size at ng bilang ng mga qubit sa circuit. Bilang isang tinatayang rule of thumb, inirerekomenda na gumamit ng minimum na population_size ~ 0.8 * n_qubits para sa real_amplitudes ansatz.

Inaasahang magkakaroon ang Optimized Real Amplitudes ng mas mahusay na optimization performance kaysa sa Real Amplitudes ansatz. Gayunpaman, ang bilang ng mga variable na ino-optimize sa ansatz na ito ay tumataas nang mas mabilis kaysa sa kaso ng Real Amplitudes (tingnan ang manuskrito). Kaya, para sa malalaking problema, ang Optimized Real Amplitudes ay nangangailangan ng mas maraming circuit execution. Ang Optimized Real Amplitudes ay malamang na kapaki-pakinabang para sa mga problemang nangangailangan ng hanggang 100 qubit, ngunit inirerekomenda na maging maingat kapag nagtatakda ng mga parameter na population_size. Bilang halimbawa ng scale-up na ito sa population_size, ang nakaraang talahanayan ay nagpapakita na para sa isang 84-qubit na problema, ang Optimize Real Amplitudes ay nangangailangan ng 120 na population_size, habang para sa isang 56-qubit na problema, sapat na ang population_size na 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,
},
}

Posible rin na pumili ng isang tiyak na ansatz. Gumagamit ang sumusunod ng ansatz na 'Tailored'.

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

4. Patakbuhin ang problema.โ€‹

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. Kunin ang mga resultaโ€‹

Ang function ay nagbabalik ng dictionary na may mga investment trajectory na nakaayos mula sa pinakamababa hanggang pinakamataas ayon sa halaga ng kanilang objective function (tingnan ang seksyon ng Output sa API reference). Ang set ng mga resulta na ito ay nagbibigay-daan sa pagkilala ng trajectory na may pinakamababang gastos at ang kaukulang mga pagsusuri ng pamumuhunan. Bukod pa rito, nagbibigay ito para sa pagsusuri ng iba't ibang trajectory, na nagpapadali sa pagpili ng mga pinaka-angkop sa mga tiyak na pangangailangan o layunin. Tinitiyak ng flexibility na ito na ang mga pagpipilian ay maaaring iayon upang tumugon sa iba't ibang kagustuhan o sitwasyon. Simulan sa pamamagitan ng pagpapakita ng resultang estratehiya na nakamit ang pinakamababang objective cost na natagpuan sa proseso.

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

Pagkatapos, gamit ang metadata, maaari kang ma-access ang mga resulta ng lahat ng mga na-sample na estratehiya. Maaari mong pag-aralan pa ang mga alternatibong trajectory na ibinalik ng optimizer. Para gawin ito, basahin ang dictionary na nakaimbak sa dpo_result['metadata']['all_samples_metrics'], na naglalaman hindi lamang ng karagdagang impormasyon tungkol sa pinakamainam na estratehiya, kundi pati na rin ang mga detalye ng iba pang mga kandidatong estratehiya na sinuri sa panahon ng optimization.

Ang sumusunod na halimbawa ay nagpapakita kung paano basahin ang impormasyong ito gamit ang pandas upang kunin ang mga pangunahing sukatan na nauugnay sa pinakamainam na estratehiya. Kasama dito ang Restriction Deviation, Sharpe Ratio, at ang kaukulang investment return.

# 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. Pagsusuri ng pagganapโ€‹

Sa huli, suriin ang pagganap ng iyong optimization application. Lalo na, ikumpara ang iyong mga resulta, na nakuha sa nakaraang halimbawa, laban sa isang random baseline para suriin ang bisa ng aming approach. Kung ang quantum algorithm ay hayagang at consistently nagbubunga ng mga resulta na may mas mababang halaga ng gastos, ito ay nagpapahiwatig ng isang epektibong proseso ng optimization.

Ipinapakita ng figure ang mga probability distribution ng mga objective cost. Para makabuo ng mga distribusyong ito, kunin ang listahan ng mga objective cost mula sa resulta ng function at bilangin ang mga pagkakataon ng bawat halaga ng gastos (mga halagang na-round sa pangalawang decimal na lugar). Pagkatapos, i-update ang column ng bilang ayon sa pamamagitan ng pagsasama ng mga bilang ng magkaparehong mga rounded na halaga. Pansinin na, para sa mas mahusay na visual na paghahambing, ang mga bilang ng pagkakataon ay na-normalize upang ang bawat distribusyon ay ipinakita sa pagitan ng 0 at 1. Visualization ng solusyon ng optimization Tulad ng ipinapakita sa figure (asul na solidong linya), ang cost distribution para sa aming Variational Quantum Eigensolver (post-processed gamit ang SQD) na approach ay mabilis na nakakonsentra sa mas mababang mga halaga ng objective cost, na nagpapahiwatig ng magandang optimization performance. Sa kaibahan, ang noisy baseline ay nagpapakita ng mas malawak na distribusyon, nakasentro sa mas mataas na mga halaga ng gastos. Ang gray dashed na patayong linya ay kumakatawan sa mean na halaga ng random na distribusyon, na higit na nagtatampok ng konsistensya ng function sa pagbabalik ng mga na-optimize na estratehiya ng pamumuhunan. Para sa karagdagang paghahambing, ang black dashed na linya sa figure ay tumutugma sa solusyon na nakuha gamit ang Gurobi optimizer (libreng bersyon). Lahat ng mga resultang ito ay higit na sinasaliksik sa mga benchmark sa ibaba para sa halimbawang "Mixed Assets" na sinuri gamit ang "Tailored" ansatz.

Mga Benchmark

Ang function na ito ay nasubok sa iba't ibang konfigurasyong ng mga resolution qubit, ansatz circuit, at mga grupo ng asset mula sa iba't ibang sektor: isang halo ng iba't ibang asset (Set 1), mga oil derivative (Set 2), at IBEX35 (Set 3). Tingnan ang higit pang mga detalye sa sumusunod na talahanayan.

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

Dalawang pangunahing sukatan ang ginamit upang suriin ang kalidad ng solusyon.

  1. Ang objective cost, na sumusukat ng kahusayan ng optimization sa pamamagitan ng paghahambing ng halaga ng cost function mula sa bawat eksperimento sa mga resulta mula sa Gurobi (libreng bersyon).
  2. Ang Sharpe ratio, na kumukuha ng risk-adjusted na kita ng bawat portfolio, na nagbibigay ng pananaw sa financial performance ng mga solusyon.

Magkasama, ang mga sukatan na ito ay nag-be-benchmark ng parehong computational at financial na aspeto ng mga quantum-generated na portfolio.

HalimbawaQubitAnsatzDepthRuntime Usage (s)Kabuuang paggamit (s)Objective costSharpeGurobi objective costGurobi Sharpe
Mixed Assets (Set 1, 4 time step, 4-bit)112Tailored831273513095-3.7824.82-4.2524.71
Mixed Assets (Set 1,4 time step, 4 time step, 4-bit)112Real Amplitudes3591173911903-3.3923.64-4.2524.71
Oil Derivatives (Set 2, 4 time step, 3-bit)84Optimized Real Amplitudes7861806350-3.7319.13-4.1921.71
IBEX35 (Set 3, 4 time step, 2-bit)56Optimized Real Amplitudes9633143523-3.6714.48-4.1116.44

Ipinapakita ng mga resulta na ang quantum optimizer, na may mga ansatz na tukoy sa problema, ay epektibong natutukoy ang mga mahusay na estratehiya ng pamumuhunan sa iba't ibang uri ng portfolio. Sa ibaba ay inilarawan namin ang parehong laki ng populasyon at bilang ng mga henerasyon na tinukoy sa dictionary na optimizer_options. Lahat ng iba pang mga parameter ay nakatakda sa kanilang mga default na halaga.

Halimbawapopulation_sizenum_generations
Mixed Assets Portfolio9020
Mixed Assets Portfolio9220
Oil Derivatives Portfolio12020
IBEX35 Portfolio4020

Ang bilang ng mga henerasyon ay nakatakda sa 20, dahil natuklasan na sapat ang halagang ito para maabot ang convergence. Bukod pa rito, ang mga default na halaga para sa mga panloob na parameter ng optimizer ay naiwan nang hindi binabago, dahil patuloy silang nagbibigay ng magandang pagganap at karaniwang inirerekomenda ng literatura at mga alituntunin sa implementasyon.

Kumuha ng suporta

Kung kailangan mo ng tulong, maaari kang magpadala ng email sa qpo.support@globaldataquantum.com. Sa iyong mensahe, ibigay ang function job ID.

Mga susunod na hakbangโ€‹

Mga Rekomendasyon