JQData | 基于JQData的有效前沿及投资组合优化

2023-10-13 04:48

本文主要是介绍JQData | 基于JQData的有效前沿及投资组合优化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

基于JQData的有效前沿组合及投资组合优化

转自 https://www.joinquant.com/community/post/detailMobile?postId=15331&page=&limit=20&replyId=&tag=

(1)现代资产组合理论(MTP)是关于在特定风险水平下投资者(风险厌恶)如何构建组合来最大化期望收益的理论,这一理论最基本的原则是投资者可以构建投资组合的有效集合,即有效前沿,有效前沿可以在特定风险水平下使期望收益最大化;
(2)资产的风险一般使用资产回报的波动方差来表示,在回报和风险相权衡的时候,根据资本资产定价模型(CAPM)一般使用夏普率来评估风险回报比,来衡量特定风险下投资收益的表现,希望在尽可能小的风险下获得最大的回报;
(3)下面介绍通过JQData及Monte Carlo模拟来建立有效前沿组合,然后找出最优组合和有着最低波动率的组合。

1 通过JQData获取数据

# 导入所需的python库
import jqdatasdk as jq
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt# JQData认证
jq.auth('注册手机号', '密码')# 设置起止时间及股票池
start_date = '2018-01-01'
end_date = '2018-11-16'
security_list = ['513100.XSHG', '518800.XSHG', '163407.XSHE', '159926.XSHE']# 获取数据
stocks_price = jq.get_price(security_list, start_date=start_date, end_date=end_date, fields=['close'])['close']
stocks_price.head()
auth success

.dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }

 513100.XSHG518800.XSHG163407.XSHE159926.XSHE
2018-01-022.2182.7301.889105.0
2018-01-032.2482.7351.915105.0
2018-01-042.2562.7291.904105.0
2018-01-052.2502.7401.892105.0
2018-01-082.2682.7401.881105.0

2 通过Monte Carlo模拟产生有效前沿组合,并找出最优组合和有着最低波动率的组合

通过Monte Carlo模拟50000个不同权重的投资组合产生的不同期望收益和期望波动率并绘图。有效前沿上的每个点代表了股票的一个最优组合,最优组合在特定的风险水平下最大化了期望收益率。

# 通过Monte Carlo模拟产生有效前沿组合returns_daily = stocks_price.pct_change()
returns_annual = returns_daily.mean() * 250cov_daily = returns_daily.cov()
cov_annual = cov_daily * 250port_returns = []
port_volatility = []
sharpe_ratio = []
stock_weights = []num_assets = len(security_list)
num_portfolios = 50000np.random.seed(101)for single_portfolio in range(num_portfolios):weights = np.random.random(num_assets)weights /= np.sum(weights)returns = np.dot(weights, returns_annual)volatility = np.sqrt(np.dot(weights.T, np.dot(cov_annual, weights)))sharpe = returns / volatilitysharpe_ratio.append(sharpe)port_returns.append(returns)port_volatility.append(volatility)stock_weights.append(weights)portfolio = {'Returns': port_returns,'Volatility': port_volatility,'Sharpe Ratio': sharpe_ratio}for counter,symbol in enumerate(security_list):portfolio[symbol+' Weight'] = [Weight[counter] for Weight in stock_weights]df = pd.DataFrame(portfolio)
column_order = ['Returns', 'Volatility', 'Sharpe Ratio'] + [stock+' Weight' for stock in security_list]
df = df[column_order]
df.head()

.dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }

 ReturnsVolatilitySharpe Ratio513100.XSHG Weight518800.XSHG Weight163407.XSHE Weight159926.XSHE Weight
00.0597160.0927750.6436610.4012230.4433880.0221230.133266
10.0383460.0885530.4330240.2519630.3066080.1128650.328564
20.0249500.1213620.2055840.3969230.1044860.3048820.193709
3-0.0556610.092769-0.6000040.0840020.3628090.4458830.107306
4-0.0546880.089040-0.6141920.0493760.3566350.4307600.163229
# 将投资组合绘制出来plt.style.use('ggplot')
df.plot.scatter(x='Volatility', y='Returns', c='Sharpe Ratio',cmap='autumn', edgecolors='black', figsize=(15, 9), grid=True)
plt.xlabel('Volatility (Std. Deviation)')
plt.ylabel('Expected Returns')
plt.title('Efficient Frontier')
plt.show()

# 找出最优组合和有着最低波动率的组合min_volatility = df['Volatility'].min()
max_sharpe = df['Sharpe Ratio'].max()sharpe_portfolio = df.loc[df['Sharpe Ratio'] == max_sharpe]
min_variance_port = df.loc[df['Volatility'] == min_volatility]plt.style.use('ggplot')
df.plot.scatter(x='Volatility', y='Returns', c='Sharpe Ratio',cmap='autumn', edgecolors='black', figsize=(15, 9), grid=True)
plt.scatter(x=sharpe_portfolio['Volatility'], y=sharpe_portfolio['Returns'], c='yellow', marker='D', s=200)
plt.scatter(x=min_variance_port['Volatility'], y=min_variance_port['Returns'], c='red', marker='D', s=200 )
plt.xlabel('Volatility (Std. Deviation)')
plt.ylabel('Expected Returns')
plt.title('Efficient Frontier')
plt.show()

# 接下来输出这两个特殊组合的具体信息:pd.concat([min_variance_port.T, sharpe_portfolio.T], axis=1)

.dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }

 119517048
Returns-0.0095420.119439
Volatility0.0563540.148343
Sharpe Ratio-0.1693160.805155
513100.XSHG Weight0.0820410.616620
518800.XSHG Weight0.7630130.014128
163407.XSHE Weight0.0867620.002443
159926.XSHE Weight0.0681840.366809

结果说明:
(1)风险厌恶最严重的投资者将会选择最小方差组合,它的期望收益率是-0.95%,期望波动率是5.63%;
(2)追求最大风险调整收益率的投资者将会构建有着最大夏普比率的投资组合,它的期望收益率是11.94%,期望波动率是14.83%。

3 结论

本文使用JQData获取股票数据,参考一系列的文章,通过Monte Carlo模拟产生有效前沿组合,并找出最优组合和有着最低波动率的组合。感谢,参考链接如下。

4 参考链接

JQData的教程及API
JQData的安装方法
CAPM 模型和公式
均值方差模型在投资组合中的简单应用
基于Markowitz的量化投资策略
Markowitz有效边界和投资组合优化基于Python

这篇关于JQData | 基于JQData的有效前沿及投资组合优化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/200860

相关文章

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

MySQL不使用子查询的原因及优化案例

《MySQL不使用子查询的原因及优化案例》对于mysql,不推荐使用子查询,效率太差,执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,本文给大家... 目录不推荐使用子查询和JOIN的原因解决方案优化案例案例1:查询所有有库存的商品信息案例2:使用EX

MySQL中my.ini文件的基础配置和优化配置方式

《MySQL中my.ini文件的基础配置和优化配置方式》文章讨论了数据库异步同步的优化思路,包括三个主要方面:幂等性、时序和延迟,作者还分享了MySQL配置文件的优化经验,并鼓励读者提供支持... 目录mysql my.ini文件的配置和优化配置优化思路MySQL配置文件优化总结MySQL my.ini文件

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

hdu4869(逆元+求组合数)

//输入n,m,n表示翻牌的次数,m表示牌的数目,求经过n次操作后共有几种状态#include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#includ