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

news2025/1/18 17:16:38

文章目录

  • 前言
  • 一、什么是投资组合优化?
  • 二、投资组合优化建模
    • 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 datetime

start = 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+DOW30

data = 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]+1

w_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]-1

for 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_qubo

x = 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.coloradmin.cn/o/422730.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

硬件语言Verilog HDL牛客刷题day11 A里部分 和 Z兴部分

1.VL72 全加器 1.题目: ① 请用题目提供的半加器实现全加器电路① 半加器的参考代码如下,可在答案中添加并例化此代码。 2. 解题思路 (可以看代码) 2.1 先看 半加器 s 是加位 , C 是进位。 2.2 再看全加器 …

2023年新手如何选择云服务器配置来部署自己的网站?

现在做网站的人越来越少了,没有以前那种百万网站站长的势头。但是,不论个人站长还是企业,只要网上开展业务其实都会需要自己网站或小程序、APP等平台。如今,很少有人使用虚拟主机,但是独立服务器成本高,一般…

【2023】Kubernetes-网络原理

目录kubernetes网络模型kubernetes网络实现容器到容器之间通信Pod之间的通信Pod到Service之间的通信集群内部与外部组件之间的通信开源容器网络方案FlannelCalicokubernetes网络模型 Kubernetes网络模型设计的一个基础原则是:每个Pod都拥有一个独立的IP地址&#x…

异地远程访问本地SQL Server数据库【无公网IP内网穿透】

文章目录1.前言2.本地安装和设置SQL Server2.1 SQL Server下载2.2 SQL Server本地连接测试2.3 Cpolar内网穿透的下载和安装2.3 Cpolar内网穿透的注册3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置4.公网访问测试5.结语转发自CSDN远程穿透的文章:无需公网IP&a…

哪吒探针 - Windows 和Linux端agent安装(详细注意版)

一、Windows端agent安装配置 环境准备 环境: Windows 服务器软件:哪吒探针点击下载、nssm 点击下载(探针agent和nssm都要下载准备好) 设置环境变量下载软件后,解压到任意位置,然后按 winR 打开运行窗口,输入 sysdm.cpl 打开系统属性–>高级…

基于GIS/SCADA的智慧燃气数字孪生Web3D可视化系统

在低碳经济快速发展的今天,天然气在我国能源结构的占比逐年提高,安全供气成为关乎民生福祉、经济发展和社会和谐的大事。 自我国开展燃气铺设以来,经过长期运营的家用燃气和工业燃气设备管道设施设备基础差、检维修难度大,且传统燃…

[Java Web]会话跟踪技术

⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章 ⭐作者主页:逐梦苍穹 ⭐所属专栏:Java Web 目录1、会话跟踪技术概述2、数据共享3、Cookie4、Session5、Cookie和Session的区别6、总结1、会话跟踪…

大数据应用——Hadoop运行模式(伪分布式运行)

4.2 伪分布式运行模式4.2.1 启动HDFS并运行MapReduce程序1. 分析 (1)配置集群(2)启动、测试集群增、删、查没有改(多台机子麻烦)(3)执行WordCount案例2. 执行步骤(1&…

NestJS:TypeORM 连接mysql数据库,增删改查

一、安装数据库相关模块 pnpm add nestjs/typeorm typeorm mysql package.json 二、navicat创建nestjs_base数据库,创建products数据表,添加记录 创建nestjs数据库,创建products数据表 navicat:连接MySQL,创建库、表…

【GPT4】微软 GPT-4 测试报告(1)总体介绍

欢迎关注【youcans的AGI学习笔记】原创作品,火热更新中 微软 GPT-4 测试报告(1)总体介绍 微软 GPT-4 测试报告(2)多模态与跨学科能力 微软 GPT-4 测试报告(3)编程能力 微软 GPT-4 测试报告&…

腾讯云SSL证书格式类型及服务器支持说明

腾讯云SSL证书支持服务器类型有Tomcat、Apache、Nginx、IIS等,SSL证书格式包括crt、key、pfx、JKS、pem等格式,腾讯云百科整理了腾讯云SSL证书支持服务器类型格式对照表: 腾讯云SSL证书格式和服务器支持对照表 腾讯云SSL证书格式和服务器支持…

数据库系统工程师——第三章 数据结构与算法

文章目录📂 第三章、数据结构与算法 📁 3.1 线性结构 📖 3.1.1 线性表 📖 3.1.2 栈和队列 📖 3.1.3 串 📁 3.2 数组和矩阵 📁 3.3 树和图 📖 3.3.1 树 📖 3.3.2 图 &…

QCustomPlot实现极坐标图——QtWidgets

前言 前面用QtChart实现了极坐标图,感觉不是很方便,特别是一些点的图形,一般需要自己绘制,而QCustomPlot自带挺多的;还有极坐标的角度轴(即 圆圈),相比起来,QCustomPlot…

HTML+CSS+JS 学习笔记(一)———HTML(上)

🌱博客主页:大寄一场. 🌱系列专栏:前端 😘博客制作不易欢迎各位👍点赞⭐收藏➕关注 目录 代码开发工具 概念 HTML模板 body元素的常用属性 HTML 控制标记(标签)的类型 HTML语法…

数据库系统概论(第五版) 王珊 第四章 课后习题答案

目录 (一)数据库安全性の概念 1. 什么是数据库的安全性 2.数据库安全性和计算机系统的安全性有什么关系? 4.试述实现数据库安全性控制的常用方法和技术 5.什么是数据库中的自主存取控制方法和强制存取控制方法? (二)考试…

FMCW激光雷达,未来已来

2021年1月,一家名为Avea的激光雷达初创公司,与日本电装宣布达成合作协议,双方将共同推进FMCW(调频连续波)激光雷达的量产,目标是满足大众市场的需求。 众所周知,目前,大多数车载激光…

简单明了的说明STM32的PWM原理以及实现方法

申明以下都是个人理解,仅供参考。如果错误欢迎指教。本文不讲底层,根据实际使用来逆向讲解。 1.什么是pwm? pwm最简单的理解就是“功率”,调节PWM的占空比就是调节功率。 2.如何调节占空比? 图1 根据图1很容易看出…

3d坦克大战

文章目录一、 介绍二、 导入美术资源、调节光亮三、 坦克脚本四、 添加坦克移动效果、挂载脚本五、 制作子弹预制体、脚本六、 子弹发射点、发射子弹脚本七、 坦克血量脚本八、 设置相机视角九、 设置环形滑动条,表示hp十、 下载素材包一、 介绍 有两种模式&#x…

计网第五章.运输层—TCP报文的首部

以下来自湖科大计算机网络公开课笔记及个人所搜集资料 TCP报文格式如下: 那6个标志位对应的中文名: 下面是按TCP首部的顺序介绍各个字段: 源端口和目的端口分别是表示发送TCP报文段的应用进程。从网络编程角度,进程里创建sock…

01.容器接口BeanFactory和ApplicationContext

容器接口BeanFactory和ApplicationContext BeanFactory能做哪些事ApplicationContext有哪些扩展功能事件解耦 重点 到底什么是BeanFactory 它是 ApplicationContext 的父接口它才是 Spring 的核心容器, 主要的 ApplicationContext 实现都【组合】了它的功能 BeanFactory 能干点…