量子退火Python实战(3):投资组合优化(Portfolio) MathorCup2023特供PyQUBO教程
文章目录
- 前言
- 一、什么是投资组合优化?
- 二、投资组合优化建模
- 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的例子。
量子退火Python实战(3):投资组合优化(Portfolio) MathorCup2023特供PyQUBO教程相关推荐
- 量子退火Python实战(2):护士调度问题(NSP : Nurse Scheduling Problem)
文章目录 前言:关于调度问题(Scheduling Problem) 一.护士调度问题(NSP)的QUBO建模 1.目标变量 2.约束条件定义 3.[约束a]的补充说明 4.[约束c]的补充说明 二. ...
- Python--【研究】如何用python实现Markowitz投资组合优化
来源:https://zhuanlan.zhihu.com/p/20604930?refer=quantstory 多股票策略回测时常常遇到问题. 仓位如何分配? 你以为基金经理都是一拍脑袋就等分仓位 ...
- 整理了200多个Python实战案例,都有完整且详细的教程
不管是学习什么语言,最终目的都是做项目.搜遍全网,整理了200多个Python实战的小项目,都有完整的代码,以及代码中用到的数据源等等.可以直接拿来用,也可以用于学习练手寻找思路. 告别枯燥,60秒学 ...
- 量子退火?这又是啥?居然撑起了第一家量子计算公司
组合优化问题,在应用数学和理论计算机科学领域,指的是在一个有限的对象里集中找出最优对象的一类课题.这类问题特征是可行解的集是离散或者可以简化到离散结果,并且目标是要找到最优解.当前,常见的组合优化问题 ...
- 《量化金融R语言初级教程》一第2章 投资组合优化
本节书摘来异步社区<量化金融R语言初级教程>一书中的第2章,作者: [匈牙利]Gergely Daróczi(盖尔盖伊) , 等 译者: 高蓉 , 李茂 责编: 胡俊英,更多章节内容可以访 ...
- python有效边界_Markowitz有效边界和投资组合优化基于Python(附代码)
原标题:Markowitz有效边界和投资组合优化基于Python(附代码) 本期作者:Bernard Brenyah 本期翻译:Barry 未经授权,严禁转载 哈里马科维茨对金融和经济学的世界的贡献是 ...
- python n个list如何组成矩阵_如何用马科维茨投资组合优化法和现代资产组合理论生成交易策略?...
全文共6852字,预计学习时长14分钟 图源:pixabay 本文旨在展示如何用马科维茨(Markowitz)的投资组合优化法和现代资产组合理论(MPT)来生成交易策略. 本文首先对均值-方差优化法进 ...
- 利用Python进行「基金投资组合优化」(一)
文章目录 引言 主要思路 投资组合 现代投资组合理论(MPT) 波动率 协方差 权重分配 投资组合期望回报 投资组合方差 代码实践 获取基金净值的变化情况 计算基金的波动率 比较基金之间的相关性 计算 ...
- 利用python构建马科维茨_使用CVXOPT包实现马科维茨投资组合优化
在真实股票市场的回测 上面的例子特别有趣但不是很适用. 接下来,我们将演示如何在BigQuant中创建一个策略. 本实验的目的是验证在一个买入固定5只股票的多头组合,利用马科维茨组合优化确定的投资组合 ...
最新文章
- v-for遍历数组 || v-for遍历对象
- tensorflow的tf.transpose()简单使用
- myeclipse 项目右键没有svn_新建SVN仓库并上传项目
- android开启服务器配置,Android基于XMPP开发(一)【openfire服务器配置】
- 关于SDN的未来,Linux基金会专访阿里云网络大神
- Spring Boot 集成 Elasticsearch 实战
- ui kit模板的用途是什么?
- springboot jar包部署_Spring Boot项目基于Jar部署和打包详解教程
- 修改JSONArray里所有key的值
- maven学习二(dependencies)
- 大气辐射示意简单图_地理笔记 | N21 自然地理——大气的组成与垂直分层
- iOS中Lua脚本应用笔记一:脚本概念相关
- 《System语言详解》——3. SystemTap脚本的各大组件
- 200套IT电子类数码产品行业响应式html5模板电器销售企业网站模板服装服饰购物电商网站模板鞋子电子商务html网站模板html5网页静态模板Bootstrap扁平化网站源码css3手机seo自适响
- java毕业设计C语言教学辅导网站Mybatis+系统+数据库+调试部署
- 2016-2017 ACM-ICPC CHINA-Final F. Mr. Panda and Fantastic Beasts(后缀数组的两种解法)
- 【深入理解数据库原理】原理
- 阿拉伯数字转换英文,适用于英文合同和国际贸易单证
- 细节--Java必须先创建文件夹再创建文件
- BACnet协议读取与发送
热门文章
- 科学研究机构管理系统
- Solr - Server
- 【正点原子I.MX6U-MINI】修改开机内核Logo和进度条界面Logo(一)
- 前端页面 原生php+H5 视频播放一 专辑列表页(专辑页list)
- 【Day12-Stream流Map集合】
- 判断一个多边形是否是凸多边形
- vue中安装和使用Dplayer视频播放器
- 2020年9月23日 晴(补2020年9月22日 晴)
- email邮箱登陆验证实例
- Java项目:智能点餐推荐系统(java+SSM+JSP+BootStrap+Mysql)