当前位置: 首页 > 后端技术 > Python

一周中哪一天定期投基金比较划算?【Python统计分析】

时间:2023-03-25 22:45:57 Python

基金定投常见的方式是定期定额投资,即每周或每月固定时间向基金公司申请定额基金。基金定投可以平均成本,分散风险,实现自动投资,所以基金定投也被称为“懒人投资术”。今天主要是用python带大家分析一下。从统计数据来看,定投什么时候获利的概率最大。(本文仅供学习讨论,不作为投资建议)总体思路:选择一定时间段,模拟周一至周五定投,比较最终收益情况,确定最适合定投的时间段基金。下面详细介绍一下:第一步:网站分析,分析数据交换url以天天基金为例,随便找一个基金,打开Chrome自带的开发者工具,点下一页,找到数据传输Network选项卡界面(开发者工具的使用请参考Crossin:爬虫必备工具,掌握它就解决了一半问题。)点击这个请求,打开响应数据,没错,然后我们看url的参数Callback可以忽略,fundcode是基金的代码,pageIndex是当前页码,pageSize是返回的数据条数,这里一次返回20条,startData和endData分别为开始时间和结束时间,但都是空值,最后一个参数被忽略。第二步:requests模拟请求,正常获取数据。应该是一个for循环,逐页取数据,但是我们从第一步可以看出,url参数包含开始和结束时间,那我们可以试试,能不能忽略页码信息,获取返回的数据time为分界点,改变url结构,开始模拟请求:startDate='2018-01-13'#starttimeendDate='2020-02-28'#deadlineheader={'User-Agent':'Mozilla/5.0(WindowsNT6.1;Win64;x64;rv:69.0)Gecko/20100101Firefox/69.0','Referer':'http://fundf10.eastmoney.com/jjjz_{0}.html'。format(fundCode)}url='http://api.fund.eastmoney.com/f10/lsjz?fundCode={0}&pageIndex={1}&pageSize=5000&startDate={2}&endDate={3}&_=1555586870418?'.format(fundCode,pageIndex,startDate,endDate)response=requests.get(url,headers=header)result=json.loads(response.text)print(result)forjinresult['Data']['LSJZList']:print(j)返回的数据确实可以按照这个url结构返回数据,但是好像只有20个ite多发性硬化症。一开始以为是网站接口限制问题,最后发现是没有设置pageSize。干脆直接设置成5000,再做一遍,这样就全部出来了。第三步:建立模型,模拟固定投资,计算最终收益。具体过程如下:先将日期转化为周,然后将周一到周五进行分类。以周五定投为例,每笔定投为100,每笔定投金额按当日净值折算为一股,再与上一轮累计:合计=[0]*5#到期后的总份额count=[0]*5#j在result['Data']['LSJZList']中的每日预定投票数[::-1]:ifj['JZZZL']=='':passelse:weekday=int(datetime.strptime(j['FSRQ'],'%Y-%m-%d').weekday())DWJZ=float(j['DWJZ'])#净值total[weekday]=total[weekday]+money/DWJZcount[weekday]+=1最后根据最终净值将份额换算成金额:total_money=[]#根据份额计算总金额fort,iinenumerate(total):total_money.append(i*DWJZ)print("每周{0}定投最终金额{1}".format(t+1,i*DWJZ),"预定投票{0}times".format(count[t]))返回结果:10702.031523199748每周第一次定投的最终金额87每周f定投终数10916.72143683161689周定投终数10762.509365370352每周4次定投终数10880.68396547051688次定投5周定投终数10375.51753923354684次定投标题内容、字体颜色、字体粗细和大小plt.rcParams['font.sans-serif']=['SimHei']#Windows用于正常显示中文标签#plt.rcParams["font.family"]='宋体icodeMS'#mac用于正常显示中文标签plt.figure(figsize=(15,10),dpi=80)plt.title('{0}基金模拟定投收益图'.format(fundCode),color='blue',fontweight=800,size=50)profit_list=[round((i-100*j)/(100*j),4)fori,jinzip(total_money,count)]#之后的总利润maturityrate效果如下:2.然后用plt.bar画直方图的大小。第一个代表当天增长的概率,第二个代表当天累计增长收益。plt.bar中的label参数为图形标签,但必须使用plt.legend防止标签与图片重叠显示,调整y轴坐标范围方便查看,最后设置坐标轴粗细name_list=['星期一','星期二','星期三','星期四','星期五']x=range(len(name_list))minytick=int(min(total_money))-1000maxytick=int(max(total_money))+1000plt.bar(x,[iforiintotal_money],label='当天预定投资的最终收益',width=0.4,color='y')#参数m,m2,r用来调整高度比m=sum(total_money)/5m2=min(profit_list)r=50000plt.bar([i+0.4foriinx],[(i-m2)*r+mforiinprofit_list],label='thisdayFixedinvestmentrateofreturn',width=0.4,color='r')plt.legend(loc="upperleft")#防止标签和图片重叠无法显示plt.xticks(x,name_list,size=20)#x坐标plt.ylim(minytick,maxytick)plt.yticks(range(minytick,maxytick,200),size=20)#y坐标ax=plt.gca();#获取坐标轴的句柄ax.spines['left'].set_linewidth(3);####设置左轴的粗细ax.spines['bottom'].set_linewidth(3);###设置底轴粗细3.完善zip(x,total_money,count)中a,b,c的labels,grids,text等设置:plt.text(a,b+0.05,'%.1f'%b,ha='center',va='bottom',fontsize=15)plt.text(a,b+100,'固定{}次'.format(c),ha='center',va='bottom',fontsize=15,color='r')fora,binzip(x,profit_list):plt.文本(一个+0.4,(b-m2)*r+m,'%.4f'%b,ha='center',va='bottom',fontsize=15)plt.text(2,maxytick+300,'时间:{0}to{1}'.format(startDate,endDate),fontsize=20)plt.grid(axis="y")#Generategrid'''第五步:统计分析我们先尝试多画几个不同的不同时间段基金情况的柱状图:仅从几个例子中很难看出什么规律,所以进一步,我们随机抽取10只基金,再随机抽取10个时间段,绘制散点图收益分布,并计算平均值:从以上统计结果来看,周四和周五定时投资的收益通常要大于周一和周二定时投资的收益。不过我们这里选取的数据量并不多,大家也可以自己在代码中添加更多的基金代码和测试时间。当然,本次演示的结果仅供参考。股市是不可预测的,不可能完全预测。请谨慎操作。------欢迎搜索关注:Crossin的编程课堂,更多精彩在这里。一起学习,走得更远