最近几年微信公众号、头条、微博好多地方都有人喂鸡汤,基金定投财富自由什么的,我今天仔细做了下分析,根本就是骗人的。 先说结果,无脑基金定投别说跑不赢通胀,连银行定期存款都跑不赢,不择时不止盈的定投不可取。
这次专题就是利用python的数据分析功能计算基金定投的收益,这个专题比较简单,适合python数据分析入门的伙伴,下个专题我再往深的做,研究如果用python计算最佳的基金定投策略。
数据源:通过API接口从网易财经上进行调取http://quotes.money.163.com/service/chddata.html?code=0000016&start=19901219&end=20200228&fields=TCLOSE;HIGH;LOW;TOPEN;LCLOSE;CHG;PCHG;VOTURNOVER;VATURNOVERquotes.money.163.com
直接成为链接了,我加上引号‘http://quotes.money.163.com/service/chddata.html?code=0000016&start=19901219&end=20200228&fields=TCLOSE;HIGH;LOW;TOPEN;LCLOSE;CHG;PCHG;VOTURNOVER;VATURNOVER’ 这里0000001指的是上证指数。注意这串数字要分0和000001两部分看。0代表sh,1代表sz。所以0000001其实是sh000001的意思。同理,0 000300也就是sh000300 沪深300的代码。后面的start和end没什么问题。fields选项中,TCLOSE,HIGH,LOW,TOPEN分别表示当日的收盘,最高,最低,开盘价;LCLOSE表示昨日收盘价。CHG,PCHG,VOTURNOVER,VAT分别表示涨跌额,涨跌幅,成交量,成交金额。
取到数据后,然后我们用python写程序来计算定投的收益。
首先先把需要的模块调用起来
import operator as op
from datetime import datetime,timedelta
这两句是调用两个模块,op那个是运算符, datetime是时间 后面timedelta是时间格式 python最大的优点就是很多的模块里面有很多的函数可以直接使用,不再需要自己编写。
接下来需要一个读取数据的函数,我把数据源文件都放到一个专门的文件夹里方便调取。
(我直接截图吧,程序黏贴过来格式就变了)这个函数主要就是读取数据,并且取出我们需要的对应列的数值。这个函数是购买基金函数,date投资日期,amount投资金额,data指数的日志索引函数,用来获取最终的指数值投资函数,feq是几天投资一次
前面三个函数其实都是给 invest函数服务的,我们最终的变量输入也是直接传递到invest函数里面的,下面就是具体输入和计算的代码。具体验证时很简单,我们就改start_date和end_date 还有1000和14这两个值就可以,需要计算其他指数时就把第一个参数0000001改为对应的指数代码就可以
先看个10年的对比:
定投10年上证指数,累计的收益率仅仅10.33%,如果按照复利算,每年不到1%
再看20年上证指数,收益率能高一点,但是20年累计不到40%,这不是在开玩笑么?5年定期存款基准利率都年化3.6了。。。。。
然后我们在看下深证指数10年累计收益19.26%比上证略高,20年达到了90%,恭喜终于跑赢了银行定期存款。(其实银行定期存款计算复利20年也能超过90%的)
接下来看下创业板,创业板就只有10年的了,创业板10年收益率达到了75%。
好了,可以做个大概的总结了,有兴趣的伙伴可以把上证50 沪深300 创业板50 中证100等等指数都算一遍,我简单说下我的总结。
无脑定投不可取,波动越激烈的指数,定投收益率越高,如果不想操心建议定投创业板,未来有科创板基金建议定投科创板+创业板。
这期简单介绍了一个python计算基金定投收益的方法,python还是挺好用的,如果你用excel自己算恐怕要算死了,代码其实很简单也很好理解。下一期我计划用python尝试去找出最佳的定投投资策略。下面是本期的代码
import operator as op
from datetime import datetime,timedelta
def load(index_no, start_date, end_date):
file = 'D:/python/' + index_no + '.csv'
f = open(file,'r')
indices = {}
for line in f.readlines():
arr = line.strip().split(',')
dt = arr[0]
indices[arr[0]] = arr[3]
return indices
def purchase(date, amount, data):
index_value = data[date]
return amount/float(index_value)
def getIndexValue(date,data):
return data[date]
def invest(index_no,start_date, end_date, amount, feq):
data = load(index_no,start_date,end_date)
sd = datetime.strptime(start_date, '%Y-%m-%d')
ed = datetime.strptime(end_date, '%Y-%m-%d')
curr = sd
total_share = 0; total_amount = 0;total_profit=0
last_index = 0
while True:
#如果当天不是交易日,则往后延一天.
while curr.strftime('%Y-%m-%d') not in data.keys():
curr += timedelta(days = 1)
if curr > ed: break
if curr > ed: # 超过结束日期则停止
break
last_index = float(getIndexValue(curr.strftime('%Y-%m-%d'),data))
#购买基金
shares = purchase(curr.strftime('%Y-%m-%d'), amount, data)
total_share += shares
total_amount += amount
#计算下一个投资日期
curr = curr + timedelta(days = feq)
total_profit = last_index*total_share - total_amount
return total_amount,total_profit
start_date = '2010-01-01'
end_date = '2020-02-28'
total_amount,total_profit = invest('399006',start_date, end_date,500,7)
print('起投日期',start_date)
print('结束日期',end_date)
print('总投资额',total_amount)
print('总收益',round(total_profit))
print('投资收益率',round(total_profit/total_amount*100,2),"%")