最优风险资产组合-Python

本文介绍了使用Python进行最优风险资产组合的分析过程,包括获取股票数据、统计分析、投资组合优化、有效边界计算和资本市场线的绘制。通过Markowitz均值-方差投资组合理论,探讨了如何寻找最高夏普率的组合,并使用Anaconda3和Python库如pandas、numpy进行数据分析。文章还展示了如何计算最小波动率的投资组合,有效边界和资本市场线,并涉及置信区间的讨论。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近研究了下最优风险资产组合这个题目。本小白在金融领域是个纯粹的初学者,开始的时候,有点不知所措。

后来在网上找了下计算最优风险资产组合、有效边界、资本市场线的资料以及程序实现。发现资料虽然不少,但是系统的讲解还是不多。也有系统讲解的书,但是感觉并不是很通俗,需要预先打好基础。

所以,经过了一段时间的学习,归纳了参考书的内容,觉得很有必要做下总结笔记,温故而知新。

本文为学习笔记,肯定会有错误或者主观臆想之处,请多多包涵。。。
尽管如此,还是切入正题吧。

大概的思路是:首先获取10支股票数据,然后根据Markowitz均值-方差投资组合理论,分析10支股票的收益率和波动率,生成大量随机风险组合,从中可以发现夏普率较高的随机组合。然后通过这些随机组合,计算有效边界。最后,引入无风险资产,根据有效边界,画出资本市场线。资本市场线与有效边界相切的点即为最优风险资产组合所在的点。该点的组合权重分配、组合收益率和波动率即为我们希望获得的结果。因为波动率代表风险,所以最优风险资产组合是研究收益率和波动率的。

Python是非常适合进行数据分析的语言。本文使用Anaconda3(64 bit)的Python发行版。

该版本集合了大量常用的Python包,比如我们之后会用到的numpy、pandas、matplotlib、scipy.optimize和scipy.interpolate。除此之外,为了获得股票数据,我们需要额外安装tushare包。在Anaconda Prompt (命令行工具)里面,键入pip install tushare,就可以装好此包。Anaconda3(64 bit)里面集成了Spyder编辑器,可以用它运行代码并查看结果。

作为刚接触Python和Spyder不久的人,我觉得这套工具确实赞。左边编辑代码,运行。右边的IPython Console里面就可以随时交互式查看各变量结果。

获取股票数据

为了获得股票数据,本来可以使用pandas_datareader从Yahoo下载数据。
可是不知为何,Yahoo突然不提供股票数据下载服务。于是我只好使用国内的tushare。

加载库:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import tushare as ts
import scipy.optimize as sco
import scipy.interpolate as sci
from scipy import stats

然后选10支股票。随意选了几个好股票:

             '000651',       ##格力电器   
             '600519',       ##贵州茅台  
             '601318',       ##中国平安               
             '000858',       ##五粮液  
             '600887',       ##伊利股份  
             '000333',       ##美的集团   
             '601166',       ##兴业银行  
             '600036',       ##招商银行  
             '601328',       ##交通银行  
             '600104'        ##上汽集团  

tushareget_hist_data函数获得的是不复权数据。我们需要复权数据可以用get_h_data函数。
get_h_data('000651', start='2014-05-28', end='2017-05-26')可以获得股票000651/格力电器的前复权数据。返回的数据是dataframe格式。dataframe可以看成是二维数据表。提取其中的’close’列,即可获得收盘价。

df = pd.DataFrame()
df = ts.get_h_data('000651', start='2014-05-28', end='2017-05-26') #前复权
s000651 = df['close']
s000651.name = '000651'

依葫芦画瓢,可以获得所有10支股票的收盘价。注意每个dataframe的一列是一个Series。将很多Series组合起来,就是一个dataframe
将所有10支股票的收盘价格组合起来,形成我们待研究的数据:

data = pd.DataFrame({'000651':s000651, '600519':s600519, '601318':s601318, '000858':s000858, '600887':s600887, '000333':s000333,
                     '601166':s601166, '600036':s600036, '601328':s601328, '600104':s600104})

如果某支股票某天有缺失值

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

a useful man

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值