PortfolioOptimization_CN.ipynb 21.6 KB
Notebook
Newer Older
Q
Quleaf 已提交
1 2 3 4
{
 "cells": [
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
5
   "metadata": {},
Q
Quleaf 已提交
6 7 8 9
   "source": [
    "# 量子金融应用:投资组合优化\n",
    "\n",
    "<em> Copyright (c) 2021 Institute for Quantum Computing, Baidu Inc. All Rights Reserved. </em>"
Q
Quleaf 已提交
10
   ]
Q
Quleaf 已提交
11 12 13
  },
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
14
   "metadata": {},
Q
Quleaf 已提交
15 16 17 18 19 20 21
   "source": [
    "\n",
    "## 概览\n",
    "\n",
    "当前量子计算应用到金融问题上的解决方案通常可分为三类量子算法,即量子模拟,量子优化以及量子机器学习 [1,2]。许多的金融问题本质上是一个组合优化问题,解决这些问题的算法通常具有较高的时间复杂度,实现难度较大。得益于量子计算强大的计算性能,未来有望通过量子算法解决这些复杂问题。\n",
    "\n",
    "量桨的 Quantum Finance 模块主要讨论的是量子优化部分的内容,即如何通过一些量子算法解决实际金融应用中的优化问题。本文主要介绍如何使用量子算法求解主动投资管理中投资组合优化问题。"
Q
Quleaf 已提交
22
   ]
Q
Quleaf 已提交
23 24 25
  },
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
26
   "metadata": {},
Q
Quleaf 已提交
27 28 29 30 31 32
   "source": [
    "## 投资组合优化问题\n",
    "\n",
    "投资组合是金融投资的集合,比如股票、债权、现金等。投资组合优化是许多主动型投资管理者需要面对的问题,它需要从业者应用相关数学理论方法,根据目标收益和风险对一笔资金进行投资,以期在收益一定的情况下风险最小化或者是风险一定的情况下投资收益最大化。\n",
    "\n",
    "对投资组合优化的一个具体描述如下:假如你是一位资产管理人,想要将数额为 $K$ 的资金一次性投入到 $N$ 个可投资的项目中,各项目都有自己的投资回报率和风险,你的目标就是在考虑到市场影响和交易费用的的基础上找到一个最佳的投资组合空间,使得该笔资产以最优的投资方案实施。"
Q
Quleaf 已提交
33
   ]
Q
Quleaf 已提交
34 35 36
  },
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
37
   "metadata": {},
Q
Quleaf 已提交
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
   "source": [
    "### 编码投资组合优化问题\n",
    "\n",
    "为了将投资组合优化问题转化成一个参数化量子电路(parameterized quantum circuits, PQC)可解的问题,我们首先需要编码该问题的哈密顿量。\n",
    "为了方便建模实现,需要做两点假设对问题加以限制:\n",
    "* 每个项目都是等额投资的,\n",
    "* 给定的预算是投资一个项目金额的整数倍,且必须全部花完。\n",
    "\n",
    "在该计算模型中我们把对项目的投资金额单位化,即如果投资预算为 $3$,那么就要投 $3$ 个项目。因为实际的投资中,预算是有限的,而可投资的项目是很多的,所以在设定参数时也要注意可投资项目数是要大于预算的。\n",
    "\n",
    "在投资组合的基本理论中,投资组合的总体风险与项目间的协方差有关,而协方差与任意两项目的相关系数成正比。相关系数越小,其协方差就越小,投资组合的总体风险也就越小 [3]。\n",
    "在这里我们采用均值方差组合优化的方法,给出该问题的建模方程:\n",
    "\n",
    "$$\n",
    "\\omega = \\max _{x \\in\\{0,1\\}^{n}} \\mu^{T} x - q x^{T} S x \\quad\\quad  \\tag{1}\n",
    "\\text { subject to: } \\mathbb{1}^{T} x=B,\n",
    "$$\n",
    "\n",
    "该式子中各符号代表的含义如下:\n",
    "* $x\\in {\\{0,1\\}}^n$ 表示一个向量,其中每一个元素均为二进制变量,即如果资产 $i$ 被投资了,则 $x_i = 1$,如果没有被选择,则 $x_i = 0$ \n",
    "* $\\mu \\in \\mathbb{R}^n$ 表示投资每个项目的预期回报率\n",
    "* $S \\in \\mathbb{R}^{n \\times n}$ 表示各投资项目回报率之间的协方差矩阵\n",
    "* $q > 0$ 表示做出该投资决定的风险系数\n",
    "* $\\mathbb{1}$ 表示 $n$ 维值全为 $1$ 向量\n",
    "* $B$ 代表投资预算,即我们可以投资的项目数\n",
    "\n",
    "\n",
    "根据模型方程,可以给出损失函数:\n",
    "\n",
    "$$\n",
    "C_x = q \\sum_i  \\sum_j S_{ji}x_ix_j - \\sum_{i}x_i \\mu_i + A \\left(B - \\sum_i x_i\\right)^2,  \\tag{2}\n",
    "$$\n",
    "\n",
    "其中,$S_{ij}$ 表示协方差矩阵 $S$ 的内部元素。\n",
    "\n",
    "由于要对损失函数做梯度下降优化,所以在定义时就根据模型的方程做了一定修改:其中第一项为风险项,表示该笔投资的风险;第二项为投资收益项;$A$ 为惩罚参数,通常设置为一个较大的数字,该项限定一笔资金预算 $B$ 必须均匀的投入到不同的投资项目中。\n",
    "\n",
    "现在我们需要将损失函数转为一个哈密顿量,从而完成投资组合优化问题的编码。每一个二进制变量可以取 $0$ 和 $1$ 两个值,分别对应量子态 $|0\\rangle$ 和 $|1\\rangle$。每个二进制变量都对应一个量子比特,所以我们需要 $n$ 个量子比特来解决投资组合优化问题。\n",
    "因为我们的变量 $x_i$ 的值为 $0$ 和 $1$,所以我们要构造一个本征值和它对应的哈密顿量。泡利 $Z$ 的本征值为 $\\pm 1$,于是我们构造的哈密顿量为 $\\frac{I-Z}{2}$, 对应的本征值即为 $0$ 和 $1$。我们现在将二进制变量映射到泡利 $Z$ 矩阵上,从而使 $C_x$ 转化成哈密顿矩阵:\n",
    "\n",
    "$$\n",
    "x_{i} \\mapsto \\frac{I-Z_{i,}}{2}, \\tag{3}\n",
    "$$\n",
    "\n",
    "这里 $Z_{i} = I \\otimes I \\otimes \\ldots \\otimes Z \\otimes \\ldots \\otimes I$,也就是说 $Z$ 作用在第 $i$ 个量子比特上。通过这个映射,如果一个编号为 $i$ 的量子比特的量子态为 $|1\\rangle$,那么对应的二进制变量的取值为 $x_{i} |1\\rangle = \\frac{I-Z_{i}}{2} |1\\rangle = 1|1\\rangle $,也就是说该项目是我们要投资的。同样地,对于量子态为 $|0\\rangle$的量子比特 $i$,它所对应的二进制变量的取值为 $x_{i}|0\\rangle  = \\frac{I-Z_{i}}{2} |0\\rangle = 0 |0\\rangle $。\n",
    "\n",
    "我们用上述映射将 $C_x$ 转化成量子比特数为 $n$ 的系统的哈密顿矩阵 $H_C$,从而实现了投资组合优化问题的量子化。这个哈密顿矩阵 $H_C$ 的基态即为投资组合优化问题的最优解。在接下来的部分,我们将展示如何用参数化量子电路找到这个矩阵的基态,也就是对应最小本征值的本征态。"
Q
Quleaf 已提交
85
   ]
Q
Quleaf 已提交
86 87 88
  },
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
89
   "metadata": {},
Q
Quleaf 已提交
90 91 92 93
   "source": [
    "## Paddle Quantum 实现\n",
    "\n",
    "要在量桨上实现用参数化量子电路解决量子金融中的投资组合优化问题,首先要做的便是加载需要用到的包。"
Q
Quleaf 已提交
94
   ]
Q
Quleaf 已提交
95 96 97
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
98 99 100 101 102 103 104 105
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-05-17T08:00:15.901429Z",
     "start_time": "2021-05-17T08:00:12.708945Z"
    }
   },
   "outputs": [],
Q
Quleaf 已提交
106 107 108 109 110 111 112 113
   "source": [
    "#加载需要的包\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import datetime\n",
    "\n",
    "#加载飞桨,量桨相关的模块\n",
    "import paddle\n",
Q
Quleaf 已提交
114 115
    "import paddle_quantum\n",
    "from paddle_quantum.ansatz import Circuit\n",
Q
Quleaf 已提交
116
    "from paddle_quantum.finance import DataSimulator, portfolio_optimization_hamiltonian"
Q
Quleaf 已提交
117
   ]
Q
Quleaf 已提交
118 119 120
  },
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
121
   "metadata": {},
Q
Quleaf 已提交
122 123 124 125 126 127
   "source": [
    "### 准备实验数据\n",
    "在本问题中,我们选定的投资项目为股票。对于实验测试要用的数据,提供了两种选择:\n",
    "* 第一种方法是根据设定的条件,随机生成实验数据。\n",
    "\n",
    "如果采用这种方法准备数据,用户在初始化数据时,就需要给出可投资股票的名字列表,交易数据的开始日期和结束日期。"
Q
Quleaf 已提交
128
   ]
Q
Quleaf 已提交
129 130 131
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
132 133 134
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
Q
Quleaf 已提交
135 136 137
   "source": [
    "num_assets = 7  # 可投资的项目数量\n",
    "stocks = [(\"STOCK%s\" % i) for i in range(num_assets)]  \n",
Q
Quleaf 已提交
138 139
    "data = DataSimulator(stocks=stocks, start=datetime.datetime(2016, 1, 1), end=datetime.datetime(2016, 1, 30)) \n",
    "data.randomly_generate() # 随机生成实验数据"
Q
Quleaf 已提交
140
   ]
Q
Quleaf 已提交
141 142 143
  },
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
144 145 146 147 148 149
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-05-17T08:00:16.212260Z",
     "start_time": "2021-05-17T08:00:15.918792Z"
    }
   },
Q
Quleaf 已提交
150 151 152 153 154 155
   "source": [
    "* 第二种方法是用户可以选择读取本地收集到的真实数据集用于实验。考虑到文件中包含的股票数可能会很多,用户可以指定用于该实验的股票数量,即上面初始化的 `num_assets`。\n",
    "\n",
    "我们收集了 $12$ 支股票 $35$ 个交易日的收盘价格存放到 `realStockData_12.csv` 文件中,在这里我们只选择读取前 $7$ 个股票的信息。\n",
    "\n",
    "在本教程中,我们选择读取真实数据作为实验数据。"
Q
Quleaf 已提交
156
   ]
Q
Quleaf 已提交
157 158 159
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
160 161 162 163 164 165 166 167 168 169 170
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[16.87, 17.18, 17.07, 17.15, 16.66, 16.79, 16.69, 16.99, 16.76, 16.52, 16.33, 16.39, 16.45, 16.0, 16.09, 15.54, 13.99, 14.6, 14.63, 14.77, 14.62, 14.5, 14.79, 14.77, 14.65, 15.03, 15.37, 15.2, 15.24, 15.59, 15.58, 15.23, 15.04, 14.99, 15.11, 14.5], [32.56, 32.05, 31.51, 31.76, 31.68, 32.2, 31.46, 31.68, 31.39, 30.49, 30.53, 30.46, 29.87, 29.21, 30.11, 28.98, 26.63, 27.62, 27.64, 27.9, 27.5, 28.67, 29.08, 29.08, 29.95, 30.8, 30.42, 29.7, 29.65, 29.85, 29.25, 28.9, 29.33, 30.11, 29.67, 29.59], [5.4, 5.48, 5.46, 5.49, 5.39, 5.47, 5.46, 5.53, 5.5, 5.47, 5.39, 5.35, 5.37, 5.24, 5.26, 5.08, 4.57, 4.44, 4.5, 4.56, 4.52, 4.59, 4.66, 4.67, 4.66, 4.72, 4.84, 4.81, 4.84, 4.88, 4.89, 4.82, 4.74, 4.84, 4.79, 4.63], [3.71, 3.75, 3.73, 3.79, 3.72, 3.77, 3.76, 3.74, 3.78, 3.71, 3.61, 3.58, 3.61, 3.53, 3.5, 3.42, 3.08, 2.95, 3.04, 3.05, 3.05, 3.13, 3.12, 3.14, 3.11, 3.07, 3.23, 3.3, 3.31, 3.3, 3.33, 3.31, 3.22, 3.31, 3.25, 3.12], [5.72, 5.75, 5.74, 5.81, 5.69, 5.79, 5.77, 5.8, 5.89, 5.78, 5.7, 5.69, 5.75, 5.7, 5.71, 5.54, 4.99, 4.89, 4.94, 5.08, 5.39, 5.35, 5.23, 5.26, 5.19, 5.18, 5.31, 5.33, 5.31, 5.38, 5.39, 5.41, 5.28, 5.3, 5.38, 5.12], [7.62, 7.56, 7.68, 7.75, 7.79, 7.84, 7.82, 7.8, 7.92, 7.96, 7.93, 7.87, 7.86, 7.82, 7.9, 7.7, 6.93, 6.91, 7.18, 7.31, 7.35, 7.53, 7.47, 7.48, 7.35, 7.33, 7.46, 7.47, 7.39, 7.47, 7.48, 8.06, 8.02, 8.01, 8.11, 7.87], [3.7, 3.7, 3.68, 3.7, 3.63, 3.66, 3.63, 3.63, 3.66, 3.63, 3.6, 3.59, 3.63, 3.6, 3.61, 3.54, 3.19, 3.27, 3.27, 3.31, 3.3, 3.32, 3.33, 3.38, 3.36, 3.34, 3.39, 3.39, 3.37, 3.42, 3.43, 3.37, 3.32, 3.36, 3.37, 3.3]]\n"
     ]
    }
   ],
Q
Quleaf 已提交
171 172 173 174 175 176 177 178 179
   "source": [
    "df = pd.read_csv('realStockData_12.csv')\n",
    "dt = []\n",
    "for i in range(num_assets): \n",
    "    mylist = df['closePrice'+str(i)].tolist()\n",
    "    dt.append(mylist)   \n",
    "print(dt)  # 输出从文件中读取的七个股票在35个交易日中的收盘价格\n",
    "\n",
    "data.set_data(dt)  # 指定实验数据为用户读取的数据"
Q
Quleaf 已提交
180
   ]
Q
Quleaf 已提交
181 182 183
  },
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
184
   "metadata": {},
Q
Quleaf 已提交
185 186 187 188 189 190
   "source": [
    "### 编码哈密顿量\n",
    "\n",
    "这里我们将式(2)中的二进制变量用式(3)替换,从而构建哈密顿量 $H_C$。\n",
    "\n",
    "在编码哈密顿量的过程中,首先需要计算各股票回报率之间的协方差矩阵 $S$。量桨平台的 finance 模块有支持计算该协方差矩阵的函数,用户可以直接调用。"
Q
Quleaf 已提交
191
   ]
Q
Quleaf 已提交
192 193 194
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
195 196 197
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
Q
Quleaf 已提交
198 199
   "source": [
    "s = data.get_asset_return_covariance_matrix()"
Q
Quleaf 已提交
200
   ]
Q
Quleaf 已提交
201 202 203
  },
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
204
   "metadata": {},
Q
Quleaf 已提交
205 206
   "source": [
    "第二个是需要计算出各个股票的平均投资回报率向量 $\\mu$。同样的,量桨也提供有计算各股票平均投资回报率的函数。"
Q
Quleaf 已提交
207
   ]
Q
Quleaf 已提交
208 209 210
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
211 212 213
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
Q
Quleaf 已提交
214 215
   "source": [
    "mu = data.get_asset_return_mean_vector()"
Q
Quleaf 已提交
216
   ]
Q
Quleaf 已提交
217 218 219
  },
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
220
   "metadata": {},
Q
Quleaf 已提交
221 222
   "source": [
    "下面根据设定和计算出来的参数来构建哈密顿量,这里我们设置惩罚参数为可投资的股票数量。"
Q
Quleaf 已提交
223
   ]
Q
Quleaf 已提交
224 225 226
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
227 228 229
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
Q
Quleaf 已提交
230 231 232 233 234
   "source": [
    "q = 0.5  # 风险系数\n",
    "budget = num_assets // 2   # 资金预算\n",
    "penalty = num_assets       # 惩罚参数 \n",
    "hamiltonian = portfolio_optimization_hamiltonian(penalty, mu, s, q, budget)\n"
Q
Quleaf 已提交
235
   ]
Q
Quleaf 已提交
236 237 238
  },
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
239
   "metadata": {},
Q
Quleaf 已提交
240 241 242
   "source": [
    "### 计算损失函数\n",
    "\n",
Q
Quleaf 已提交
243
    "我们使用 $U_3(\\vec{\\theta})$ 和 $\\text{CNOT}$ 门构造的参数化量子电路,通过调用量桨内置的 [`complex_entangled_layer()`](https://qml.baidu.com/api/paddle_quantum.ansatz.circuit.html#Circuit.complex_entangled_layer) 构造实现。该电路会返回一个输出态 $|\\vec{\\theta}\\rangle$,根据该参数便可以计算投资组合优化问题在经典-量子混合模型下损失的函数:\n",
Q
Quleaf 已提交
244 245 246 247 248 249 250
    "\n",
    "$$\n",
    "L(\\vec{\\theta}) =  \\langle\\vec{\\theta}|H_C|\\vec{\\theta}\\rangle.\n",
    "\\tag{4}\n",
    "$$\n",
    "\n",
    "之后我们利用经典的优化算法寻找最优参数 $\\vec{\\theta}^*$。下面的代码给出了通过量桨和飞桨搭建网络的过程。"
Q
Quleaf 已提交
251
   ]
Q
Quleaf 已提交
252 253 254
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
255 256 257
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
Q
Quleaf 已提交
258 259 260
   "source": [
    "class PONet(paddle.nn.Layer):\n",
    "\n",
Q
Quleaf 已提交
261
    "    def __init__(self, num_qubits, p, dtype=\"float64\"):\n",
Q
Quleaf 已提交
262 263
    "        super(PONet, self).__init__()\n",
    "\n",
Q
Quleaf 已提交
264 265 266 267 268
    "        self.depth = p\n",
    "        self.num_qubits = num_qubits\n",
    "        self.cir = Circuit(self.num_qubits)\n",
    "        self.cir.complex_entangled_layer(depth=self.depth)\n",
    "\n",
Q
Quleaf 已提交
269
    "\n",
Q
Quleaf 已提交
270
    "    def forward(self):\n",
Q
Quleaf 已提交
271 272 273
    "        \"\"\"\n",
    "        前向传播\n",
    "        \"\"\"\n",
Q
Quleaf 已提交
274 275
    "        state = self.cir(init_state)\n",
    "        loss = loss_func(state)\n",
Q
Quleaf 已提交
276
    "\n",
Q
Quleaf 已提交
277 278
    "        return loss, self.cir"
   ]
Q
Quleaf 已提交
279 280 281
  },
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
282
   "metadata": {},
Q
Quleaf 已提交
283 284 285 286
   "source": [
    "### 训练量子神经网络\n",
    "\n",
    "定义好了量子神经网络后,我们使用梯度下降的方法来更新其中的参数,使得式(4)的期望值最小。"
Q
Quleaf 已提交
287
   ]
Q
Quleaf 已提交
288 289 290
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
291 292 293
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
Q
Quleaf 已提交
294 295 296 297 298
   "source": [
    "SEED = 1000   # 随机数种子\n",
    "p = 2       # 量子电路的层数\n",
    "ITR = 600    # 迭代次数\n",
    "LR = 0.4     # 梯度下降优化速率 "
Q
Quleaf 已提交
299
   ]
Q
Quleaf 已提交
300 301 302
  },
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
303
   "metadata": {},
Q
Quleaf 已提交
304 305
   "source": [
    "使用飞桨,优化上面定义的网络。"
Q
Quleaf 已提交
306
   ]
Q
Quleaf 已提交
307 308 309
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "循环数: 50     损失: 0.0399189\n",
      "循环数: 100     损失: 0.0098760\n",
      "循环数: 150     损失: 0.0085572\n",
      "循环数: 200     损失: 0.0074596\n",
      "循环数: 250     损失: 0.0066504\n",
      "循环数: 300     损失: 0.0061929\n",
      "循环数: 350     损失: 0.0059874\n",
      "循环数: 400     损失: 0.0059097\n",
      "循环数: 450     损失: 0.0058763\n",
      "循环数: 500     损失: 0.0058761\n",
      "循环数: 550     损失: 0.0058756\n",
      "循环数: 600     损失: 0.0058689\n"
     ]
    }
   ],
Q
Quleaf 已提交
332 333
   "source": [
    "# 比特数量\n",
Q
Quleaf 已提交
334
    "num_qubits = len(mu)\n",
Q
Quleaf 已提交
335 336 337
    "# 固定随机数种子\n",
    "paddle.seed(SEED)\n",
    "# 定义量子神经网络\n",
Q
Quleaf 已提交
338 339 340 341 342
    "net = PONet(num_qubits, p)\n",
    "# 定义初始态\n",
    "init_state = paddle_quantum.state.zero_state(num_qubits)\n",
    "# 定义损失函数\n",
    "loss_func = paddle_quantum.loss.ExpecVal(hamiltonian)\n",
Q
Quleaf 已提交
343 344 345 346 347
    "# 使用 Adam 优化器\n",
    "opt = paddle.optimizer.Adam(learning_rate=LR, parameters=net.parameters())\n",
    "\n",
    "# 梯度下降优循环\n",
    "for itr in range(1, ITR + 1):\n",
Q
Quleaf 已提交
348 349 350
    "    # 运行上面定义的网络\n",
    "    loss, cir = net()\n",
    "    #计算梯度并优化\n",
Q
Quleaf 已提交
351 352 353 354 355 356
    "    loss.backward()\n",
    "    opt.minimize(loss)\n",
    "    opt.clear_grad()\n",
    "    if itr % 50 == 0:\n",
    "        print(\"循环数:\", itr,\"    损失:\", \"%.7f\"% loss.numpy())\n",
    "        "
Q
Quleaf 已提交
357
   ]
Q
Quleaf 已提交
358 359 360
  },
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
361
   "metadata": {},
Q
Quleaf 已提交
362 363 364 365
   "source": [
    "### 理论最小损失值\n",
    "\n",
    "理论 $C_x$ 的最小值对应的是我们所构建的哈密顿量的最小特征值。所以我们希望参数化电路优化的损失函数的值接近理论最小值。对于小一点的 ``num_assets``,我们可以根据以下代码进行验证。"
Q
Quleaf 已提交
366
   ]
Q
Quleaf 已提交
367 368 369
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
370 371
   "execution_count": 21,
   "metadata": {},
Q
Quleaf 已提交
372 373 374
   "outputs": [
    {
     "name": "stdout",
Q
Quleaf 已提交
375
     "output_type": "stream",
Q
Quleaf 已提交
376
     "text": [
Q
Quleaf 已提交
377 378
      "理论最小损失值: 0.0058722496\n",
      "实际最小损失值: 0.0058689117431640625\n"
Q
Quleaf 已提交
379 380 381
     ]
    }
   ],
Q
Quleaf 已提交
382 383 384 385 386
   "source": [
    "H_C_matrix = hamiltonian.construct_h_matrix()\n",
    "print(\"理论最小损失值:\", np.linalg.eigvalsh(H_C_matrix)[0])   \n",
    "print(\"实际最小损失值:\", float(loss.numpy()))"
   ]
Q
Quleaf 已提交
387 388 389
  },
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
390
   "metadata": {},
Q
Quleaf 已提交
391 392
   "source": [
    "在这个例子中,上面参数化电路优化出来的的最小损失和理论最小损失是非常接近的,这代表着我们之后给出的投资方案是最优的。如果两个值不太吻合,可以通过改变随机种子 `SEED`,量子电路的层数 `p`,迭代次数 `ITR` 和梯度下降优化速率 `LR` 等参数重新计算。 "
Q
Quleaf 已提交
393
   ]
Q
Quleaf 已提交
394 395 396
  },
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
397
   "metadata": {},
Q
Quleaf 已提交
398 399 400 401 402 403 404 405 406 407 408 409 410
   "source": [
    "### 解码量子答案\n",
    "\n",
    "当调用优化器求得损失函数的最小值以及相对应的一组参数 $\\vec{\\theta}^*$后,为了进一步求得投资组合优化问题的近似解,需要从电路输出的量子态 $|\\vec{\\theta}^*\\rangle$ 中解码出经典优化问题的答案。物理上,解码量子态需要对量子态进行测量,然后统计测量结果的概率分布:\n",
    "\n",
    "$$\n",
    "p(z) = |\\langle z|\\vec{\\theta}^*\\rangle|^2.\n",
    "\\tag{5}\n",
    "$$\n",
    "\n",
    "在量子参数化电路表达能力足够的情况下,某个比特串出现的概率越大,意味着其是投资组合优化问题最优解的可能性越大。\n",
    "\n",
    "量桨提供了查看参数化量子电路输出状态的测量结果概率分布的函数。\n"
Q
Quleaf 已提交
411
   ]
Q
Quleaf 已提交
412 413 414
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
415 416
   "execution_count": 22,
   "metadata": {},
Q
Quleaf 已提交
417 418 419
   "outputs": [
    {
     "name": "stdout",
Q
Quleaf 已提交
420
     "output_type": "stream",
Q
Quleaf 已提交
421 422 423 424 425
     "text": [
      "利用哈密顿量找到的解的比特串形式: 0100110\n"
     ]
    }
   ],
Q
Quleaf 已提交
426 427 428 429 430 431 432
   "source": [
    "# 模拟重复测量电路输出态 2048 次\n",
    "final_state = cir(init_state)\n",
    "prob_measure = final_state.measure(shots=2048)\n",
    "investment = max(prob_measure, key=prob_measure.get)\n",
    "print(\"利用哈密顿量找到的解的比特串形式:\",investment)"
   ]
Q
Quleaf 已提交
433 434 435
  },
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
436
   "metadata": {},
Q
Quleaf 已提交
437 438
   "source": [
    "我们的测量结果是表示投资组合优化问题答案的比特串:字符串中该位置为 $1$,表示该笔资产被选定投资。如上面的结果 `0100110` 就表示在可选的 $7$ 支可投资的项目中,选择了第二、第五、第六三支股票。同时,字符串中 $1$ 的数量应该和预算数相同。如果最后的情况不是这样,读者依然可以通过调整参数化量子电路的参数值或参数化量子电路的结构来获得更好的训练效果。"
Q
Quleaf 已提交
439
   ]
Q
Quleaf 已提交
440 441 442
  },
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
443
   "metadata": {},
Q
Quleaf 已提交
444 445 446 447
   "source": [
    "### 结语\n",
    "\n",
    "本教程中,投资组合优化问题的最优解是在均值-方差组合优化方法基础上通过变分量子本征求解器(Variational Quantum Eigensolver, VQE)近似得到的。在给定投资预算和可投资项目信息以及投资风险的基础上,通过计算投资项目的回报率以及各投资项目回报率之间的协方差矩阵,应用参数化量子电路寻找最优的投资组合。"
Q
Quleaf 已提交
448
   ]
Q
Quleaf 已提交
449 450 451
  },
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
452
   "metadata": {},
Q
Quleaf 已提交
453 454 455 456 457 458 459 460 461 462
   "source": [
    "_______\n",
    "\n",
    "## 参考文献\n",
    "\n",
    "[1] Orus, Roman, Samuel Mugel, and Enrique Lizaso. \"Quantum computing for finance: Overview and prospects.\" [Reviews in Physics 4 (2019): 100028.](https://arxiv.org/abs/1807.03890)\n",
    "\n",
    "[2] Egger, Daniel J., et al. \"Quantum computing for Finance: state of the art and future prospects.\" [IEEE Transactions on Quantum Engineering (2020).](https://arxiv.org/abs/2006.14510)\n",
    "\n",
    "[3] Markowitz, H.M. (March 1952). \"Portfolio Selection\". [The Journal of Finance. 7 (1): 77–91. doi:10.2307/2975974. JSTOR 2975974.](https://www.jstor.org/stable/2975974)"
Q
Quleaf 已提交
463
   ]
Q
Quleaf 已提交
464 465 466 467 468 469 470
  }
 ],
 "metadata": {
  "interpreter": {
   "hash": "3b61f83e8397e1c9fcea57a3d9915794102e67724879b24295f8014f41a14d85"
  },
  "kernelspec": {
Q
Quleaf 已提交
471
   "display_name": "Python 3 (ipykernel)",
Q
Quleaf 已提交
472 473 474 475 476 477 478 479 480 481 482 483 484
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
Q
Quleaf 已提交
485
   "version": "3.9.7"
Q
Quleaf 已提交
486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
Q
Quleaf 已提交
503
}