共计 3653 个字符,预计需要花费 10 分钟才能阅读完成。
基金定投 常见的一种形式是定期定额投资,即每周或每月固定的时间段,向基金公司申购固定份额的基金。基金定投能够均匀老本、扩散危险,实现主动投资,所以基金定投又称为“懒人投资术”。明天次要用 python 带大家剖析一下,从统计数据上来看,到底什么时候定投取得收益的概率最大。
(本文为学习探讨,不作为投资倡议)
整体思路:选取肯定的时间段,别离模仿周一至周五定投,比拟最终受害状况,确定基金定投最合适的工夫。
上面开始具体介绍:
第一步:网站剖析,剖析数据交换 url
以天天基金网为例,轻易找一只基金
关上 Chrome 自带的开发者工具,点击下一页,从 Network 分页里找到数据传输接口(对于开发者工具的应用,可参见 Crossin:爬虫必备工具,把握它就解决了一半的问题)
点击此申请,关上响应数据
就是它没错了,接着咱们看看该 url 的参数
Callback 能够疏忽,fundcode 为该基金代码,pageIndex 为以后页码,pageSize 为返回数据条数,这里一次返回 20 条,startData 和 endData 别离为起始工夫和终止工夫,然而都为空值,最初一个参数也不必管。
第二步:requests 模仿申请,失去数据
失常状况,应该是 for 循环,一页一页的取数据,然而咱们从第一步能够看到,该 url 参数中含有起始、截止工夫,那咱们能够试试,能不能疏忽页码信息,以工夫为截点失去返回数据,改一下 url 构造,开始模仿申请:
startDate = '2018-01-13' #起始工夫
endDate = '2020-02-28' #截止工夫
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:69.0) Gecko/20100101 Firefox/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)
for j in result['Data']['LSJZList']:
print(j)
返回数据为
的确能按此 url 构造返回数据,然而貌似只有 20 条,起初还认为是网站接口限度问题,最初发现是 pageSize 没有设置,索性间接设置为 5000,再来一次
这样就全进去了。
第三步:结构模型,模仿定投计算最终收益
具体过程如下:
先将日期转换为星期,而后将周一至周五分类,以周五定投为例,每次定投 100,将每次定投金额按当天净值转化为份额,而后与之前份额累加:
total = [0] * 5 # 到期后总份额
count = [0] * 5 # 每日定投次数
for j in result['Data']['LSJZList'][::-1]:
if j['JZZZL']=='':
pass
else:
weekday = int(datetime.strptime(j['FSRQ'], '%Y-%m-%d').weekday())
DWJZ = float(j['DWJZ']) # 净值
total[weekday] = total[weekday]+money/DWJZ
count[weekday] += 1
最初依据最初的净值将份额转化为金额:
total_money=[] #依据份额算出总金额
for t, i in enumerate(total):
total_money.append(i*DWJZ)
print("周 {0} 定投最终金额 {1}".format(t+1, i*DWJZ), "定投{0} 次".format(count[t]))
返回后果:
周 1 定投最终金额 10702.031523199748 定投 87 次
周 2 定投最终金额 10916.721436831616 定投 89 次
周 3 定投最终金额 10762.509365370352 定投 87 次
周 4 定投最终金额 10880.683965470516 定投 88 次
周 5 定投最终金额 10375.517539233546 定投 84 次
第四步: 用 matplotlib 画柱状图
1. 首先设置失常显示中文标签,SimHei 为中文字体,用 plt.figure 建 1 个 15×8 的画布,设置题目内容、字体色彩、字体粗细及大小
plt.rcParams['font.sans-serif'] = ['SimHei'] # windows 用来失常显示中文标签
# plt.rcParams["font.family"] = 'Arial Unicode MS' # 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) for i, j in zip(total_money, count)] # 到期后总收益率
成果如下:
2. 而后用 plt.bar 画柱状图大小,第一个代表该日增长的概率,第二个为该日累计增长的收益,plt.bar 内的 label 参数为图签,然而要用 plt.legend 放止图签与图像重合显示不进去,调整 y 轴坐标范畴以便于查看,最初设置坐标轴粗细。
name_list = ['周一', '周二', '周三', '周四', '周五']
x = range(len(name_list))
minytick=int(min(total_money))-1000
maxytick=int(max(total_money))+1000
plt.bar(x, [i for i in total_money], label='该日定投最终收益', width=0.4, color='y')
# 参数 m、m2、r 用来调整高度比例
m = sum(total_money) / 5
m2 = min(profit_list)
r = 50000
plt.bar([i+0.4 for i in x], [(i-m2)*r + m for i in profit_list], label='该日定投收益率', width=0.4, color='r')
plt.legend(loc="upper left") # 避免 label 和图像重合显示不进去
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. 欠缺标签、网格、文字等设置
for a, b, c in zip(x, total_money, count):
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')
for a, b in zip(x, profit_list):
plt.text(a+0.4, (b-m2)*r + m, '%.4f' % b, ha='center', va='bottom', fontsize=15)
plt.text(2, maxytick+300, '工夫:{0}至{1}'.format(startDate, endDate), fontsize=20)
plt.grid(axis="y") #生成网格 '''
第五步:统计分析
咱们先多尝试几只不同基金不同时段的状况,画出直方图:
仅从几个个例很难看出什么法则。所以进一步的,咱们随机选 10 支基金,再随机选 10 个时间段,画出收益散布的散点图,并计算出平均值:
从上述的统计后果中来看,周四、五定投的收益通常要大于周一、周二定投的收益。
不过咱们这里选取的数据量并不多,你也能够本人在代码中减少更多的基金代码和工夫来测试。
当然咯,此演示后果仅作为参考,股市变化莫测,不可能齐全预测,请大家审慎操作。
——
欢送搜寻及关注:Crossin 的编程教室
这里还有更多精彩。一起学,走得远