Python实践投资组合理论
搞了一段时间的量化,还是个萌新,也塞进了很多统计学的术语。现做一个小小的实践验证投资组合原理。其中股票历史价格的获取来源于tushare,期待着它能加入港股,美股啥的,A股可真是个韭菜养殖场。
我随便挑了几支股票(其实并不是,第一次选的5支股票最后的最大Sharpe Ratio是负的🌚),他们分别是:000413 东旭光电,300033 同花顺, 002007 兰华生物, 000001 平安银行, 000002 万科 A。可惜的是tushare不支持同时获取多只股票,只好用个list,再循环获取了。1
2
3
4
5
6
7
8
9
10stock_set = ['000413','300033','002007','000001','000002']
noa = len(stock_set)
df = pds.DataFrame()
for stock in stock_set:
data = ts.get_h_data(stock, start='2017-01-01', end='2017-12-31')['close']
df.insert(0,stock,data)
#数据按照日期升序排列
df=df.sort_index(ascending=True)
#规范化时序数据
(df/df.iloc[0]*100).plot()
规范化后的时间序列数据:
1 | rets = np.log(df / df.shift(1)) |
pandas有一个内建方法,可以生成协方差矩阵:
1 | rets.cov()*252 |
下面的代码将生成5个处于(0,1)之间的随机数,然后对这些数值规范化,使所有值的总和为1:
1 | weights = np.random.random(len(stock_set)) |
1 | pro = np.sum(rets.mean()*weights)*252#预期组合年化收益 |
var的公式转换为Python numpy的向量化并没有那么容易理解。首先你得明白组合方差的计算方法,此处给个B站传送门投资组合预期收益和收益方差计算,这么棒的视频当然要滋词滋词。
采用蒙特卡洛模拟生成较大规模的随机投资组合权重。然后选出最优权重。对于每一次的模拟,我们都记录得出的预期投资组合的均值和方差:
1 | port_returns = [] |
结果展示: