devanshu6
量子コンピューティングを使用したポートフォリオ最適化: 実践的な実装
Portfolio Optimization Using Quantum Computing: A Practical Implementation
ポートフォリオ最適化は、定量的金融における最も古くて有用な課題の 1 つです。従来のコンピューティング手法は十分に機能してきましたが、量子コンピューティングはこの複雑な問題に取り組むための新しいアプローチを提供します。このブログ投稿では、IBM の量子コンピューティング フレームワークである Qiskit を使用して、量子コンピューティングがポートフォリオ最適化にどのように役立つかについて説明します。
問題を理解する
ポートフォリオ最適化は、本質的には、期待収益とリスクのバランスを取りながら、さまざまな資産間での投資の最適な配分を見つけることです。古典的な Markowitz モデルでは、次の点を考慮して、これを二次計画問題として定式化します。
– 資産の期待収益
– 共分散行列(リスクを表す)
– 投資制約(予算制約など)
実装の概要
ポートフォリオ最適化に対する量子アプローチを詳しく見てみましょう。
1. 環境の設定
from qiskit.circuit.library import TwoLocal
from qiskit_finance.applications.optimization import PortfolioOptimization
from qiskit_finance.data_providers import RandomDataProvider
import datetime
私たちは金融アプリケーションに特化したツールを提供する Qiskit の金融モジュールを使用しています。コードは、ランダムに生成されたデータを使用して実際の市場状況をシミュレートし、20 個の資産で問題を初期化します。
num_assets = 20
stocks = [("TICKER%s" % i) for i in range(num_assets)]
data = RandomDataProvider(
tickers=stocks,
start=datetime.datetime(2016, 1, 1),
end=datetime.datetime(2016, 1, 30),
seed=seed,
)
2. 問題の定式化
ポートフォリオ最適化問題は、次の 3 つの主要なパラメータで構成されます。
– リスク係数(q = 0.5):リスクとリターンのトレードオフのバランスをとる
– 予算 (num_assets // 2): 投資できる資産の数を制限します
– ペナルティ条件: 予算制約が適切に実施されることを保証する
portfolio = PortfolioOptimization(
expected_returns=mu,
covariances=sigma,
risk_factor=q,
budget=budget
)
3. 実装
この実装では、2 つの異なるアプローチが使用されます。
a. 正確なソルバー
exact_mes = NumPyMinimumEigensolver()
exact_eigensolver = MinimumEigenOptimizer(exact_mes)
result = exact_eigensolver.solve(qp)
これは、NumPy を使用した直接的なソリューションを使用したベースライン ソリューションを提供します。アセットの数が増えると、正確なソリューションを計算する複雑さも増します。アセットの数が多い場合は、代わりに近似法が使用されます。
b. 変分量子固有値ソルバーの使用
ry = TwoLocal(num_assets, "ry", "crx", reps=3, entanglement="full")
svqe_mes = SamplingVQE(sampler=Sampler(), ansatz=ry, optimizer=cobyla)
svqe = MinimumEigenOptimizer(svqe_mes)
result = svqe.solve(qp)
TwoLocal は初期状態の準備のための ansatz を作成します。COBYLA は最適化ツールです。
主な機能と利点
1. 量子アプローチは、資産の複雑な組み合わせにおいて、より良い解決策を提供できる可能性がある。
2. 別のアプローチでは、従来のコンピューティングと量子コンピューティングの両方の長所を活用し、それぞれが対応するコンピューティングよりも優位性を発揮します。
結果
結果をより良く視覚化するために
ef print_result(result):
selection = result.x
value = result.fval
print("Optimal: selection {}, value {:.4f}".format(selection, value))
eigenstate = result.min_eigen_solver_result.eigenstate
probabilities = (
eigenstate.binary_probabilities()
if isinstance(eigenstate, QuasiDistribution)
else {k: np.abs(v) ** 2 for k, v in eigenstate.to_dict().items()}
)
print("\n----------------- Full result ---------------------")
print("selection\tvalue\t\tprobability")
print("---------------------------------------------------")
probabilities = sorted(probabilities.items(), key=lambda x: x[1], reverse=True)
for k, v in probabilities:
x = np.array([int(i) for i in list(reversed(k))])
value = portfolio.to_quadratic_program().objective.evaluate(x)
print("%10s\t%.4f\t\t%.4f" % (x, value, v))
結論
量子コンピューティングは、ポートフォリオ最適化への新しいアプローチを提供します。これらの実装は、時間の複雑さの点で従来の方法よりも優れているわけではありませんが、多数の資産に対してより優れたソリューションを実現するための道筋を提供します。