0%

风险评价策略(Risk Parity)基准指数

6月份考完CFA leve I 就打算用R实现一个Risk Parity的策略,原本觉得很快就能搞定,但是没想到越写东西越多,细节的问题不断浮出水面,直到最近才完成了大部分的功能。写了1000多行的R代码,本篇就是梳理自己在编程过程中碰到的一些问题和想法。如果想了解Risk Parity量化的方法可以参考之前的《Risk Parity 量化入门

最根本的想法:为什么要实现一个Risk Parity,或为什么Risk Parity能实现收益?

我自己主要是参考了Ray Dalio关于全天候基金的一些介绍,觉得很有道理。主要有以下几点:

  • 长期来看,beta也就是资产的收益一定是超过现金的。
  • 理由是因为,其一,这是有资本主义制度本质决定的,资金总是流向能产生更高收益的地方。而那些能产生正收益的人或项目就会借入资金,而投资人则会借出资金获取收益。显然,资本市场就是投资人和项目汇集地。当然,有些制度下未必如此。。。
  • 其二,风险应该获得对应的补偿。简而言之就是高风险高收益。

对于我自己而言,我需要一个benchmark,来衡量自己投资的绩效。同时,这个基准指数,也是我用来观察市场的一个很好的工具。因此,我觉得实现这个基准指数是一件很有意义的事情。

为什么不去追求alpha?

我觉得是一个因人而异的事情。alpha是零和游戏,你获得的alpha其实别人的loss,从这点来看就知道获取alpha的竞争激烈,也就是说,你必须比别人在某些方面强,你才能从他人身上抢到钱。明白了这点,就需要对自身进行一些必要分析,自己到底在哪些方面比别人强?要长期跑赢市场是一件几乎不可能完成的任务!在这个市场里面,有人靠基本面分析,有人靠技术分析,有的靠行为心理。。。但是,我相信这个市场的效率会越来越高,越来越逼近semi-strong efficient market。秉持这个观点,再加之我自己并没有什么过人之处,那么,我应该安心于获取beta,或者说,要获取alpha我会借助别人的能力,比如选则基金。这里我想多说一句,对于大部分散户而言,不要去走所谓的基本面这条路,因为其实这条路是相当昂贵的,光从数据角度来看,要获取和机构对等的数据就是一件不可能的事情!机构可以获取各类研究报告,机构有专职人员看某个行业,当需要了解行业细节时候,随时有人可以说清楚,他们甚至可以花钱用卫星来数船。

以上的大原则指导了我努力的方向。那么,要获取beta,搞个股票指数基金定投也ok啊,为啥要用Risk Parity呢?如果你能承受得起指数的波动并能坚持到底,我想也是一条可选则的路。就我自己而言,我相信分散投资,而Risk Parity能做到比指数基金更好的分散投资,因此也就实现了更低的波动。

Risk Parity的组合里面该包括什么品种?

我主要是根据Edward E. Qian的那本 Risk Parity Fundmentals来选择品种。大类上来讲包括了以下三种:

  • interest risk premium,也就是债券了,其实主是指利率债。长期来看,投资者通过承担利率风险(比如买入长期国债)获得利率的风险溢价。
  • equity risk premium,也就是股票了,长期来看投资者通过投资股票必然可以获得高于无风险利率的收益。其实从微观的角度来看,企业主通过股票市场融资,通过持续经营,获得高于融资成本的收益。
  • inflation risk premium,也就是商品,长期来看商品可以对冲通货膨胀。

而这三大类资产类别本身的相关性不高,所以是比较理想的构建portfolio的要素。比如,在高通胀时期,股票和债券的表现不好,但是,商品的表现会比较突出;而在经济低迷的时期,债券的表现要好于股票和商品。需要说明的是以上三大类都包含了“长期来看”这个前提,因为从某个时间段来说,会出现三类资产都在下跌的情况。但是从长期来看,这3类资产的期望收益都是正的。

都有哪些资产入选到Risk Parity基准指数里?

刚一开始我并不想加入太多的资产品种,我想从简单的开始,逐步完善,而基准指数也是我观察市场的一个窗口。我初步的想法是在大类的risk parity下包含小类的risk parity。大类上已经提到了要包括债券,股票和商品。而每个大类下,我想再通过跨国配置做进一步的risk parity,目的是将风险分散的更彻底。那么需要包括哪些国家呢?我想以:

  • 消费国:美国,欧洲
  • 生产国:中国
  • 资源国:澳洲

这样的分类来选择国家,之所以这样想,是因为,通常这些国家在同一时间会处于不同的经济周期上,因此,也就能更好的分散风险。所以,最后每个大类都会包含这些国家的资产。例如,在股票的大类下会分别包含:美国、欧洲、中国和澳洲的股票,而这些不同国家的股票之间也要实现risk parity。以下就是目前包括的基准指数里包含的资产:

  • 股票
    • 美国:S&P500 - 标普500指数(Total Return)
    • 欧洲:德国DAX指数,本来想用stoxx 50的,但是不确定stoxx是否是total return(有谁知道麻烦告知一下),而DAX指数本身就是total return的方式。
    • 中国:沪深300指数,但是找不到沪深300的total return指数,所以就直接用沪深300EFT(510310)并使用后复权获得最终的数据。不过300EFT历史太短了,导致我很难做回测,我就用50ETF接300ETF,这么处理一下后就有比较长的历史数据了!
    • 澳洲:ASX200 - 澳洲200指数(Total Return)
  • 债券
    • 美国:Thomson Reuters US 10 Year Government Benchmark - 美国10年期债券指数 (目测应该是total return)
    • 欧洲:S&P Eurozone Sovereign Bond 7-10 Years Index (total return)
    • 中国:Shanghai SE Treasury Bond - 国债指数 (目测应该是total return)
    • 澳洲:S&P/ASX Government Bond 5-10 Year Index (Total return)
  • 商品,对于商品而言,并没有国别的区分,主要考虑到国内市场和国际市场会有不同步的现象,所以分别使用两个商品指数。同时,将黄金单列出来,我的想法是黄金本身是对冲通胀的一种工具,同时她兼具一种信用保障,比如她一种避险资产,因此将她单列出来,目的是能起到更好的分散风险的作用。
    • 黄金 - 国内黄金现货价格
    • 国际商品:S&P GSCI 商品指数(total return)
    • 国内商品:通达信期货通里面有一个大宗商品指数(T001),不清楚是谁编制的,暂时就先用这个指数吧!这个指数应该不是total return。不过影响应该不会太大。

还是要提一句数据收集,没想到花掉那么多精力,之前也没有考虑指数是否是total return。随着测试的开始,渐渐意识到这个问题。而我自己也没有什么好的数据终端(花不起这个钱啊!)好在investing.com上的数据还比较全面。后来又发现了www.spindices.com这个网站,他是标普的一个关于指数汇编的网站,提供了非常全面的指数品种,还能下载数据,不过普通用户只能回溯10年的数据。看来以后花钱买数据的必然的了。回测的过程中发现了很多数据上的问题,需要自己不断地对数据进行修正,数据的准备和清理觉绝对是一件耗时耗精力的事情,远远超出了自己的预期。

资金管理

本系统使用一个很简单的资金管理模型:1倍恒定杠杆(1份本金+1份融资)。也就是在任何情况下保持1倍左右的杠杆。从资金管理的角度来看,重点关注是否会爆仓。那么1倍杠杆爆仓会发生在所持的portfolio瞬时下跌50%。这种可能性从一个交易日的时间窗口来看几乎是不可能发生的。因为portfolio本身是分散投资的,包括了债券、股票和商品。另外由于是恒定1倍杠杆的算法,当资产价格下跌,导致超过1倍杠杆时就会触发系统卖出所持资产保证杠杆维持在1倍。

实现细节

以下罗列一些实现上的细节:

  • Risk Parity everywhere。不光是在资产大类上实现Risk Parity,在子类上也实现Risk Parity,例如在股票大类里面可以分为,中国股票,美国股票,德国股票等,那么这些品种也会是Risk Parity。 再下一层,比如中国股票里面可以分创业板,上证50,那么仍旧是Risk Parity。 而我编写的R程序可以自动完成这些工作,我所需要做的仅仅是写出一个资产配置的树形结构。
  • Rebalance 策略。我没有使用定期Rebalance的策略,而是针对每个品种设置一个threadhold。超过了就进行Rebalance。这个threadhold是根据每个品种的return std(standard deviation)计算出来的。
  • correlation matrix不是静态的,而是会变动的,目前的策略就是根据最近3~5年的数据进行调整。判断correlation matrix是否需要更新的标准是同上次使用的matrix做比较,如果发生统计意义上的改变,则correlation matrix需要更新,那么对应的,各类资产的比重也都需要调整。R程序里使用biotools包的boxM方法来进行判断。
  • 计算各类资产子Risk Parity下的比重的时候,需要用到优化包,R程序里使用的是BB包里面的spg方法。她能模拟Excel里面的规划求解(solver)。
  • 计算指数的时候考虑到了交易费用和借款利息。交易费用目前固定为1/1000,借款利息使用的是14天回购利率(204014)。不清楚这样是否合理。
  • 将所有国外的资产价格换算成RMB(CNY),因为,在计算correlation的时候,必须用同种货币才有意义。

下一个阶段需要做哪些方面的改进?

目前我最希望能加入的是timing model,也就择时调整个资产的比重。一个直观的想法是,如果债券处在高位了,那么我希望在Risk Parity里面减少债券的比重。同样,如果商品处在低位,那么我希望能增加该品种的比重。看了一些资料,目前的方向是引入momentum/trend following的方法,对各个品种的比重进行调整。当然也有很多的细节问题需要考虑,比如:当某个品种加速上冲的时候,也往往是最后一波行情了,比如2015年6月份的股灾。那么,这个时候,momentum/trend following并不能指出这种风险。这就需要设计一个指标,根据历史数据的统计加入判断,比如乖离率的统计。具体我也没有想清楚。有时候觉得,既然是一个benchmark,就不应加入这些目的是为了增加alpha的东西。而这些可以加入到我自己的真实的投资组合当中去。

回测演示

最后就显示一下自己做的Risk Parity benchmark index的资金曲线。如下图所示:

红色是1倍杠杆的净值曲线,黑色是S&P500 total return并换算成人民币。下面针对回测结果做一下说明和总结:

  • 首先,还是有点出乎意外,竟然能和S&P500差不多打平,要知道我才用了1倍的杠杆。
  • 该净值曲线是在扣除了交易费用之后获得的。不过没有计算融资费用,也就是1倍杠杆的融资费用。这算是小小耍流氓。会在下次回测的时候做一下灵敏度的测试,看看不同的融资费用和交易费用会对净值造成多大的影响
  • 资产分配的权重演变来看,初始权重(不包括杠杆,也就是总计为1的情况下),最初债券的权重为74%,演变到后来债券的权重为85%以上,几乎就是一只债券基金了。主要的原因就是债券超低的波动率,尤其是上证国债的超低波动率(几乎就是一根直线),再加上全球央行的大放水,造成了债券的超低波动率,这就直接导致了在Risk Parity中,债券占比的大幅提高。一个值得思考的点就是,如果债券波动率突然增加,就会对现有的配置造成很大的冲击。是否应该给每个大类设置设置一个配置的上限呢?
  • 其实,这个Risk Parity的组合是可以通过增加杠杆来提高收益的。因为,通过数据可以看到,未加杠杆的情况下(总计权重为1)的Risk Parity的standard deviation和S&P500 total return (人民币计价)的standard deviation的比为:1:5.2。也就是说,如果将Risk Parity的波动率调成和S&P500一致的话,可以用4倍杠杆!而目前只用了1倍杠杆。所以,在实际运行Risk Parity的时候,也可以考虑动态杠杆。
  • Risk Parity回测结果的Annualized Sharpe Ratio为2.13。很不错的值,不过考虑到其实她几乎就是一只债券基金,这个sharp ratio也算靠谱。
  • 最后提一下08年金融危机时的表现,从净值曲线的表现来看是远好于S&P500的,这得益于危机期间债券,黄金和其他资产之间的负相关性。

参考文献:

  • Edward E. Qian, Risk Parity Fundmentals
  • Bridgewater, Engineering targeted return & risks
  • Bridgewater, Our thoughts about Risk Parity and All Weather
Liang wechat
欢迎订阅我的微信公众号!