Skip to main content
IBM Quantum Platform

量子ポートフォリオ最適化ツール:Global Data QuantumによるQiskit関数

APIリファレンスを参照してください

Note

Qiskit 関数は、 IBM Quantum® Premium Plan、Flex Plan、およびオンプレム ( IBM Quantum Platform API 経由) Plan ユーザーだけが利用できる実験的な機能です。 これらはプレビューリリースの状態であり、変更される可能性がある。


概要

クォンタムポートフォリオオプティマイザーは、動的ポートフォリオ最適化問題に取り組むQiskit関数です。これは、リターンを最大化し、リスクを最小化するために、資産のセット間で定期的な投資のリバランスを目的とする金融の標準的な問題です。 この機能は、最先端の量子最適化技術を導入することで、量子コンピュータの専門知識を持たないユーザーでも、最適な投資軌道を見つけることができるよう、プロセスを簡素化している。 ポートフォリオ・マネージャー、クオンツ・ファイナンスの研究者、個人投資家に最適なこのツールは、ポートフォリオ最適化におけるトレーディング戦略のバックテストを可能にする。


関数の説明

Quantum Portfolio Optimizer機能は、VQE(Variational Quantum Eigensolver:変分量子固有値解法)アルゴリズムを使用して二次制約なし二値最適化(QUBO:Quadratic Unconstrained Binary Optimization)問題を解き、動的ポートフォリオ最適化問題に対応します。 ユーザーは、資産価格データを提供し、投資制約を定義するだけで、この機能は量子最適化プロセスを実行し、最適化された投資軌道のセットを返す。

このプロセスは、主に4つの段階から構成されています。 まず、入力データを量子互換の問題にマッピングし、動的ポートフォリオ最適化問題のQUBOを構築した上で、それを量子演算子(アイジング・ハミルトニアン)に変換する。 次に、入力問題とVQEアルゴリズムを、量子ハードウェア上で実行できるよう適応させる。 その後、量子ハードウェア上でVQEアルゴリズムを実行し、最後に結果の後処理を行って、最適な投資軌道を導き出す。 また、このシステムには、出力の品質を最大限に高めるための、ノイズを考慮した( SQDベースの )後処理機能も備わっています。

このQiskit Functionは、Global Data Quantumの発表原稿に基づいています。

機能のワークフローの可視化

使用を開始する

APIキー を使用して認証を行い、次のように「Qiskit Function」を選択してください。 (このスニペットは、アカウントがすでにローカル環境に保存されていることを前提としています。)

from qiskit_ibm_catalog import QiskitFunctionsCatalog

catalog = QiskitFunctionsCatalog(channel="ibm_quantum_platform")

# Verify that you have access to the function
catalog.list()

Output:

[QiskitFunction(qunova/hivqe-chemistry),
 QiskitFunction(global-data-quantum/quantum-portfolio-optimizer),
 QiskitFunction(algorithmiq/tem),
 QiskitFunction(qedma/qesem),
 QiskitFunction(multiverse/singularity),
 QiskitFunction(ibm/circuit-function),
 QiskitFunction(q-ctrl/optimization-solver),
 QiskitFunction(colibritd/quick-pde),
 QiskitFunction(q-ctrl/performance-management),
 QiskitFunction(kipu-quantum/iskay-quantum-optimizer)]
# Access function
dpo_solver = catalog.load("global-data-quantum/quantum-portfolio-optimizer")

例:7つの資産を用いた動的ポートフォリオ最適化

この例では、動的ポートフォリオ最適化(DPO)機能を実行し、最適なパフォーマンスが得られるように設定を調整する方法を示します。 望ましい結果を得るためにパラメーターを微調整するための詳細な手順も含まれている。

この場合、7つのアセット、4つの時間ステップ、4つの分解能量子ビットが必要となり、合計112量子ビットが必要となる。

1. ポートフォリオに含まれる資産を確認する

ポートフォリオの全アセットが特定のパスのフォルダに保存されている場合、それらを pandas.DataFrame にロードし、以下の関数を使用して dict 形式のオブジェクトに変換することができます。

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

この例では、資産 8801.T CLF, GBPJPYITX.MC METATMBMKDE-10Y そして XS2239553048. 次の図は、この例で使用したデータで、2023年の1月1日から9月1日までの資産の毎日の終値の推移を示している。

この例では、日付間の均一性を確保するため、取引日でない日は前回の取引可能日の終値で埋めている。 このステップを適用したのは、選択した資産がさまざまな市場のさまざまな取引日に由来するため、一貫性を保つためにデータセットを標準化することが不可欠だからである。

資産の履歴データの可視化

2. 問題を定義する

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. オプティマイザーとアンザッツの設定を定義する(任意)

オプションとして、オプティマイザやそのパラメータの選択、プリミティブやそのコンフィギュレーションの指定など、最適化プロセスの具体的な要件を定義します。

Tailored Ansatzの場合、選択した母集団サイズは、この値が安定した効率的な最適化をもたらすことを示す過去の実験に基づいている。

Real Amplitudes Ansatzの場合、 population_size と回路内の量子ビット数との間に線形関係をたどることができる。 近似的な経験則として、 real_amplitudes ansatzには最小の population_size ~ 0.8 * n_qubits を使用することが推奨される。

Optimized Real Amplitudesは、Real Amplitudes ansatzよりも優れた最適化性能を持つことが期待される。 しかし、このansatzで最適化する変数の数は、Real Amplitudesの場合よりもはるかに速く増加する( 原稿を参照)。 したがって、大規模な問題では、最適化された実数アンプリチュードは、より多くの回路実行を必要とする。 Optimized Real Amplitudesは100qubitsまでの問題に有効ですが、 population_size パラメータを設定する際に注意することをお勧めします。 population_size、このスケールアップの例として、前の表では、84量子ビットの問題では、Optimize Real Amplitudesは120 population_size を必要としますが、56量子ビットの問題では、 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,
    },
}

特定のansatzを選択することも可能である。 以下では、 'Tailored' ansatzを使用する。

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

4. 問題を解く

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. 結果を取得する

この関数は、目的関数の値に基づいて投資の軌跡を低い順から高い順に並べた辞書を返します(APIリファレンスの 「出力 」セクションを参照)。 この一連の結果により、コストが最も低い経路を特定し、それに対応する投資評価を行うことが可能となる。 さらに、さまざまなシナリオの分析が可能であり、特定のニーズや目標に最も適したシナリオの選定を容易にします。 この柔軟性により、さまざまな好みや状況に合わせて選択肢を調整することが可能になります。

まず、プロセス中に発見された最も低い目的コストを達成した結果の戦略を提示することから始める。

# Get the results of the job
dpo_result = dpo_job.result()

# Show the solution strategy
dpo_result["result"]

Output:

{'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}}

その後、メタデータを使って、サンプリングされたすべてのストラテジーの結果にアクセスできる。 これにより、オプティマイザが返す代替軌道をさらに分析することができる。 そのためには、 dpo_result['metadata']['all_samples_metrics'] に格納されている辞書を読み込む。この辞書には、最適戦略に関する追加情報だけでなく、最適化中に評価された他の候補戦略の詳細も含まれている。

次の例は、 pandas を使用してこの情報を読み取り、最適な戦略に関連する主要な指標を抽出する方法を示しています。 これらには、制限偏差、シャープレシオ、および対応する投資リターンが含まれる。

# 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']}")

Output:

Minimum Objective Cost Found: -3.78
Best Solution:
  - Restriction Deviation: 40.0
  - Sharpe Ratio: 24.82
  - Return: 0.46

6. 性能分析

最後に、最適化アプリケーションのパフォーマンスを分析します。 具体的には、先ほどの例で得られた結果をランダムなベースラインと比較し、我々のアプローチの有効性を評価する。 量子アルゴリズムが、より低いコスト値の結果を実証的かつ一貫して出すなら、それは効果的な最適化プロセスを示している。

図は、目的コストの確率分布を示している。 これらの分布を生成するには、関数の結果から目的コストのリストを取り出し、各コスト値(小数点第2位を四捨五入した値)の出現回数を数える。 次に、同じ丸め値のカウントを結合して、カウント列を適宜更新する。 なお、より見やすく比較するために、出現回数は正規化されており、各分布は0から1の間で表示されている。

最適化問題の解の可視化

図(青い実線)に示すように、我々の Variational Quantum Eigensolver (post-processed with SQD) アプローチのコスト分布は、低い目的コスト値に急激に集中しており、良好な最適化性能を示しています。 対照的に、ノイズの多いベースラインは、より高いコスト値を中心に、より広い分布を示している。 グレーの破線の縦線はランダム分布の平均値を表し、最適化された投資戦略を返す関数の一貫性をさらに強調している。 さらに比較のために、図中の黒い破線はGurobiオプティマイザー(無料版)で得られた解に対応しています。 これらの結果はすべて、"Tailored "ansatzで評価された "Mixed Assets "の例に関する以下のベンチマークでさらに検討される。

ベンチマーク

この関数は、分解能量子ビット、アンサッツ回路、さまざまなセクターの資産グループ(さまざまな資産の混合(セット1)、石油デリバティブ(セット2)、 IBEX35 (セット3)のさまざまな構成でテストされた。 詳細は以下の表を参照。

を設定します
日付
アセット
セット101/01/20238801.T cl=f, gbpjpy=x, ITX.MC, meta, TMBMKDE-10Y、 XS2239553048
セット201/06/2023cl=f、bz=f、ho=f、ng=f、xom、rb=f、 2222.SR
セット301/11/2022ACS.MC, ITX.MC, FER.MC, ELE.MC, SCYR.MC, AENA.MC, AMS.MC

ソリューションの品質を評価するために、2つの主要な指標が用いられた。

  1. 目的コストは、各実験で得られたコスト関数の値をGurobi(無料版)の結果と比較することで、最適化の効率を測定します。
  2. シャープレシオは、各ポートフォリオのリスク調整後リターンを把握するもので、ソリューションの財務パフォーマンスに関する洞察を提供する。

これらの指標は、量子的に生成されたポートフォリオの計算と財務の両面をベンチマークするものである。

量子ビット
アンサッツ
深さ
ランタイム使用量 (s)
総使用量 (s)
目標コスト
シャープ
グロビの目的コスト
グロビ・シャープ
混合資産(セット1、4タイムステップ、4ビット)112テーラード831273513095-3.7824.82-4.2524.71
ミックスアセット(セット1、4タイムステップ、4タイムステップ、4ビット)112実質アンプリチュード3591173911903-3.3923.64-4.2524.71
石油デリバティブ(セット2、4タイムステップ、3ビット)84最適化された実質アンプリチュード7861806350-3.7319.13-4.1921.71
IBEX35 (セット3、4タイムステップ、2ビット)56最適化された実質アンプリチュード9633143523-3.6714.48-4.1116.44

その結果、量子オプティマイザは、問題固有の解を用いることで、様々なタイプのポートフォリオにおいて効率的な投資戦略を効果的に特定できることが示された。

以下では、 optimizer_options 辞書で指定された母集団サイズと世代数の両方について詳しく説明する。 その他のパラメータはすべてデフォルト値に設定した。

population_size
num_generations
ミックス・アセット・ポートフォリオ9020
ミックス・アセット・ポートフォリオ9220
石油デリバティブ・ポートフォリオ12020
IBEX35 ポートフォリオ4020

世代数は、収束に達するのに十分であることが判明したため、20世代とした。 さらに、オプティマイザの内部パラメータのデフォルト値は、一貫して良好な性能を示し、文献や実装ガイドラインで一般的に推奨されているため、変更しませんでした。

サポートの利用

サポートが必要な場合は、 qpo.support @ globaldataquantum.com に電子メールを送信してください。 メッセージには、ファンクション・ジョブIDを記入してください。


次のステップ

推奨事項
このページは役に立ちましたか?
バグや誤字の報告、またはコンテンツの要求はGitHubで行ってください。