最近研究了下最优风险资产组合这个题目。本小白在金融领域是个纯粹的初学者,开始的时候,有点不知所措。
后来在网上找了下计算最优风险资产组合、有效边界、资本市场线的资料以及程序实现。发现资料虽然不少,但是系统的讲解还是不多。也有系统讲解的书,但是感觉并不是很通俗,需要预先打好基础。
所以,经过了一段时间的学习,归纳了参考书的内容,觉得很有必要做下总结笔记,温故而知新。
本文为学习笔记,肯定会有错误或者主观臆想之处,请多多包涵。。。
尽管如此,还是切入正题吧。
大概的思路是:首先获取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' ##上汽集团
tushare
的get_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})
如果某支股票某天有缺失值