量子退火Python实战(3):投资组合优化(Portfolio) MathorCup2023特供PyQUBO教程

news/2024/11/20 21:23:20/

文章目录

  • 前言
  • 一、什么是投资组合优化?
  • 二、投资组合优化建模
    • 1. 目标函数:回报
    • 2.约束函数:风险
    • 3.最终优化目标函数
  • 三、基于PyQUBO实现
    • 1. 获取数据
    • 2. 数据处理
    • 3. 目标函数PyQUBO实现
    • 4. OpenJij实施优化
  • 总结


前言

提示:包含pyQUBO用法:

最近MathorCup2023的A题刚好是投资组合的QUBO建模,刚好有篇日文文章是讲这个的,直接翻译过来。供大家参考。【因为还没有获得作者同意,暂且没有把文章设置为翻译,之后会设置成翻译,或者再加一下自己的东西变成原创。】

《量子アニーリングを用いたポートフォリオ最適化 – 量子アニーリングソリューションコンテスト》
https://qard.is.tohoku.ac.jp/T-Wave/?p=1987

一、什么是投资组合优化?

  • 什么是投资组合优化?

投资组合优化是在考虑风险和收益的情况下寻找资产(投资组合)的最佳组合。投资组合优化有多种理论,但这次我们基于现代投资组合理论进行投资组合优化。

  • 什么是现代投资组合理论?

这是对现代投资组合理论(又名现代投资理论)的描述。

它基于美国哈里·马科维茨于 1950 年代建立的多元化投资理论。为了在资产管理中期望一定的回报同时抑制价格波动风险,将大量股票和多种资产分散投资为一个投资组合是有效的。除了价格波动风险及其包含率外,它由表示任何两个问题之间价格变动的连贯性的相关系数决定。他因在投资理论方面的开创性工作而获得 1990 年诺贝尔经济学奖。

然而,该理论建立在不切实际的假设之上,例如假设股票的价格波动风险从过去到未来都不会发生变化。为此,2008年雷曼震荡后,众多金融资产之间的相关系数增加,同时价格波动的风险也增加,也有人指出该理论的局限性,认为有局限性。

二、投资组合优化建模

1. 目标函数:回报

最大化回报和最小化风险(协方差)被视为最佳投资组合措施。
代表收益回报的目标函数如下:

在这里插入图片描述

2.约束函数:风险

在这里插入图片描述

3.最终优化目标函数

上面两个函数相加就是最终优化的目标函数。
在这里插入图片描述
系数A应根据重点是最大化回报还是最小化风险来调整。

三、基于PyQUBO实现

1. 获取数据

首先,使用pandas_datareader 从yahoo finance 获取股价数据。
这一次,我们将使用具有代表性的美国股票指数 DOW30 指数中包含的 30 只股票的 2018 年数据来优化投资组合。

import pandas_datareader.data as web
import datetimestart = datetime.datetime(2018, 1, 2)
end = datetime.datetime(2018, 12, 31)
DOW30 = ['AAPL','AMGN','AXP','BA','CAT','CRM','CSCO','CVX','DIS','GS','HD','HON', 'IBM','INTC','JNJ','JPM','KO','MCD','MMM','MRK','MSFT','NKE', 'PG','TRV','UNH','V','VZ','WBA','WMT']
stockcodes = DOW30+DOW30data = web.DataReader(DOW30, 'yahoo', start, end)
df_price_DOW30 = data['Adj Close']

2. 数据处理

从前面得到的股价数据中,求出每只股票每天的几何平均收益和协方差矩阵。

  • 补充(什么是几何平均数?)
    在这里插入图片描述
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats.mstats import gmean df_price0 = pd.merge(df_price, df_price, on='Date')
rates = []for sc in stockcodes:df = df_price.loc[:,sc]return_rate = np.zeros(len(df.values))for k in range(len(df.values)-1):return_rate[k+1] = (df[k+1] - df[k])/df[k]rates.append(return_rate)N = len(stockcodes)list_price_start = np.zeros(N)
for n in range(N):list_price_start[n] = df_price.loc['2018-01-02',stockcodes][n]list_price_end = np.zeros(N)
for n in range(N):list_price_end[n] = df_price.loc['2018-12-31',stockcodes][n]#求几何平均w1
for k in range(N):for n in range(len(rates[1])):rates[k][n] = rates[k][n]+1w_1 = np.zeros(N)
for k in range(N):w_1[k] = gmean(rates[k])w = np.zeros(N)
for n in range(N):w[n] = w_1[n]-1for k in range(N):for n in range(len(rates[1])):rates[k][n] = rates[k][n]-1

3. 目标函数PyQUBO实现

根据之前获得的每只股票的每日几何平均收益和协方差矩阵,准备使用 PyQUBO 进行优化的目标函数。


from pyqubo import Array, Constraint, Placeholder, solve_qubox = Array.create('x', shape=N, vartype='BINARY')# 二值变量K = 1000 #投资额
constr = (((np.dot(x,list_price_start))-0.9*K)/10)**2 #预算约束#回报部分的目标函数
cost = 0
for i in range(N):cost = cost - w[i]*x[i]
#风险部分的约束函数
cost2 = 0
for i in range(N):for j in range(N):cost2 = cost2 +x[i]*x[j]*np.sum((rates[i]-w[i])*(rates[j]-w[j]))/len(rates[i])
#整体的目标函数
cost_func = 2*cost + cost2 + Placeholder('a')*Constraint(constr, label='Kconstr') 
model = cost_func.compile()
max_coeff = np.max(abs(w))#调整约束强度
feed_dict = {'a': 17.0*max_coeff}
qubo, offset = model.to_qubo(feed_dict=feed_dict)

4. OpenJij实施优化

这一次,我们将使用 SQA(模拟量子退火)库 OpenJij 来执行优化。

from openjij import SQASampler
sampler = SQASampler(num_sweeps=3000)
R = 300
sampleset = sampler.sample_qubo(qubo,num_reads=R)
print(sampleset.record)

最终原文还有很多可视化分析,大家用Google翻译,边翻边看吧。

总结

  • 成本最低的投资组合并未显示出稳定的结果,但频率评估的投资组合始终优于 Dow30指数。
  • 即使应用于不同年份的数据,频率评级的投资组合也匹配或优于Dow30 指数。
  • 当应用于另一年的数据时,它很少被 Dow30Index 显着击败。

这个文章整体比较简单,主要是给大家提供个PyQUBO的例子。


http://www.ppmy.cn/news/63413.html

相关文章

压电雨量传感器工作原理介绍

传感器采用冲击测量原理对单个雨滴重量进行测算,进而计算降雨量。雨滴在降落过程中受到雨滴重量和空气阻力的作用,到达地面时速度为恒定速度,根据Pmv,测量冲击即可求出雨滴重量,进而得到持续降雨量。 1、功能特点 ◆全…

Python代码实现一个简单的猜数字游戏

以下是一个简单的猜数字游戏的Python代码: import random print("欢迎来到猜数字游戏!") print("我已经想好了一个1到100之间的数字。") number random.randint(1, 100) guess 0 tries 0 while guess ! number: guess int(i…

STM32库函数笔记分享

之前刚开始自学的部分STM32笔记放出,希望对新入门STM32和想要复习库函数的小伙伴们起到帮助。 建立工程 1.寄存器操作方式 需要不断地查手册来了解每一位是干什么用的 优点:代码简介; 缺点:不太方便。 2.库函数操作方式 1.调用库函…

国网项目入场安规考试题库

考题内容选项A选项B选项C选项D正确答案备注在下水道、煤气管线、潮湿地、垃圾堆或有腐质物等附近挖坑,在挖深超过()m的坑内工作时,应采取安全措施,如戴防毒面具、向坑中送风和持续检测等。2.02.533.5A下水道2m在双电源和有自备电源…

YOLO(你只需看一眼)技术通讲(基于论文与开源代码)

YOLO通讲 前言YOLO v1论文及项目地址介绍模型架构统一检测边界框的置信度类置信度 网络设计训练 模型局限总结 YOLO v2模型改进正则化批处理使用高分辨率分类器卷积化锚盒维度聚类 前言 YOLO作为现在目标检测技术中较为基础且流行的技术之一。本文将以开源者的论文与模型为基础…

git clean 的使用

1:场景就是不知道哪里来的? git status 的时候出现了这个玩意 .System.putIntForUser(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, 254, UserHandle.USER_CURRENT);import android.os.UserHandle; rm -rf XXXX 又报错说找不到在哪里 …

[漏洞分析] 用chatGPT分析CVE-2023-0386 overlay内核提权

文章目录 漏洞简介环境搭建漏洞原理补丁分析命名空间用户命名空间 overlay文件系统原理创建一个overlay文件系统 漏洞触发逻辑 漏洞利用fuse文件系统漏洞利用touch命令冷知识exp 总结参考 本文的理论知识(命名空间、overlay文件系统、fuse文件系统等)均来…

【NodeJs】使用Express框架快速搭建一个web网站

如果电脑有安装使用Nodejs,用得次数少的话,忘了怎么弄,可以看看这个文章,按照步骤,能快速搭建一个web网站服务器, 首先,你需要保证电脑系统有安装了Node.js,然后可以用VsCode开发工…