200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 【基金量化研究系列】大类资产配置研究(一)——股债二八配置策略与股债风险平价策略

【基金量化研究系列】大类资产配置研究(一)——股债二八配置策略与股债风险平价策略

时间:2020-11-18 03:59:03

相关推荐

【基金量化研究系列】大类资产配置研究(一)——股债二八配置策略与股债风险平价策略

文章目录

1. 引言1.1 资产配置简介1.2 可投标的说明1.3 市场基本情况与数据库使用的说明1.4 本文策略基本假设2. 资产配置策略一——股债二八策略2.1 策略简介2.2 基于python的策略实现2.3 策略表现3. 资产配置策略二——股债风险平价策略3.1 策略简介3.2 基于python的策略实现3.3 策略表现4. 资产配置策略三——动态再平衡的股债风险平价策略4.1 策略简介4.2 基于python的策略实现4.3 策略表现5. 策略比较与结论写在最后

1. 引言

1.1 资产配置简介

资产配置(Asset Allocation)是资产管理中战略配置。有研究显示,市场大部分基金的超额收益主要来源于资产配置(一说占据80%以上)。因此,做好大类资产配置是资产管理过程中最最重要的一环。除了专业的基金管理团队以外,一般投资者也可以通过简单的资产配置来提升家庭财富增值的速度与稳健性。

1.2 可投标的说明

本文以A股市场与债券市场作为一般可投资产类别,并以“易方达沪深300ETF(510310)”与“国泰上证5年国债ETF(511010)”作为股票市场与债券市场的基准标的。

1.3 市场基本情况与数据库使用的说明

本文基于东方财富的Choice数据库进行回测。首先给出基本代码:

Module 0: 导入所需的库函数

# Module 0: 导入所需的包from EmQuantAPI import * #使用chioce数据库。详细使用说明请查阅百度import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport mathfrom scipy import stats

Module 1.1: 数据下载模块(本文使用Choice数据库)

# Module 1: 下载数据,并存储到本地def download_data_from_choice():loginresult = c.start()codes = "510310.SH,511010.SH" #所需数据的代码。510310为沪深300ETF,511010为五年国债ETFindicators = "open,high,low,close" #需要下载的数据指标startdate = "0101" #回测起始时间,可自行修改enddate = "" #回测结束时间,可自行修改data = c.csd(codes = codes, indicators = indicators, startdate = startdate, enddate = enddate, options=("Ispandas,1")) # 导入数据,以pd.DataFrame类型格式存储path ='你数据的存储地址' #将数据保存到你的本地地址(需自行修改)data.to_excel(path, index=True, header=True)download_data_from_choice()

:读者可以自行选择数据库进行下载。若已有本地数据库,请跳过本模块

Module 1.2: 数据读取与基本变量初始化模块

#数据导入path = '你数据的存储地址'data = pd.read_excel(path) #读取数据data.set_index(data["DATES"], inplace=True) #设置数据索引为交易日HS300ETF = pd.DataFrame(data[data["CODES"] == '510310.SH']["CLOSE"].astype(float)) #沪深300ETF专属数据结构。仅保留收盘价格GZ5yETF = pd.DataFrame(data[data["CODES"] == '511010.SH']["CLOSE"].astype(float)) #国债ETF专属数据结构。仅保留收盘价格td_dates = HS300ETF.index #记录交易日信息,方便以后进行查找n = len(td_dates) #记录回溯交易日天数

Module 2: 收益率计算模块(如数据集中已存在可忽略)

# Module2: 计算收益率pd.set_option('mode.chained_assignment', None) # 创建收益率序列HS300ETF['RETURN'] = 0 #创建收益率序列GZ5yETF['RETURN'] = 0 #创建收益率序列HS300ETF['RETURN'].astype(float)#设定格式为浮点GZ5yETF['RETURN'].astype(float)#设定格式为浮点# 计算收益率HS300ETF["RETURN"][td_dates[1:]] = np.array(HS300ETF["CLOSE"][td_dates[1:]]) / np.array(HS300ETF["CLOSE"][td_dates[:-1]]) - 1 #计算HS300ETF日收益率GZ5yETF["RETURN"][td_dates[1:]] = np.array(GZ5yETF["CLOSE"][td_dates[1:]]) / np.array(GZ5yETF["CLOSE"][td_dates[:-1]]) - 1 #计算GZ5yETF日收益率# 将收益率序列单独存储至returnsreturns = pd.DataFrame({'510310.SH':HS300ETF["RETURN"], '511010.SH':GZ5yETF["RETURN"]},index= td_dates)print(returns.head()) #打印表头查看

输出结果如下所示:

510310.SH 511010.SHDATES /01/05 0.000000 0.000000/01/06 -0.006085 0.000639/01/07 -0.000680 0.001258/01/08 -0.019061 0.000251/01/09 -0.002776 0.001903Process finished with exit code 0

Module 3: 收益率统计分析模块

# Module 3: 收益率统计分析模块# Step 3.1 计算日均收益率与波动率:sigma_HS300ETF = np.std(returns['510310.SH'])sigma_GZ5yETF = np.std(returns['511010.SH'])r_mean_HS300ETF = np.mean(returns['510310.SH'])r_mean_GZ5yETF= np.mean(returns['511010.SH'])print("""从 {} 到 {} :沪深300ETF日均收益率:{:.4f}%, 日均波动率为:{:.4f}%5年国债ETF日均收益率:{:.4f}%, 日均波动率为:{:.4f}%""".format(td_dates[0], td_dates[-1], r_mean_HS300ETF*100,sigma_HS300ETF*100, r_mean_GZ5yETF*100, sigma_GZ5yETF*100))# Step 3.2 绘制直方图plt.hist(returns['510310.SH'])plt.hist(returns['511010.SH'])plt.show() #画出收益率直方图# Step 3.3 相关性分析pearson = stats.pearsonr(returns['510310.SH'], returns['511010.SH']) # HS300ETF与债券ETF相关性检验print("Pearson相关性检验结果:\n""\t相关系数:{},p值:{}\n".format(pearson[0], pearson[1]))plt.plot(returns['510310.SH'])plt.plot(returns['511010.SH'])plt.show()# Step 3.4 正态性检验print(stats.kstest(returns['510310.SH'],'norm'))print(stats.kstest(returns['511010.SH'],'norm'))

输出结果如下所示:

从 /01/05 到 /05/11 :沪深300ETF日均收益率:0.0268%, 日均波动率为:1.6393%5年国债ETF日均收益率:0.0148%, 日均波动率为:0.1768%Pearson相关性检验结果:相关系数:-0.1270691495583643,p值:4.238772308122759e-06Process finished with exit code 0

图1 1月1日至5月11日国债ETF与沪深300ETF收益率分布直方图

图2 1月1日至5月11日国债ETF与沪深300ETF收益率时间序列图

从上述结果在可以看出,股票市场相比于债券市场有较高的日收益率,但同时也有较高的波动率。同时,股票与债券在收益率上有着显著的负相关性,因此可以通过构建二者的组合,降低风险而提升收益率。本文就基于这一实证结果,构建对应的资产配置策略。

我们先分别看看全仓股票和债券会怎样:

Module 4: 纯股与纯债策略

# Module 4: 纯股与纯债策略nv_HS300ETF = [1] #记录全仓股票策略净值nv_GZ5yETF = [1] #记录全仓债券策略净值for i in range(n):nv_HS300ETF.append( nv_HS300ETF[i] *(1 + returns['510310.SH'][td_dates[i]]))nv_GZ5yETF.append( nv_GZ5yETF[i] *(1 + returns['511010.SH'][td_dates[i]]))plt.plot(nv_HS300ETF[t:n-t], label = "nv_HS300ETF", color = "black")plt.plot(nv_GZ5yETF[t:n-t], label = "nv_GZ5yETF", color = "red")plt.show()

图3 1月1日至5月11日纯股与纯债策略净值走势图(以1月1日为基日,定义净值为1。黑线为全仓沪深300ETF净值走势曲线,红线为全仓5年国债ETF净值走势曲线)

1.4 本文策略基本假设

(1)市场中不允许融资做多与融券做空;

(2)建仓调仓过程中不允许借款、参与国债回购;

(3)每日仅在收盘时间以收盘价格进行交易;

(4)未特别规定,忽略调、建仓手续费。

2. 资产配置策略一——股债二八策略

2.1 策略简介

所谓股债二八策略,实际上就是20%的资产投资于股票市场,另外80%的资产投资于债券市场。这一策略的核心思想就是股票市场的风险大大高于债券市场,因此将较高权重的资金配置于债券市场,而将小部分资金配置于股票市场,这样既可以获取较为稳定的债券收益,同时也可以在股票市场中获利。

2.2 基于python的策略实现

Module 5: 股债二八策略

# Module 5: 股债二八策略nv_strategy_2080 = [1] #记录策略净值for i in range(n):nv_strategy_2080.append( nv_strategy_2080[i] *(1 + 0.2 * returns['510310.SH'][td_dates[i]] + 0.8 * returns['511010.SH'][td_dates[i]]))plt.plot(nv_HS300ETF, label = "nv_HS300ETF", color = "black")plt.plot(nv_GZ5yETF, label = "nv_GZ5yETF", color = "red")plt.plot(nv_strategy_2080, label = "nv_strategy_2080", color = "blue")plt.show()

2.3 策略表现

输出结果图4所示:

图4 1月1日至5月11日股债二八策略净值走势图(以1月1日为基日,定义净值为1。蓝线为策略净值走势图)

3. 资产配置策略二——股债风险平价策略

3.1 策略简介

股债二八策略最大的问题是比例划分的比较“粗糙”。实际上,二比八的权重比更适用于欧美市场这样的成熟市场,而不是中国这样的新兴市场。因此,我们要对这一比例进行优化。

风险平价策略(Risk-Parity Strategy)是指寻找一组权重,使得各类资产对组合资产贡献的风险比重相等的投资策略,即:

ωi=1−σi∑j=1mσj,i=1,2,...,m\omega_i = 1-\frac{\sigma_i}{\sum_{j=1}^m\sigma_j},i=1,2,...,m ωi​=1−∑j=1m​σj​σi​​,i=1,2,...,m

其中:

·ωi 为第i类资产权重,

·σi 为第i类资产的长期波动率,

·m为总资产类别

:构建比例时亦可以使用方差代替标准差。

3.2 基于python的策略实现

Module 6: 股债风险平价策略

# Module 6: 股债风险平价策略# 计算长期波动率 sigma_HS300ETF = np.std(returns['510310.SH'])sigma_GZ5yETF = np.std(returns['511010.SH'])# 计算权重w_bond = sigma_HS300ETF/(sigma_HS300ETF + sigma_GZ5yETF)w_stock = sigma_GZ5yETF/(sigma_HS300ETF + sigma_GZ5yETF)# 计算策略净值nv_strategy_riskparity = [1]for i in range(n):nv_strategy_riskparity.append(nv_strategy_riskparity[i] * (1 + w_stock * returns['510310.SH'][td_dates[i]] + w_bond * returns['511010.SH'][td_dates[i]]))# 绘制策略净值图plt.plot(nv_HS300ETF, label = "nv_HS300ETF", color = "black")plt.plot(nv_GZ5yETF, label = "nv_GZ5yETF", color = "red")plt.plot(nv_strategy_riskparity, label = "nv_strategy_riskparity", color ="green" )plt.show()

3.3 策略表现

图5 1月1日至5月11日股债风险平价策略净值走势图(以1月1日为基日,定义净值为1。绿线为策略净值走势图)

4. 资产配置策略三——动态再平衡的股债风险平价策略

4.1 策略简介

风险平价策略并没有比二八策略具有显著的优势,其原因在于股债的短时波动与长期波动相比有所偏离。因此,一个简单的改进策略就是每日进行权重的“再平衡(Rebalancing)”,即根据回溯窗口期内的短时波动率计算次日权重进行调仓。

4.2 基于python的策略实现

Module 7: 动态再平衡的股债风险平价策略

# Module 7: 动态再平衡的股债风险平价策略# 定义计算移动平均波动率函数:def Sigma_MA(t, return_series, type):"""t: 回溯窗口长度return_series: 收益率序列type: 输出序列格式。支持list格式与pd.DataFrame格式"""td_dates = return_series.indexreturn_seires = list(return_series)n = len(return_series)sigma_series = []for i in range(t, n):sigma_series.append(np.std(return_series[i-t:i]))if type == "list":return sigma_serieselif type == "DataFrame":return pd.DataFrame({"sigma_series":sigma_series}, index = td_dates[t:n])else:return "Type Input Error!"# 设置回溯窗口长度t = 20sigma_seires_HS300ETF = Sigma_MA(t = t, return_series = returns['510310.SH'], type = "DataFrame")['sigma_series']sigma_seires_GZ5yETF = Sigma_MA(t = t, return_series = returns['511010.SH'], type = "DataFrame")['sigma_series']nv_strategy_riskparity_daily = [1]for i in range(n):# 由于这一策略对样本有损耗,因此需要单独计算if td_dates[i] in sigma_seires_HS300ETF.index:# 计算权重w_bond_daily = sigma_seires_HS300ETF.loc[td_dates[i]] / (sigma_seires_HS300ETF.loc[td_dates[i]] + sigma_seires_GZ5yETF.loc[td_dates[i]])w_stock_daily = 1 - w_bond_daily# 计算净值nv_strategy_riskparity_daily.append(nv_strategy_riskparity_daily[i] * (1 + w_stock_daily * returns['510310.SH'][td_dates[i]] + w_bond_daily * returns['511010.SH'][td_dates[i]]))else:nv_strategy_riskparity_daily.append(nv_strategy_riskparity_daily[i])# 绘制净值图plt.plot(nv_HS300ETF[t:n-t], label = "nv_HS300ETF", color = "black")plt.plot(nv_GZ5yETF[t:n-t], label = "nv_GZ5yETF", color = "red")plt.plot(nv_strategy_riskparity_daily[t:n-t], label = "nv_strategy_riskparity_daily", color ="purple" )plt.show()

4.3 策略表现

图6 1月1日至5月11日股债动态再平衡风险平价策略净值走势图(以1月1日为基日,定义净值为1。紫线为策略净值走势图)

可以看出,策略的稳定性与总盈利水平较前两种策略均有所提升。在第五章中,让我们进一步比较一些指标。

5. 策略比较与结论

Module 8: 策略比较

# Module 8: 策略比较# 1. 各策略日收益初始化r_strategy_2080 = []r_strategy_riskparity = []r_strategy_riskparity_daily = []r_HS300ETF = []r_GZ5yETF = []# 2.计算各策略日收益率for i in range(n):r_HS300ETF.append(returns['510310.SH'][td_dates[i]])r_GZ5yETF.append(returns['511010.SH'][td_dates[i]])r_strategy_2080.append(0.2 * returns['510310.SH'][td_dates[i]] + 0.8 * returns['511010.SH'][td_dates[i]])r_strategy_riskparity.append(w_stock * returns['510310.SH'][td_dates[i]] + w_bond * returns['511010.SH'][td_dates[i]])if td_dates[i] in sigma_seires_HS300ETF.index:w_bond_daily = sigma_seires_HS300ETF.loc[td_dates[i]] / (sigma_seires_HS300ETF.loc[td_dates[i]] + sigma_seires_GZ5yETF.loc[td_dates[i]])w_stock_daily = 1 - w_bond_dailyr_strategy_riskparity_daily.append(w_stock_daily * returns['510310.SH'][td_dates[i]] + w_bond_daily * returns['511010.SH'][td_dates[i]])else:r_strategy_riskparity_daily.append(0)# Step 3: 计算各策略日波动率sigmas = []sigmas.append(np.std(r_HS300ETF[t:n-t]))sigmas.append(np.std(r_GZ5yETF[t:n-t]))sigmas.append(np.std(r_strategy_2080[t:n-t]))sigmas.append(np.std(r_strategy_riskparity[t:n-t]))sigmas.append(np.std(r_strategy_riskparity_daily[t:n-t]))# Step 4: 计算各策略日收益率mean_returns = []mean_returns.append(np.mean(r_HS300ETF[t:n-t]))mean_returns.append(np.mean(r_GZ5yETF[t:n-t]))mean_returns.append(np.mean(r_strategy_2080[t:n-t]))mean_returns.append(np.mean(r_strategy_riskparity[t:n-t]))mean_returns.append(np.mean(r_strategy_riskparity_daily[t:n-t]))# Step 5: 计算各策略日夏普比率sharpe_ratios = []for i in range(len(sigmas)):sharpe_ratios.append(mean_returns[i] / sigmas[i])# Step 6: 打印结果,并绘制净值走势图outcome = pd.DataFrame({'mean_returns': mean_returns, 'sigmas': sigmas, 'sharpe_ratios': sharpe_ratios}, index = ['纯股','纯债','股债二八','风险平价','再平衡'])print(outcome)plt.plot(nv_HS300ETF[t:n], label = "nv_HS300ETF", color = "black")plt.plot(nv_GZ5yETF[t:n], label = "nv_GZ5yETF", color = "red")plt.plot(nv_strategy_2080[t:n], label = "nv_strategy_2080", color = "blue")plt.plot(nv_strategy_riskparity[t:n], label = "nv_strategy_riskparity", color ="green" )plt.plot(nv_strategy_riskparity_daily[t:n], label = "nv_strategy_riskparity_daily", color ="purple" )plt.show()

输出结果如下:

mean_returns sigmas sharpe_ratios纯股 0.000281 0.016301 0.017224纯债 0.000133 0.001754 0.076070股债二八0.000163 0.003378 0.048229风险平价0.000148 0.002091 0.070673再平衡 0.000171 0.002052 0.083281

:VaR和最大回撤忘了计算了呃。之后有时间补吧

图7 1月30日至5月11日各策略净值走势对比图(以1月29日为基日,定义净值为1。黑线为全股策略,红线为全债策略,蓝线为股债二八策略,绿线为风险平价策略,紫线为动态再平衡风险平价策略)

从图中和表格中可以看出,再平衡风险平价策略有着最高的收益-风险比率(return-risk ratio)(或称风险价值),同时日收益率在三类组合策略中最高,而日波动率在各组合策略在最低。五年多来总收益高于其他各类策略的总收益,因此可以认为是一款成功的股债配置策略。

写在最后

若想查阅本系列全部文章,请参见目录页:系列文章目录索引。

欢迎感兴趣的小伙伴来跟作者一起挑刺儿~ 包括但不限于语言上的、排版上的和内容上的不足和疏漏~ 一起进步呀!

有任何问题,欢迎在本文下方留言,或者将问题发送至勘误邮箱: mikeysun_bugfix@

谢谢大家!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。