Lewati ke konten utama

Quantum Portfolio Optimizer: A Qiskit Function by Global Data Quantum

catatan

Qiskit Functions adalah fitur eksperimental yang hanya tersedia untuk pengguna IBM Quantumยฎ Premium Plan, Flex Plan, dan On-Prem (via IBM Quantum Platform API) Plan. Fitur ini dalam status rilis pratinjau dan dapat berubah sewaktu-waktu.

Gambaran Umum

Quantum Portfolio Optimizer adalah sebuah Qiskit Function yang menangani masalah optimasi portofolio dinamis, sebuah masalah standar dalam keuangan yang bertujuan untuk menyeimbangkan kembali investasi periodik di sejumlah aset, untuk memaksimalkan keuntungan dan meminimalkan risiko. Dengan menggunakan teknik optimasi kuantum mutakhir, fungsi ini menyederhanakan prosesnya sehingga pengguna, tanpa keahlian di bidang komputasi kuantum, bisa memanfaatkan keunggulannya dalam menemukan trajektori investasi yang optimal. Ideal untuk manajer portofolio, peneliti keuangan kuantitatif, dan investor individu, alat ini memungkinkan back-testing strategi trading dalam optimasi portofolio.

Deskripsi Fungsi

Fungsi Quantum Portfolio Optimizer menggunakan algoritma Variational Quantum Eigensolver (VQE) untuk menyelesaikan masalah Quadratic Unconstrained Binary Optimization (QUBO), yang menangani masalah optimasi portofolio dinamis. Pengguna cukup menyediakan data harga aset dan mendefinisikan batasan investasi, lalu fungsi ini menjalankan proses optimasi kuantum yang mengembalikan sekumpulan trajektori investasi yang optimal.

Proses ini terdiri dari empat tahap utama. Pertama, data input dipetakan ke masalah yang kompatibel dengan kuantum, membangun QUBO dari masalah optimasi portofolio dinamis, dan mengubahnya menjadi operator kuantum (Ising Hamiltonian). Selanjutnya, masalah input dan algoritma VQE diadaptasi agar dapat dijalankan di perangkat keras kuantum. Algoritma VQE kemudian dijalankan di perangkat keras kuantum, dan akhirnya, hasilnya diproses pasca-komputasi untuk memberikan trajektori investasi yang optimal. Sistem ini juga mencakup pasca-pemrosesan yang peka terhadap noise (berbasis SQD) untuk memaksimalkan kualitas output.

Qiskit Function ini didasarkan pada naskah yang sudah dipublikasikan oleh Global Data Quantum. Visualisasi alur kerja fungsi

Input

Argumen input dari fungsi ini dijelaskan dalam tabel berikut. Data aset dan spesifikasi masalah lainnya harus disediakan; selain itu, pengaturan VQE bisa dimasukkan untuk menyesuaikan proses optimasi.

NamaTipeDeskripsiWajibDefaultContoh
assetsjsonDictionary berisi harga asetYa--
qubo_settingsjsonPengaturan QUBOYa-Lihat contoh di tabel di bawah
ansatz_settingsjsonPengaturan ansatzTidakNoneLihat contoh di tabel di bawah.
optimizer_settingsjsonPengaturan optimizerTidakNoneLihat contoh di tabel di bawah.
backendstrNama Backend QPUTidak-"ibm_torino"
previous_session_idlist of strDaftar ID sesi untuk mengambil data dari eksekusi sebelumnya(*)TidakList kosong["session_id_1", "session_id_2"]
apply_postprocessboolTerapkan pasca-pemrosesan SQD yang peka terhadap noiseTidakTrueTrue
tagslist of stringsDaftar tag untuk mengidentifikasi eksperimenTidakList kosong["optimization", "quantum_computing"]

*Untuk melanjutkan eksekusi atau mengambil job yang diproses dalam satu atau lebih sesi sebelumnya, daftar ID sesi harus diteruskan dalam parameter previous_session_id. Ini sangat berguna dalam kasus di mana tugas optimasi gagal diselesaikan karena kesalahan dalam proses, dan eksekusi perlu diselesaikan. Untuk mencapai ini, kamu harus memberikan argumen yang sama yang digunakan dalam eksekusi awal, beserta daftar previous_session_id seperti yang dijelaskan.

Peringatan

Memuat data untuk sesi sebelumnya (untuk melanjutkan optimasi) bisa membutuhkan waktu hingga satu jam.

assetsโ€‹

Data harus disusun sebagai objek JSON yang menyimpan informasi tentang harga penutupan aset keuangan pada tanggal tertentu. Formatnya adalah sebagai berikut:

  • Kunci primer (string): Nama atau simbol ticker aset keuangan (misalnya, "8801.T").
  • Kunci sekunder (string): Tanggal dalam format YYYY-MM-DD.
  • Nilai (number): Harga penutupan aset pada tanggal yang ditentukan. Harga bisa dimasukkan dalam bentuk normalisasi atau tidak.

Perhatikan bahwa semua dictionary harus memiliki kunci sekunder yang sama (tanggal). Jika suatu aset tidak memiliki tanggal yang dimiliki aset lainnya, data harus diisi untuk memastikan konsistensi. Misalnya, ini bisa dilakukan dengan menggunakan harga penutupan terakhir yang tercatat dari aset tersebut.

Contohโ€‹

{
"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,
...
},
...
}
Catatan

Data aset harus mengandung, setidaknya, harga penutupan pada (nt+1) * dt (lihat bagian input qubo_settings) time stamp (misalnya, hari).

qubo_settingsโ€‹

Tabel berikut menjelaskan kunci dari dictionary qubo_settings. Buat dictionary dengan menentukan jumlah langkah waktu nt, jumlah qubit resolusi nq, dan max_investment - atau ubah nilai default lainnya.

NamaTipeDeskripsiWajibDefaultContoh
ntintJumlah langkah waktuYa-4
nqintJumlah Qubit resolusiYa-4
max_investmentfloatJumlah maksimum unit mata uang yang diinvestasikan di semua asetYa-10
dt*intJendela waktu yang dipertimbangkan di setiap langkah waktu. Satuannya sesuai dengan interval waktu antara kunci dalam data asetTidak30-
risk_aversionfloatKoefisien aversion risikoTidak1000-
transaction_feefloatKoefisien biaya transaksiTidak0.01-
restriction_coefffloatPengali Lagrange yang digunakan untuk memaksakan batasan masalah dalam formulasi QUBOTidak1-

ansatz_settingsโ€‹

Untuk mengubah opsi default, buat dictionary untuk parameter ansatz_settings dengan kunci berikut. Secara default, ansatz diatur ke "real_amplitudes", dan kedua opsi tambahan (lihat tabel berikut) diatur ke False.

NamaTipeDeskripsiWajibDefault
ansatz*strAnsatz yang akan digunakanTidak"real_amplitudes"
multiple_passmanager**boolMengaktifkan subrutin multiple passmanager (tidak tersedia untuk Tailored ansatz)TidakFalse
dd_enableboolMenambahkan dynamical decouplingTidakFalse

* Ansatz yang tersedia

  • real_amplitudes
  • cyclic
  • optimized_real_amplitudes
  • tailored (Hanya untuk Backend ibm_torino, 7 aset, 4 langkah waktu, dan 4 Qubit resolusi)

** Jika multiple_passmanager diatur ke False, fungsi menggunakan pass manager Qiskit default dengan optimization_level=3. Jika diatur ke True, subrutin multiple_passmanager membandingkan tiga pass manager: pass manager Qiskit default sebelumnya, pass manager yang memetakan Qubit di atas rantai tetangga pertama QPU, dan layanan AI Transpiler. Kemudian, pass manager dengan estimasi error kumulatif terendah dipilih.

optimizer_settingsโ€‹

Parameter ini adalah dictionary dengan beberapa opsi yang bisa disesuaikan dari proses optimasi.

NamaTipeDeskripsiWajibDefault
primitive_optionsjsonPengaturan primitiveTidak-
optimizerstrOptimizer klasik yang dipilihTidak"differential_evolution"
optimizer_optionsjsonKonfigurasi optimizerTidak-
Catatan

Saat ini, satu-satunya opsi optimizer yang tersedia adalah "differential_evolution".

Di bawah kunci primitive_options dan optimizer_options, kita menetapkan dictionary dengan parameter berikut:

primitive_optionsโ€‹

NamaTipeDeskripsiWajibDefaultContoh
sampler_shotsintJumlah shots dari Sampler.Tidak100000-
estimator_shotsintJumlah shots dari Estimator.Tidak25000-
estimator_precisionfloatPresisi yang diinginkan dari nilai yang diharapkan. Jika ditentukan, presisi akan digunakan sebagai pengganti estimator_shots.TidakNone0.015625 ยท (1 / sqrt(4096))
max_timeint or strJumlah waktu maksimum yang bisa dibuka oleh sesi runtime sebelum ditutup secara paksa. Bisa diberikan dalam detik (int) atau sebagai string, seperti "2h 30m 40s". Harus kurang dari maksimum yang ditentukan sistem.TidakNone"1h 15m"

optimizer_optionsโ€‹

NamaTipeDeskripsiWajibDefault
num_generationsintJumlah generasiTidak20
population_sizeintUkuran populasiTidak20
mutation_rangelistFaktor mutasi maksimum dan minimumTidak[0, 0.25]
recombinationfloatFaktor rekombinasiTidak0.4
max_parallel_jobsintJumlah maksimum job QPU yang dieksekusi secara paralelTidak3
max_batchsizeintUkuran batch maksimumTidak200
Catatan
  • Jumlah generasi yang dievaluasi oleh differential evolution adalah num_generations + 1 karena populasi awal sudah termasuk.

  • Total jumlah Circuit dihitung sebagai (num_generations + 1) * population_size.

  • Menggunakan ukuran populasi yang lebih besar dan lebih banyak generasi umumnya meningkatkan kualitas hasil optimasi. Namun, tidak disarankan untuk melebihi ukuran populasi 120 dan jumlah generasi lebih dari 20 (misalnya, 120 * 21 = 2520 total Circuit), karena ini akan menghasilkan jumlah Circuit yang berlebihan, yang bisa mahal secara komputasi dan memakan waktu untuk diproses.

  • Fungsi ini memungkinkan kamu untuk melanjutkan optimasi sebelumnya, dan selalu mungkin untuk menambah jumlah generasi (dengan memberikan input yang sama kecuali untuk previous_session_id dan num_generations yang ditingkatkan).

Catatan

Pastikan kepatuhan dengan batas job Qiskit Runtime.

  • Sampler: sampler_shots <= 10_000_000.
  • Estimator: max_batchsize * estimator_shots * observable_size <= 10_000_000 (untuk fungsi ini, semua istilah observable saling komute, sehingga observable_size=1).

Lihat panduan Batas Job untuk informasi lebih lanjut.

Output

Fungsi ini mengembalikan dua dictionary: dictionary "result", yang berisi hasil optimasi terbaik, termasuk solusi optimal dan biaya objektif minimum yang terkait; dan "metadata", dengan data dari semua hasil yang diperoleh selama proses optimasi, beserta metrik masing-masing.

Dictionary pertama berfokus pada solusi dengan performa terbaik, sementara yang kedua memberikan informasi detail tentang semua solusi, termasuk biaya objektif dan metrik relevan lainnya.

Dictionary Output:โ€‹

NamaTipeDeskripsiContoh
resultdict[str, dict[str, float]]Berisi strategi investasi dari waktu ke waktu, dengan setiap time-stamp dipetakan ke bobot investasi spesifik aset (setiap bobot adalah jumlah investasi yang dinormalisasi dengan total jumlah investasi).{'time_1': {'asset_1': 0.2, 'asset_2': 0.3, ...\}, ...\}
metadatadict[str, Any]Data yang dihasilkan selama analisis, termasuk solusi, biaya, dan metrik.Lihat contoh di bawah

Deskripsi dictionary metadataโ€‹

NamaTipeDeskripsiContoh
session_idstrPengenal unik untuk sesi IBM Quantum."d0h30qjvpqf00084fgw0"
all_samples_metricsdictDictionary yang berisi berbagai metrik untuk setiap sampel yang telah diproses pasca-komputasi, seperti biaya atau batasan.Lihat deskripsi di bawah
sampler_countsdict[str, int]Dictionary di mana kunci adalah representasi bitstring dari solusi yang disampel dan nilainya adalah jumlah kemunculannya.{"101010": 3, "111000": 1\}
asset_orderlist[str]Daftar dengan urutan investasi aset yang sesuai di setiap langkah waktu dalam strategi investasi.["Asset_0", "Asset_1", "Asset_3"]
QUBOlist[list[float]]Matriks QUBO dari masalah.[[-6.96e-01, 5.81e-01, -1.26e-02, 0.00e+00], ...]
resource_summarydict[str, dict[str, float]]Ringkasan waktu penggunaan CPU dan QPU (dalam detik) di berbagai tahap proses.{'RUNNING: EXECUTING_QPU': {'CPU_TIME': 412.84, 'QPU_TIME': 87.22\}, ...\}

Deskripsi dictionary all_samples_metricsโ€‹

NamaTipeDeskripsiContoh
investment_trajectorieslist[list]Strategi investasi yang diturunkan dari state kuantum yang didekodekan.[[1, 2, 2], [1, 2, 1]]

| counts | list[int] | Jumlah berapa kali setiap trajektori investasi disampel. Indeks sesuai dengan investment_trajectories. | [5, 3] | | objective_costs | list[float] | Nilai fungsi objektif untuk setiap trajektori investasi, diurutkan dari terendah ke tertinggi. | [0.98, 1.25] | | sharpe_ratios | list[float] | Performa yang disesuaikan risiko (Sharpe ratio) untuk setiap trajektori investasi. Selaras berdasarkan indeks. | [1.1, 0.7] | | returns | list[float] | Return yang diharapkan untuk setiap trajektori investasi. Selaras berdasarkan indeks. | [0.15, 0.10] | | rest_breaches | list[float] | Deviasi batasan maksimum dalam setiap trajektori investasi. Selaras berdasarkan indeks. | [0.0, 0.25] | | transaction_costs | list[float] | Perkiraan biaya transaksi yang terkait dengan setiap trajektori investasi. Selaras berdasarkan indeks. | [0.01, 0.02] |

Mulai

Autentikasi menggunakan kunci API kamu dan pilih Qiskit Function sebagai berikut. (Cuplikan ini mengasumsikan kamu sudah menyimpan akunmu ke lingkungan lokal.)

from qiskit_ibm_catalog import QiskitFunctionsCatalog

catalog = QiskitFunctionsCatalog(channel="ibm_quantum_platform")

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

Contoh: Optimasi portofolio dinamis dengan tujuh asetโ€‹

Contoh ini menunjukkan cara mengeksekusi fungsi dynamic portfolio optimization (DPO) dan menyesuaikan pengaturannya untuk performa optimal. Ini mencakup langkah-langkah detail untuk menyetel parameter agar mencapai hasil yang diinginkan.

Kasus ini melibatkan tujuh aset, empat langkah waktu, dan empat Qubit resolusi, sehingga menghasilkan total kebutuhan 112 Qubit.

1. Baca aset yang termasuk dalam portofolio.โ€‹

Jika semua aset dalam portofolio disimpan di folder pada path tertentu, kamu bisa memuatnya ke dalam pandas.DataFrame dan mengonversinya ke objek format dict menggunakan fungsi berikut.

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

Untuk contoh ini, kami menggunakan aset 8801.T, CLF, GBPJPY, ITX.MC, META, TMBMKDE-10Y, dan XS2239553048. Gambar berikut mengilustrasikan data yang digunakan dalam contoh ini, menunjukkan evolusi harga penutupan harian aset dari 1 Januari hingga 1 September 2023.

Dalam contoh ini, untuk memastikan keseragaman antar tanggal, kami mengisi hari non-trading dengan harga penutupan dari tanggal sebelumnya yang tersedia. Kami menerapkan langkah ini karena aset yang dipilih berasal dari berbagai pasar dengan hari trading yang berbeda-beda, sehingga penting untuk menstandarisasi dataset demi konsistensi. Visualisasi data historis aset

2. Definisikan masalah.โ€‹

Tentukan spesifikasi masalah dengan mengonfigurasi parameter dalam dictionary 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. Definisikan pengaturan optimizer dan ansatz. (Opsional)โ€‹

Secara opsional, tentukan persyaratan khusus untuk proses optimasi, termasuk pemilihan optimizer dan parameternya, serta spesifikasi primitive dan konfigurasinya.

Untuk Tailored Ansatz, ukuran populasi yang dipilih didasarkan pada eksperimen sebelumnya yang menunjukkan bahwa nilai ini menghasilkan optimasi yang stabil dan efisien.

Dalam kasus Real Amplitudes Ansatz, kamu bisa mengikuti hubungan linear antara population_size dan jumlah Qubit dalam Circuit. Sebagai aturan perkiraan, disarankan untuk menggunakan minimum population_size ~ 0.8 * n_qubits untuk ansatz real_amplitudes.

Diharapkan bahwa Optimized Real Amplitudes akan memiliki performa optimasi yang lebih baik daripada ansatz Real Amplitudes. Namun, jumlah variabel yang perlu dioptimalkan dalam ansatz ini meningkat jauh lebih cepat daripada pada kasus Real Amplitudes (lihat naskah). Jadi, untuk masalah besar, Optimized Real Amplitudes memerlukan lebih banyak eksekusi Circuit. Optimized Real Amplitudes kemungkinan berguna untuk masalah yang memerlukan hingga 100 Qubit, tetapi disarankan untuk berhati-hati saat mengatur parameter population_size. Sebagai contoh scale-up dalam population_size, tabel sebelumnya menunjukkan bahwa untuk masalah 84 Qubit, Optimized Real Amplitudes memerlukan 120 population_size, sementara untuk masalah 56 Qubit, population_size sebesar 40 sudah cukup.

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

Juga mungkin untuk memilih ansatz tertentu. Berikut menggunakan ansatz 'Tailored'.

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

4. Jalankan masalah.โ€‹

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. Ambil hasil.โ€‹

Seperti yang disebutkan di bagian Output, fungsi ini mengembalikan dictionary dengan trajektori investasi yang diurutkan dari terendah ke tertinggi berdasarkan nilai fungsi objektifnya. Kumpulan hasil ini memungkinkan identifikasi trajektori dengan biaya terendah dan evaluasi investasi yang sesuai. Selain itu, ini menyediakan analisis berbagai trajektori, memfasilitasi pemilihan yang paling sesuai dengan kebutuhan atau tujuan tertentu. Fleksibilitas ini memastikan bahwa pilihan bisa disesuaikan dengan berbagai preferensi atau skenario. Mulailah dengan menyajikan strategi hasil yang mencapai biaya objektif terendah yang ditemukan selama proses.

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

Setelah itu, menggunakan metadata, kamu bisa mengakses hasil dari semua strategi yang disampel. Kamu bisa menganalisis lebih lanjut trajektori alternatif yang dikembalikan oleh optimizer. Untuk melakukan ini, baca dictionary yang tersimpan di dpo_result['metadata']['all_samples_metrics'], yang berisi tidak hanya informasi tambahan tentang strategi optimal, tetapi juga detail tentang strategi kandidat lainnya yang dievaluasi selama optimasi.

Contoh berikut menunjukkan cara membaca informasi ini menggunakan pandas untuk mengekstrak metrik kunci yang terkait dengan strategi optimal. Ini termasuk Restriction Deviation, Sharpe Ratio, dan return investasi yang sesuai.

# 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. Analisis performaโ€‹

Terakhir, analisis performa aplikasi optimasi kamu. Secara khusus, bandingkan hasilmu, yang diperoleh dalam contoh sebelumnya, terhadap baseline acak untuk menilai efektivitas pendekatan kita. Jika algoritma kuantum secara demonstrabel dan konsisten menghasilkan hasil dengan nilai biaya yang lebih rendah, itu menunjukkan proses optimasi yang efektif.

Gambar menampilkan distribusi probabilitas biaya objektif. Untuk menghasilkan distribusi ini, ambil daftar biaya objektif dari hasil fungsi dan hitung kemunculan setiap nilai biaya (nilai dibulatkan ke dua desimal). Kemudian, perbarui kolom jumlah sesuai dengan menggabungkan jumlah nilai yang dibulatkan identik. Perhatikan bahwa, untuk perbandingan visual yang lebih baik, jumlah kemunculan telah dinormalisasi sehingga setiap distribusi ditampilkan antara 0 dan 1. Visualisasi solusi optimasi Seperti yang ditunjukkan dalam gambar (garis solid biru), distribusi biaya untuk pendekatan Variational Quantum Eigensolver (diproses pasca-komputasi dengan SQD) kami terkonsentrasi tajam pada nilai biaya objektif yang lebih rendah, menunjukkan performa optimasi yang baik. Sebaliknya, baseline berisik menunjukkan distribusi yang lebih luas, berpusat di sekitar nilai biaya yang lebih tinggi. Garis vertikal putus-putus abu-abu mewakili nilai rata-rata dari distribusi acak, semakin menyoroti konsistensi fungsi dalam mengembalikan strategi investasi yang dioptimalkan. Untuk perbandingan tambahan, garis putus-putus hitam dalam gambar sesuai dengan solusi yang diperoleh dengan optimizer Gurobi (versi gratis). Semua hasil ini dieksplorasi lebih lanjut dalam benchmark di bawah untuk contoh "Mixed Assets" yang dievaluasi dengan ansatz "Tailored".

Benchmark

Fungsi ini diuji di berbagai konfigurasi Qubit resolusi, ansatz Circuit, dan pengelompokan aset dari berbagai sektor: campuran berbagai aset (Set 1), derivatif minyak (Set 2), dan IBEX35 (Set 3). Lihat detail lebih lanjut dalam tabel berikut.

SetTanggalAset
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

Dua metrik utama digunakan untuk mengevaluasi kualitas solusi.

  1. Biaya objektif, yang mengukur efisiensi optimasi dengan membandingkan nilai fungsi biaya dari setiap eksperimen dengan hasil dari Gurobi (versi gratis).
  2. Sharpe ratio, yang menangkap return yang disesuaikan risiko dari setiap portofolio, memberikan wawasan tentang performa finansial solusi.

Bersama-sama, metrik ini membandingkan aspek komputasi dan finansial dari portofolio yang dihasilkan kuantum.

ContohQubitAnsatzKedalamanPenggunaan Runtime (s)Total penggunaan (s)Biaya objektifSharpeBiaya objektif GurobiSharpe Gurobi
Mixed Assets (Set 1, 4 langkah waktu, 4-bit)112Tailored831273513095-3.7824.82-4.2524.71
Mixed Assets (Set 1,4 langkah waktu, 4 langkah waktu, 4-bit)112Real Amplitudes3591173911903-3.3923.64-4.2524.71
Oil Derivatives (Set 2, 4 langkah waktu, 3-bit)84Optimized Real Amplitudes7861806350-3.7319.13-4.1921.71
IBEX35 (Set 3, 4 langkah waktu, 2-bit)56Optimized Real Amplitudes9633143523-3.6714.48-4.1116.44

Hasil menunjukkan bahwa optimizer kuantum, dengan ansatz yang spesifik untuk masalah, secara efektif mengidentifikasi strategi investasi yang efisien di berbagai jenis portofolio. Di bawah ini kami merinci ukuran populasi dan jumlah generasi yang ditentukan dalam dictionary optimizer_options. Semua parameter lainnya diatur ke nilai defaultnya.

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

Jumlah generasi ditetapkan ke 20, karena nilai ini ditemukan cukup untuk mencapai konvergensi. Selain itu, nilai default untuk parameter internal optimizer dibiarkan tidak berubah, karena secara konsisten memberikan performa yang baik dan umumnya direkomendasikan oleh literatur dan panduan implementasi.

Dapatkan dukungan

Jika kamu memerlukan bantuan, kamu bisa mengirim email ke qpo.support@globaldataquantum.com. Dalam pesanmu, sertakan ID job fungsi.

Langkah berikutnyaโ€‹

Rekomendasi
Source: IBM Quantum docs โ€” updated 27 Mar 2026
English version on doQumentation โ€” updated 7 Mei 2026
This translation based on the English version of 11 Mar 2026