货币基金
货币基金是大众参与银行间市场的创新,具有近似活期的流动性,收益还是活期的N倍。有点流动资金当然是选个货币基金放着比较实惠啦。
余额宝炒火了货币基金,但如今已经不再是好时候,可以看到最近货币基金的收益已经是5年来最低。
计算方法:取规模最大的100支货币基金90分位点(去掉极大值)以内的平均。
货币基金如何选择
虽然货币基金属于低风险产品,除了T+1/T+2,另注意收益结算周期之外,万分收益本身也可以比较一下,总是希望收益能够大一些。
而余额宝这种“明星”宝宝类产品,比货币基金大盘还是要差些的,分析了近五年来余额宝和货币基金大盘的对比,可以看到在2016-2017年初那段时间余额宝确实强劲,比大盘收益率高10%左右,但近来,余额宝比货币基金大盘市场大约低20%-30%!
所以,还是来自己选个货币基金吧:)
最近在听“香帅的北大金融学课”,正好也讲到货币基金的选择原则。
她的团队给出两个维度的选择标准:散户比例和基金规模。
1)散户比例,其实就是个人持有者比例。
她的建议在60%+会更安全,原理是说机构都是量化交易,一般市场有风吹草动,作为个人投资者相对跑的太慢,会有风险。
但是,作为货币基金风险比较小,出这种事情的概率比较低。
算了下个人持有比例和收益的相关性,相关系数在-0.2,虽然不算很强的弱相关吧…
这一条在靠谱的基金持有标的上,我觉得其实可以忽略。
2)基金规模,香帅团队的建议是100-400亿之间。
这个我倒是验证了差不多,在这个区间里规模和收益呈现正相关。
可以看到基金规模在100亿以下的占75%+,在基金规模400亿范围内,基金规模与万分收益的相关系数是0.3,而在基金规模大于400亿外,相关系数变成了-0.3,收益随着规模增加而下降。
物理意义上的解释是,当基金规模太小,议价权也小,难以谈到好的收益;而基金规模过大,也不够灵活,大量资金注入也会压低收益。
所以,这里建议的100-400亿之间的建议是十分中肯的。
排序原则
满足以上两个条件的选择其实就已经不算多了,大概也就小30个了,然后按照近期收益排序选出来的在手动滤一下也就差不多了。
只是注意:不要用当前收益率直接排序,这就很可能把极端值的CASE选出来了,效果并不好。
比如当时没写CODE的时候,用银行APP自带的功能,选出来的就是3.23的那个高点了。。。
实际上建议用去除outlier后的平均收益。
其他的维度,我也算了alpha/beta系数,用来做参考,还没有进行进一步的数据分析。
货币基金的数据获取
数据来源:
1.货币基金列表及基金基本信息来自东方财富网。
2.基金的万分收益历史数据来自163网易。
从以下地址可以获取所有的货币基金列表:
http://fund.eastmoney.com/HBJJ_pjsyl.html
不过可能不全,余额宝以及微信的余额、招商银行的朝朝盈都不在其中,可以手动补上这些作为BASE。
基金属性信息的获取:
http://fund.eastmoney.com/000713.html
可以把那个ID换掉就是对应的基金信息了,可以在相关页面进一步抓取到持有人结构等其他感兴趣的信息。
基金历史数据的获取:
网易财经的页面爬取,分页抓,可以指定日期范围:
url='http://quotes.money.163.com/fund/lssy_'+code+'_'+str(pagen)+'.html?start='+start_date+'&end='+latest_date+'&sort=TDATE&order=desc'
数据
本次分析和每支货币基金的信息都放在网盘的EXCEL表里啦,感兴趣的同学可以一起来交流:)
链接:https://pan.baidu.com/s/1EB9K16MPdAwLas0UyRFVmA
提取码:pjj5
抓取相关代码
1.从eastmoney东方财富网抓取所有可选货币基金列表
http://fund.eastmoney.com/HBJJ_pjsyl.html
#获取货币基金列表
#moeny fund url
url='http://fund.eastmoney.com/HBJJ_pjsyl.html'
#抓取URL并返回HTML
htm = get_html_page(url)
if len(htm) == 0:
print("err get page", url)
return -1
sub_soup = BeautifulSoup(htm, "html.parser")
divs = sub_soup.find_all(name='table', attrs={
"id": "oTable"})
if len(divs) == 0:
print("err paser page:", url)
return -1
trs = divs[0].find_all(name='tr', attrs={
"bgcolor": "#F5FFFF"})
for k in range(0, len(trs)):
tds=trs[k].find_all('td')
code = tds[3].get_text()
if len(code) == 0:
print("err get code format len"