目录
相关推导查看前文【pandas_2样本(资产)组合收益与风险矩阵运算实现】
代码:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
df_004 = pd.read_csv('600004.csv',encoding='utf-8')
df_015 = pd.read_csv('600015.csv',encoding='utf-8')
df_023 = pd.read_csv('600023.csv',encoding='utf-8')
df_033 = pd.read_csv('600033.csv',encoding='utf-8')
df_343 = pd.read_csv('600343.csv',encoding='utf-8')
df_346 = pd.read_csv('600346.csv',encoding='utf-8')
df_183 = pd.read_csv('600183.csv',encoding='utf-8')
df_1398 = pd.read_csv('601398.csv',encoding='utf-8')
df_050 = pd.read_csv('600050.csv',encoding='utf-8')
df_000 = pd.read_csv('600000.csv',encoding='utf-8')
df_004['ret_004'] = df_004['closePrice'].pct_change()
df_004 = df_004.loc[:,['tradeDate','ret_004']]
df_015['ret_015'] = df_015['closePrice'].pct_change()
df_015 = df_015.loc[:,['tradeDate','ret_015']]
df_023['ret_023'] = df_023['closePrice'].pct_change()
df_023 = df_023.loc[:,['tradeDate','ret_023']]
df_033['ret_033'] = df_033['closePrice'].pct_change()
df_033 = df_033.loc[:,['tradeDate','ret_033']]
df_343['ret_343'] = df_343['closePrice'].pct_change()
df_343 = df_343.loc[:,['tradeDate','ret_343']]
df_346['ret_346'] = df_346['closePrice'].pct_change()
df_346 = df_346.loc[:,['tradeDate','ret_346']]
df_183['ret_183'] = df_183['closePrice'].pct_change()
df_183 = df_183.loc[:,['tradeDate','ret_183']]
df_1398['ret_1398'] = df_1398['closePrice'].pct_change()
df_1398 = df_1398.loc[:,['tradeDate','ret_1398']]
df_050['ret_050'] = df_050['closePrice'].pct_change()
df_050 = df_050.loc[:,['tradeDate','ret_050']]
df_000['ret_000'] = df_000['closePrice'].pct_change()
df_000 = df_000.loc[:,['tradeDate','ret_000']]
ten_df = pd.merge(df_004,df_015,on='tradeDate')
ten_df = pd.merge(ten_df,df_023,on='tradeDate')
ten_df = pd.merge(ten_df,df_033,on='tradeDate')
ten_df = pd.merge(ten_df,df_343,on='tradeDate')
ten_df = pd.merge(ten_df,df_346,on='tradeDate')
ten_df = pd.merge(ten_df,df_183,on='tradeDate')
ten_df = pd.merge(ten_df,df_1398,on='tradeDate')
ten_df = pd.merge(ten_df,df_050,on='tradeDate')
ten_df = pd.merge(ten_df,df_000,on='tradeDate')
ten_df.dropna(inplace=True)
ten_df['tradeDate'] = pd.to_datetime(ten_df['tradeDate'])
ten_df.set_index('tradeDate',inplace=True)
ten_df.head()
def annualize_rets(returns,n_periods):
'''
给定一系列的收益率和期数,算出年化收益率
'''
# 每一期的平均收益
r_periodic_mean = ((1+returns).prod())**(1/returns.shape[0])-1
return (1+r_periodic_mean)**n_periods-1
def annualize_std(returns,n_periods):
'''
给定一系列的收益率,算出年化的标准差
'''
return returns.std()*np.sqrt(n_periods)
def portfolio_return(weights,returns):
'''
计算投资组合收益率,weights和returns需要矩阵形式
weights是组合资产的权重
returns是组合中的资产年化收益率
'''
return weights.T @ returns
def portfolio_vol(weights,covmat):
'''
计算投资组合风险(波动率),weights和covmat需要矩阵形式
covmat代表的是协方差矩阵
'''
return np.sqrt(weights.T @ covmat @ weights)
annual_rets = annualize_rets(ten_df,252)
annual_vols = annualize_std(ten_df,252)
annual_cov = np.cov(ten_df,rowvar=False)*252
annual_rets
annual_vols
annual_cov
# 等权重的向量
ew = np.repeat(1/10,10)
ew
# out: array([0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1])
# 计算等权重组合的收益率和风险
ret_ew = portfolio_return(ew,annual_rets)
vol_ew = portfolio_vol(ew,annual_cov)
ret_ew,vol_ew
# out: (0.0572960551215744, 0.22910798132610205)
数据:
链接:https://pan.baidu.com/s/1YsdnBZ-An_AMWsex8d2JFg
提取码:rrq0