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

本文通过JQData获取股票数据,运用MonteCarlo模拟建立有效前沿组合,找出风险最小与收益最大化的投资组合,展示如何在特定风险水平下最大化期望收益。

基于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() * 250

cov_daily = returns_daily.cov()
cov_annual = cov_daily * 250

port_returns = []
port_volatility = []
sharpe_ratio = []
stock_weights = []

num_assets = len(security_list)
num_portfolios = 50000

np.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 / volatility
   sharpe_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

<think>好的,我现在需要帮助用户解决如何安装jqdata库的问题。用户提到想查找jqdata的安装方法或解决安装问题,所以我的回答应该详细覆盖安装步骤和常见问题的解决方法。首先,我要回顾提供的引用内容,确保信息准确。 引用[1]提到可以使用pip安装,或者下载高校版一键安装,特别是针对Windows用户。引用[2]指出手动安装时可能需要单独安装某些包,比如sqlalchemy,并指定版本和镜像源。引用[3]则说明了更新JQData的方法,使用git命令。引用[4]强调安装后的认证步骤,需要用户名和密码。 接下来,我需要组织步骤,分为常规安装、Windows用户的一键安装、手动处理依赖问题和验证安装是否成功。每个步骤都要清晰,给出具体的命令,比如pip install jqdatasdk,以及可能用到的镜像源如清华或阿里云。对于常见错误,比如依赖包版本冲突,要提到单独安装指定版本的包,比如sqlalchemy==1.2.8。 同时,安装后的认证步骤不能遗漏,需要提醒用户替换成自己的账号密码。可能还需要提到更新JQData的方法,方便用户以后使用。另外,考虑到用户可能遇到的网络问题,建议使用国内镜像加速下载。 需要检查是否有遗漏的部分,比如是否需要管理员权限运行命令行,或者Python环境是否正确。此外,引用中的高校版安装链接可能需要确认是否有效,但用户可能无法点击,所以描述要准确。最后,生成相关问题,帮助用户扩展了解,比如版本升级、认证失败处理、数据获取方法等。 确保回答结构清晰,分步骤说明,使用代码块展示命令,符合用户的系统级指令要求,如正确使用$$格式,但这里主要是代码块,所以用三个反引号包裹。同时,回答使用中文,自然引用相关的引用标记,如[^1][^2][^3][^4],并正确对应到各个步骤中。最后的问题部分要覆盖安装后的常见问题和使用场景,帮助用户进一步解决问题。</think>### 分步安装JQData教程(附常见问题解决) #### 一、常规安装方法(推荐) 1. **通过pip安装**(需提前配置Python环境) ```bash pip install jqdatasdk -i https://pypi.tuna.tsinghua.edu.cn/simple ``` *注:使用清华镜像源加速下载[^3]* 2. **Windows用户一键安装**(无需配置Python环境) - 下载高校版安装包[点击查看一键安装教程](https://www.joinquant.com/help/api/help?name=JQData#JQData%E9%AB%98%E6%A0%A1%E7%89%88) [^1] - 安装后自动创建独立Python环境 #### 二、手动处理依赖问题 若安装报错`sqlalchemy`等包版本冲突: ```bash pip install sqlalchemy==1.2.8 -i https://mirrors.aliyun.com/pypi/simple/ [^2] ``` #### 三、验证安装 ```python import jqdatasdk jqdatasdk.auth('您的账号', '密码') # 替换为真实凭证[^4] print(jqdatasdk.get_price('000001.XSHE')) ``` #### 四、更新到最新版 ```bash pip install -U git+https://github.com/JoinQuant/jqdatasdk.git [^3] ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值