ביצוע אופטימיזציה דינמית של תיק השקעות עם Portfolio Optimizer של Global Data Quantum
פונקציות Qiskit הן תכונה ניסיונית הזמינה רק למשתמשי IBM Quantum® Premium Plan, Flex Plan ו-On-Prem (דרך IBM Quantum Platform API) Plan. הן במצב שחרור מקדים וכפופות לשינויים.
הערכת שימוש: כ-55 דקות על מעבד Heron r2. (הערה: זוהי הערכה בלבד. זמן הריצה בפועל עשוי להשתנות.)
רקע
בעיית אופטימיזציית תיק השקעות דינמית מכוונת למציאת אסטרטגיית השקעה אופטימלית על פני תקופות זמן מרובות כדי למקסם את התשואה הצפויה של התיק ולמזער סיכונים, לעיתים קרובות תחת אילוצים מסוימים כגון תקציב, עלויות עסקה או סלידה מסיכון. בניגוד לאופטימיזציית תיק השקעות סטנדרטית, המתייחסת לזמן בודד לאיזון מחדש של התיק, הגרסה הדינמית לוקחת בחשבון את האופי המתפתח של נכסים ומתאימה השקעות על סמך שינויים בביצועי הנכסים לאורך זמן.
מדריך זה מדגים כיצד לבצע אופטימיזציה דינמית של תיק השקעות באמצעות פונקציית Qiskit Quantum Portfolio Optimizer. במיוחד, אנו ממחישים כיצד להשתמש בפונקציית יישום זו כדי לפתור בעיית הקצאת השקעות על פני צעדי זמן מרובים.
הגישה כוללת ניסוח אופטימיזציית התיק כבעיית Quadratic Unconstrained Binary Optimization (QUBO) רב-יעדית. במיוחד, אנו מנסחים את פונקציית QUBO לאופטימיזציה סימולטנית של אַרבעה יעדים שונים:
- מקסום פונקציית התשואה
- מזעור הסיכון של ההשקעה
- מזעור עלויות העסקה
- עמידה במגבלות ההשקעה, המנוסחות במונח נוסף למזעור .
לסיכום, כדי להתמודד עם יעדים אלה אנו מנסחים את פונקציית QUBO כ כאשר הוא מקדם סלידת הסיכון ו- הוא מקדם חיזוק המגבלות (כופל לגראנז'). הניסוח המפורש ניתן למצוא במשוואה (15) של כתב היד שלנו [1].
אנו פותרים באמצעות שיטה קוונטית-קלאסית היברידית המבוססת על Variational Quantum Eigensolver (VQE). במערך זה, המעגל הקוונטי מעריך את פונקציית העלות, בעוד שהאופטימיזציה הקלאסית מבוצעת באמצעות אלגוריתם Differential Evolution, המאפשר ניווט יעיל בנוף הפתרון. מספר הקיוביטים הנדרש תלוי בשלושה גורמים עיקריים: מספר הנכסים na, מספר תקופות הזמן nt ורזולוציית הביטים המשמשת לייצוג ההשקעה nq. במיוחד, מספר הקיוביטים המינימלי בבעיה שלנו הוא na*nt*nq.
למדריך זה, אנו מתמקדים באופטימיזציה של תיק אזורי המבוסס על מדד IBEX 35 הספרדי. במיוחד, אנו משתמשים בתיק של שבעה נכסים כפי שמצוין בטבלה להלן:
| תיק IBEX 35 | ACS.MC | ITX.MC | FER.MC | ELE.MC | SCYR.MC | AENA.MC | AMS.MC |
|---|
אנו מאזנים מחדש את התיק שלנו בארבעה צעדי זמן, כל אחד מופרד במרווח של 30 יום החל מ-1 בנובמבר 2022. כל משתנה השקעה מקודד באמצעות שני ביטים. זה מביא לבעיה הדורשת 56 קיוביטים לפתרון.
אנו משתמשים ב-Optimized Real Amplitudes ansatz, התאמה מותאמת אישית ויעילה מבחינת חומרה של ה-Real Amplitudes ansatz הסטנדרטי, המותאמת במיוחד לשיפור הביצועים עבור סוג זה של בעיית אופטימיזציה פיננסית.
הביצוע הקוונטי מבוצע על ה-backend ibm_torino. להסבר מפורט של ניסוח הבעיה, המתודולוגיה והערכת הביצועים, עיין בכתב היד שפורסם [1].
דרישות
# Added by doQumentation — required packages for this notebook
!pip install -q numpy
!pip install qiskit-ibm-catalog
!pip install pandas
!pip install matplotlib
!pip install yfinance
הגדרה
כדי להשתמש ב-Quantum Portfolio Optimizer, בחר את הפונקציה דרך קטלוג פונקציות Qiskit. אתה זקוק לחשבון IBM Quantum Premium Plan או Flex Plan עם רישיון מ-Global Data Quantum כדי להפעיל פונקציה זו.
תחילה, אמת עם מפתח ה-API שלך. לאחר מכן, טען את הפונקציה הרצויה מקטלוג פונקציות Qiskit. כאן, אתה ניגש לפונקציה quantum_portfolio_optimizer מהקטלוג באמצעות המחלקה QiskitFunctionsCatalog. פונקציה זו מאפשרת לנו להשתמש בפותר Quantum Portfolio Optimization המוגדר מראש.
from qiskit_ibm_catalog import QiskitFunctionsCatalog
catalog = QiskitFunctionsCatalog(
channel="ibm_quantum_platform",
instance="INSTANCE_CRN",
token="YOUR_API_KEY", # Use the 44-character API_KEY you created and saved from the IBM Quantum Platform Home dashboard
)
# Access function
dpo_solver = catalog.load("global-data-quantum/quantum-portfolio-optimizer")
שלב 1: קריאת תיק הקלט
בשלב זה, אנו טוענים נתונים היסטוריים עבור שבעת הנכסים הנבחרים ממדד IBEX 35, במיוחד מ-1 בנובמבר 2022 עד 1 באפריל 2023.
אנו מביאים את הנתונים באמצעות Yahoo Finance API, תוך התמקדות במחירי סגירה. הנתונים עוברים עיבוד כדי להבטיח שלכל הנכסים יש את אותו מספר ימים עם נתונים. כל נתון חסר (ימים שאינם ימי מסחר) מטופל בהתאם, תוך הבטחה שכל הנכסים מיושרים על אותם תאריכים.
הנתונים מובנים ב-DataFrame עם פורמט עקבי על פני כל הנכסים.
import yfinance as yf
import pandas as pd
# List of IBEX 35 symbols
symbols = [
"ACS.MC",
"ITX.MC",
"FER.MC",
"ELE.MC",
"SCYR.MC",
"AENA.MC",
"AMS.MC",
]
start_date = "2022-11-01"
end_date = "2023-4-01"
series_list = []
symbol_names = [symbol.replace(".", "_") for symbol in symbols]
# Create a full date index including weekends
full_index = pd.date_range(start=start_date, end=end_date, freq="D")
for symbol, name in zip(symbols, symbol_names):
print(f"Downloading data for {symbol}...")
data = yf.download(symbol, start=start_date, end=end_date)["Close"]
data.name = name
# Reindex to include weekends
data = data.reindex(full_index)
# Fill missing values (for example, weekends or holidays) by forward/backward fill
data.ffill(inplace=True)
data.bfill(inplace=True)
series_list.append(data)
# Combine all series into a single DataFrame
df = pd.concat(series_list, axis=1)
# Convert index to string for consistency
df.index = df.index.astype(str)
# Convert DataFrame to dictionary
assets = df.to_dict()
[*********************100%***********************] 1 of 1 completed
[*********************100%***********************] 1 of 1 completed
[*********************100%***********************] 1 of 1 completed
[*********************100%***********************] 1 of 1 completed
[*********************100%***********************] 1 of 1 completed
[*********************100%***********************] 1 of 1 completed
[*********************100%***********************] 1 of 1 completed
Downloading data for ACS.MC...
Downloading data for ITX.MC...
Downloading data for FER.MC...
Downloading data for ELE.MC...
Downloading data for SCYR.MC...
Downloading data for AENA.MC...
Downloading data for AMS.MC...