两种资产组合的收益与方差
例1:两个资产组合权重向量为XT=[0.75,0.25]T,每个资产的方差均为0.1且协方差为0.05,求组合方差:
import numpy as np
import pandas as pd
x=np.mat('0.75;0.25')
v=np.mat('0.1 0.05;0.05 0.1')#矩阵的每一行用分号隔开,每一列用空格隔开
x.T*v*x
Out[1]: matrix([[0.08125]])
#或者直接用两种资产的方差公式:
(0.75**2)*0.1+(0.25**2)*0.1+0.75*0.25*2*0.05
Out[2]: 0.08125
多种资产组合的收益与方差
例2:从2019年中挑出4支A股股票,随机分配权重生成投资组合P,求P的预期收益率与波动率。
step1:挑选4支看似相关性不大的股票,汇总它们在2019年的收盘价数据并可视化:
from datetime import date
import pandas_datareader.data as web
df1=web.DataReader("600519.SS","yahoo",date(2019,1,1),date(2020,1,1))['Adj Close']
df2=web.DataReader("600276.SS","yahoo",date(2019,1,1),date(2020,1,1))['Adj Close']
df3=web.DataReader("600900.SS","yahoo",date(2019,1,1),date(2020,1,1))['Adj Close']
df4=web.DataReader("002739.SZ","yahoo",date(2019,1,1),date(2020,1,1))['Adj Close']
data=pd.concat([df1,df2,df3,df4],axis=1)
data.columns=['贵州茅台','恒瑞医药','长江电力','万达电影']#注意修改列名的函数格式
data.head()
Out[3]:
贵州茅台 恒瑞医药 长江电力 万达电影
Date
2019-01-02 590.239502 44.011105 14.840364 21.920000
2019-01-03 581.390564 42.432388 14.984726 21.549999
2019-01-04 593.215454 45.157700 14.744123 21.780001
2019-01-07 596.654480 44.509624 14.667130 22.370001
2019-01-08 595.964722 44.850212 14.975102 22.059999
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False
(data/data.iloc[0]).plot()#在2019年首个交易日归一化并画图
step2:生成4支股票的对数收益率序列:
r=np.log(data/data.shift(1))
#对应位置元素相除,data.shift(1)表示所有数据往下掉一行
r=r.dropna()
r.describe()
Out[5]:
贵州茅台 恒瑞医药 长江电力 万达电影
count 242.000000 242.000000 242.000000 242.000000
mean 0.002684 0.002848 0.000904 -0.000591
std 0.018873 0.020145 0.010518 0.025125
min -0.049550 -0.073313 -0.032278 -0.123845
25% -0.008131 -0.007375 -0.005041 -0.013874
50% 0.001124 0.003114 0.000000 0.000000
75% 0.011745 0.013627 0.006933 0.011773
max 0.057168 0.065688 0.033779 0.095310
step3:生成4支股票的随机权重:
x=np.random.rand(4)#在0~1中生成4个服从均匀分布的随机数
w=(x/sum(x)).round(3);w
Out[6]: array([0.249, 0.379, 0.257, 0.115])
#可以猜到按照这个权重配置的资产组合收益率一定很高
step4:计算4支股票的平均收益率、协方差矩阵、相关系数矩阵(可选)和波动率(可选),注意要对日数据年化处理:
r_mean=r.mean()*252;r_mean
Out[7]:
贵州茅台 0.676281
恒瑞医药 0.717733
长江电力 0.227838
万达电影 -0.148868
dtype: float64
r_cov=r.cov()*252;r_cov
Out[8]:
贵州茅台 恒瑞医药 长江电力 万达电影
贵州茅台 0.089764 0.049025 0.004747 0.021752
恒瑞医药 0.049025 0.102264 0.009374 0.018367
长江电力 0.004747 0.009374 0.027876 0.000882
万达电影 0.021752 0.018367 0.000882 0.159079
r_corr=r.corr();r_corr
Out[9]:
贵州茅台 恒瑞医药 长江电力 万达电影
贵州茅台 1.000000 0.511690 0.094888 0.182029
恒瑞医药 0.511690 1.000000 0.175577 0.144004
长江电力 0.094888 0.175577 1.000000 0.013252
万达电影 0.182029 0.144004 0.013252 1.000000
r_vol=r.std()*np.sqrt(252);r_vol
Out[10]:
贵州茅台 0.299606
恒瑞医药 0.319787
长江电力 0.166961
万达电影 0.398847
dtype: float64
step5:计算由这4支股票和随机权重构成的组合平均收益率和收益波动率:
Rp=sum(r_mean*w);round(Rp,4)
Out[11]: 0.4818#该组合的平均收益率为48.18%/年
w=np.mat(w);r_cov=np.mat(r_cov)
volp=np.sqrt(w*r_cov*w.T);volp.round(4)
Out[51]: array([[0.1969]])#该组合的收益波动率为19.69%/年