本文使用Wind的Python接口来下载数据,如果有兴趣想自己尝试,但是没有Wind账号的读者可以申请Wind的万矿量化云平台,应该是免费的。
我很钦佩的李蓓老师曾经提出过,私募基金因为其受限制较少,故私募基金仓位指标其实是一个更加合理的指标。但因为Wind上面只能下载私募基金净值的周数据,因此拟合效果并不理想,所以我最后只测算了公募基金的仓位。私募排排网上定期会公募全市场私募仓位数据,但获得历史数据似乎不免费。
本文最终测算的仓位数据并不理想,其主要作用在于告诉我们仓位变动的趋势以及目前仓位的历史分位数情况,请各位读者忽略仓位绝对数的影响。
三、基金仓位的测算方法
为了使得模型符合实际,我们规定仓位总体处于[0.5,0.9]的区间之内,同时beta在[0,1]的范围之内。
四、具体步骤
4.1基础工作
本文挑选的基金样本为截止2018年10月30日,全市场规模超过10亿的股票型公募基金共426只。我将他们的代码放在一个叫overonebillion的csv文件之中,注意,黄色部分的文件路径在自己操作的过程中需要修改,日期也可以根据自己的偏好修改。
4.2数据的获取及处理
为了获得DataFrame的数据,我将获得的基金代码(MyData)放进一个叫fundList的数列里面,在第31行提取数据,同时由于Wind获得的数据不是DataFrame的数据格式,还需要对数据进行一定的处理(32和33行)。使用同样的方法我们获得对应的指数的数据。
4.3求最优解
4.4后续处理及结果输出
100-107行我使用了一点小技巧,主要是为了平滑数据。Optimize出来的结果有时候会出现极值,为了平滑极值,我添加了年度和周数两列,再用groupby的方式对结果进行了周平均。
112行之后就是获得了周仓位数据后进行画图。最终结果如下所示:
最后,将仓位数据输出到CSV文件里,大功告成。
五、后续改进
1、除了最优解,其实还可以根据每周的日数据进行回归,这也是我最开始想到的方法,但无奈我只是一个python新手,带有限制条件的回归在python里我不会实现,所以最后采取了最简单粗暴的方法。
2、周度数据其实波动还是有点太大,通过移动平均可以使得数据更加平滑。
例如:tempresult=pd.Series(tempresult).rolling(window=4).mean()
3、本文的因变量是全市场的基金的收益率的平均值,但其实可以将基金分成,例如10组,求每一组数据的仓位然后再算平均,效果应该会更好。