Python在基金定投上的验证

论坛 期权论坛 期权     
Python爱好者社区   2019-6-9 21:25   3462   0


作者:Samshare
公众号:SAMshare


个人兴趣专栏  
本期对于股市基金定投进行一次分析,Idea源于邢不行的文章,链接见reference~
Index
[h1][/h1]
  • 常见基金介绍
  • 基金定投介绍
  • 基金选择方法
  • 指数基金验证
  • 总结与后续动作

[h1] 常见基金的介绍[/h1]我们可以在证券交易所上进行交易的基金主要分为三类:
1、ETF基金
交易型开放式指数基金,通常又被称为交易所交易基金(Exchange Traded Funds,简称“ETF”),是一种在交易所上市交易的、基金份额可变的一种开放式基金,投资者可以在ETF市场价格与基金单位净值之间存在差价时进行套利交易。根据投资方法的不同,ETF可以分为指数基金和积极管理型基金,国外绝大多数ETF是指数基金。目前国内推出的ETF也是指数基金。ETF指数基金代表一篮子股票的所有权,是指像股票一样在证券交易所交易的指数基金,其交易价格、基金份额净值走势与所跟踪的指数基本一致。因此,投资者买卖一只ETF,就等同于买卖了它所跟踪的指数,可取得与该指数基本一致的收益。通常采用完全被动式的管理方法,以拟合某一指数为目标,兼具股票和指数基金的特色。
2、LOF基金
英文全称是"Listed Open-Ended Fund",汉语称为"上市型开放式基金"。也就是上市型开放式基金发行结束后,投资者既可以在指定网点申购与赎回基金份额,也可以在交易所买卖该基金,类似于股票买卖。
3、封闭式基金
封闭式基金(Closed-end Funds),是指基金发行总额和发行期在设立时已确定,在发行完毕后的规定期限内发行总额固定不变的证券投资基金。封闭式基金的投资者在基金存续期间内不能向发行机构赎回基金份额,基金份额的变现必须通过证券交易场所上市交易。基金单位的流通采取在证券交易所上市的办法,投资者日后买卖基金单位,都必须通过证券经纪商在二级市场上进行竞价交易。

[h1] 基金定投(AIP)的介绍[/h1]基金定投(automatic investment plan )是定期定额投资基金的简称,是指在固定的时间(如每月8日)以固定的金额(如500元)投资到指定的开放式基金中,类似于银行的零存整取方式。人们平常所说的基金主要是指证券投资基金。
基金定期定额投资具有类似长期储蓄的特点,能积少成多,平摊投资成本,降低整体风险。它有自动逢低加码,逢高减码的功能,无论市场价格如何变化总能获得一个比较低的平均成本, 因此定期定额投资可抹平基金净值的高峰和低谷,消除市场的波动性。只要选择的基金有整体增长,投资人就会获得一个相对平均的收益,不必再为入市的择时问题而苦恼。

[h1] 基金选择方法[/h1]基金选择,我这里分成两类:
第一是指数基金,主要还是关注大盘指数,如宽指基金,包括上证50、沪深300、中证100、中证200、中证500、中证1000、中小板指、创业板指。
第二是混合型基金,包含股票型基金、债券型基金和货币市场基金。
这里基金选择的方式,我是参照公众号复利人生的基金选择方法,这里简单挑几点说一下:
1)看基金业绩。通过查看基金的排名,筛选出近五年、近三年、近一年、近半年等阶段,业绩表现排名前列的基金。
2)看阶段涨幅,季度/年度涨幅。建议大家选择成立时间够长,经历过牛市、熊市、震荡市的考验,各种市场表现都比较优秀的基金。
3)基金经理业绩。记得挑选优秀基金经理,但记得如果换了基金经理后可能会一蹶不振。所以,如果换人的话,我们要考察下现任基金经理的投资风格和过往业绩,由此来决定是否继续持有。
4)看基金所持有股票和行业配置。如果你看好某一行业或者某类股票,可以选择主要投资这些行业或股票的基金。比如你很看好乐视网的话,可以买目前重仓这一股票的富国低碳环保,反之亦然,认为乐视网是个雷的话,就要避开富国低碳环保。如果你看好互联网+的话,可以买汇添富社会责任,互联网+正是它主要配置的行业。
5)看机构认可度。通过分析机构对一只基金长期的持仓比例变化,能够看出该基金是否得到了专业机构投资者的认可。
这里不多讲原理了,有兴趣的可以自己多去了解,相信网上有很多这方面的文章,本文主要以指数型基金来展开。

[h1] 指数基金验证[/h1]为了不构成购买引导,我就不按照上面的原理进行基金选择了,我直接选择2个宽指基金,即000001上证综指 和 399001深证成指,作为后续代码验证。
在进行验证之前,有几个名词需要了解:
1)基金单位净值
指当前的基金总净资产除以基金总份额。其计算公式为:基金单位净值=总净资产/基金份额。可以理解为单价,其算法有很多,我们就先取最简单的。
2)银行定期存款利率
定期存款的利率是指存款人按照定期的形式将存款存放在银行,作为报酬,银行支付给存款人定期存款额的报酬率。定期存款是银行与存款人双方在存款时事先约定期限、利率,到期后支取本息的存款。它具有存期最短3个月,最长5年,选择余地大,利息收益较稳定的特点。
如果存款人在未满约定储蓄期限的时候提取定期存款,银行通常会有两种取款方式:
  • 已期满:存期届满按照约定利率
  • 未期满:提前支取按照活期利率或者靠档利率
例如:三年定期存款,存款利率是4%。如果存满三年去取,利率就按照4%执行。如果不满三年去取,那么有可能按照活期利率0.35%执行,也有可能按照靠档利率执行。
(所谓靠档利率,就是满足下一档存期的利率。比如,已经满了两年就按照两年存款利率3%执行,满了一年就按照一年存款利率2%执行,以此类推。)
以下为2019年部分银行的定期存款利率:


3)年化利率
年化利率是通过产品的固有收益率折现到全年的利率。假设某金融产品收益期为a年,收益率为b,那么年化利率r,那么r=(1+b)^a-1
所以年化利率不仅和收益率有关,还和投资天数有关,因此我们可以看到,余额宝的收益是每天都在变化。(刚刚看了下,现在只有2.3%♂)

[h3]1)数据获取 [/h3]这里采用Python的tushare库来对股票指数数据进行获取,更多用法可以上其官网进行查看哦(http://tushare.org/trading.html#id2)
  1. 1# 设置token 2ts.set_token('your token') 3 4# 初始化接口 5pro = ts.pro_api() 6 7# 获取基本信息 8sh_basic = pro.index_basic(market='SSE') # 上交所 9sz_basic = pro.index_basic(market='SZSE') # 深交所101112'''13名称:描述14ts_code:TS指数代码15trade_date:交易日16close:收盘点位17open:开盘点位18high:最高点位19low:最低点位20pre_close:昨日收盘点21change:涨跌点22pct_chg:涨跌幅(%)23vol:成交量(手)24amount:成交额(千元)25'''2627# 000001.SH 上证综指28# 399001.SZ 深证成指29data_sh = pro.index_daily(ts_code='000001.SH', start_date='19901219', end_date='20190401')30data_sz = pro.index_daily(ts_code='399001.SZ', start_date='19901219', end_date='20190401')31data_sh.head()
复制代码
[h3]2)数据处理 [/h3]这里直接读取tushare接口的数据,简单对日期、理财净值等进行处理。为了简单计算,理财产品的年化利率我假设为5%。

  1. 1data = data_sh.copy() 2data = data.loc[:,['open','trade_date']] 3data['date'] = data['trade_date'].apply(lambda x:datetime.strptime(x,'%Y%m%d')) 4data = data.set_index('date').sort_index() 5data['理财利率'] = (4.0/100+1)**(1.0/250)-1  # 假设理财产品的年化收益率为 5% 6data['理财收益_净值'] = (data['理财利率']+1).cumprod() 7 8# 选择每个月的最后一个交易日进行定投 9trading_day = data.resample('M', kind='date').last()1011# 定投指数基金12AIP = pd.DataFrame(index=trading_day.index)13AIP['定投金额'] = 20001415# 以基金当天的开盘价作为当天买入的价格16AIP['基金价格'] = trading_day['open']17AIP['购买基金份额'] = AIP['定投金额']/AIP['基金价格']18AIP['累计基金份额'] = AIP['购买基金份额'].cumsum()1920# 定期购买理财产品21AIP['购买理财产品份额'] = AIP['定投金额']/trading_day['理财收益_净值']22AIP['累计理财产品份额'] = AIP['购买理财产品份额'].cumsum()2324# 累计投入本金25AIP['累计定投本金'] = AIP['定投金额'].cumsum()2627# 计算每个交易日的本息(即本金+利息,公式=当天的份额 X 当天的基金价格)28result = pd.concat([trading_day, AIP], axis=1)29result['基金本息'] = (result['open'] * result['累计基金份额']).astype('int')30result['理财本息'] = (result['理财收益_净值'] * result['累计理财产品份额']).astype('int')31result.head(10)
复制代码
[h3]3)数据总览 [/h3]这里我们看一下上证综指的历史走势及我们投资的走势情况。

  1. 1# 开始画图 2x_axix = result.index 3 4fig, ax1 = plt.subplots() 5ax2 = ax1.twinx() 6ax1.plot(x_axix, result['open'], color='green', label='大盘走势') 7ax2.plot(x_axix, result['基金本息'], color='skyblue', label='指数基金收益') 8ax2.plot(x_axix, result['理财本息'], color='blue', label='理财产品收益') 9ax2.plot(x_axix, result['累计定投本金'], color='yellow', label='累计定投本金')1011plt.legend() # 显示图例1213ax1.set_xlabel('定投日期')14ax1.set_ylabel('大盘指数', color='g')15ax2.set_ylabel('投资收益', color='b')16plt.show()
复制代码
及其收益比较情况:

  1. 1x_label = ['1-基金本息同比本金','2-理财本息同比本金','3-本金同比本金','4-基金本息同比理财本息'] 2y_value = [round(result['基金本息'][-1]/result['累计定投本金'][-1] -1,2), 3           round(result['理财本息'][-1]/result['累计定投本金'][-1] -1,2), 4           round(result['累计定投本金'][-1]/result['累计定投本金'][-1] -1,2), 5           round(result['基金本息'][-1]/result['理财本息'][-1] -1,2)] 6 7plt.plot(x_label, y_value) 8plt.xlabel("同比项目") 9plt.ylabel("比值")10plt.title("收益同比比较图")1112# 设置数字标签13for a, b in zip(x_label, y_value):14    plt.text(a, b, b, ha='center', va='bottom', fontsize=13)15plt.show()
复制代码
[h3]4)想法验证 [/h3]Q1:指数基金定投与理财产品哪个更好呢?
Q2:定投多久才能体现定投的“威力”?
对于以上的两个问题,我组合起来验证一下,验证之前,先把之前的代码进行封装,方便后续调用:
  1. 1def AIP(data,start,end,money): 2    ''' 3    data:从tushare下载的数据集 4    start:定投开始时间,yyyy-mm-dd 5    end:定投结束时间,yyyy-mm-dd 6    money:定投金额(每月) 7 8    ''' 9    data = data.loc[:,['open','trade_date']]10    data['date'] = data['trade_date'].apply(lambda x:datetime.strptime(x,'%Y%m%d'))11    data = data.set_index('date').sort_index()12    data['理财利率'] = (5.0/100+1)**(1.0/250)-1  # 假设理财产品的年化收益率为 5%13    data['理财收益_净值'] = (data['理财利率']+1).cumprod()14    data = data[start:end]1516    # 选择每个月的最后一个交易日进行定投17    trading_day = data.resample('M', kind='date').last()1819    # 定投指数基金20    AIP = pd.DataFrame(index=trading_day.index)21    AIP['定投金额'] = int(money)2223    # 以基金当天的开盘价作为当天买入的价格24    AIP['基金价格'] = trading_day['open']25    AIP['购买基金份额'] = AIP['定投金额']/AIP['基金价格']26    AIP['累计基金份额'] = AIP['购买基金份额'].cumsum()2728    # 定期购买理财产品29    AIP['购买理财产品份额'] = AIP['定投金额']/trading_day['理财收益_净值']30    AIP['累计理财产品份额'] = AIP['购买理财产品份额'].cumsum()3132    # 累计投入本金33    AIP['累计定投本金'] = AIP['定投金额'].cumsum()3435    # 计算每个交易日的本息(即本金+利息,公式=当天的份额 X 当天的基金价格)36    result = pd.concat([trading_day, AIP], axis=1)37    result['基金本息'] = (result['open'] * result['累计基金份额']).astype('int')38    result['理财本息'] = (result['理财收益_净值'] * result['累计理财产品份额']).astype('int')39    return result4041def showme_all(result):42    plt.rcParams['figure.figsize'] = (10.0, 4.0) # 设置figure_size尺寸43    plt.rcParams['image.interpolation'] = 'nearest' # 设置 interpolation style44    plt.rcParams['image.cmap'] = 'gray' # 设置 颜色 style45    plt.rcParams['savefig.dpi'] = 100 #图片像素46    plt.rcParams['figure.dpi'] = 100 #分辨率4748    #开始画图49    x_axix = result.index5051    fig, ax1 = plt.subplots()52    ax2 = ax1.twinx()53    ax1.plot(x_axix, result['open'], color='green', label='大盘走势')54    ax2.plot(x_axix, result['基金本息'], color='skyblue', label='指数基金收益')55    ax2.plot(x_axix, result['理财本息'], color='blue', label='理财产品收益')56    ax2.plot(x_axix, result['累计定投本金'], color='yellow', label='累计定投本金')5758    plt.legend() # 显示图例5960    ax1.set_xlabel('定投日期')61    ax1.set_ylabel('大盘指数', color='g')62    ax2.set_ylabel('投资收益', color='b')63    plt.show()6465def showme_rate(result):66    x_label = ['1-基金本息同比本金','2-理财本息同比本金','3-本金同比本金','4-基金本息同比理财本息']67    y_value = [round(result['基金本息'][-1]/result['累计定投本金'][-1] -1,2),68               round(result['理财本息'][-1]/result['累计定投本金'][-1] -1,2),69               round(result['累计定投本金'][-1]/result['累计定投本金'][-1] -1,2),70               round(result['基金本息'][-1]/result['理财本息'][-1] -1,2)]7172    plt.plot(x_label, y_value)73    plt.xlabel("同比项目")74    plt.ylabel("比值")75    plt.title("收益同比比较图")7677    # 设置数字标签78    for a, b in zip(x_label, y_value):79        plt.text(a, b, b, ha='center', va='bottom', fontsize=13)80    plt.show()8182def showme_money(result):83    return result.loc[:,['累计定投本金','基金本息','理财本息']].tail(1)
复制代码

4.1 短期定投(1-2年内)
4.1.1 定投开始和定投结束的指数水平差不多(V字形)
可以看到,对于震荡行情,特别是先跌后涨,短期的理财产品确实是赚不了多少钱,3%左右,而指数基金定投的话,收益还是蛮不错的,从数据上看,可以达到50%,相当不错。
  1. 1# 定投开始和定投结束的指数水平差不多2result = AIP(data_sz,'2008-04-01','2009-07-30',1000)3showme_all(result)4showme_rate(result)5showme_money(result)
复制代码




4.1.2 定投开始和定投结束的指数水平单调递增
这种属于想都不用想的情况,肯定是入市买基金好过买理财产品的。我故意选择了上涨行情尾部有回调的情况,也是可以看出买基金会比买理财好。
  1. 1# 指数单调递增2result = AIP(data_sz,'2007-01-01','2008-01-30',1000)3showme_all(result)4showme_rate(result)5showme_money(result)
复制代码




4.1.3 定投开始和定投结束的指数水平单调递减
这个也是一个比较简单的选择,熊市下行阶段,可以买入,但是得等指数回调才可以抛哦,这里的假设是不等回调就直接抛售,切不可取!不信可以看看数据。
  1. 1# 指数单调递减2result = AIP(data_sz,'2008-01-01','2009-01-30',1000)3showme_all(result)4showme_rate(result)5showme_money(result)
复制代码





4.2 中期定投(2-5年内)
4.2.1 定投开始和定投结束的指数水平差不多(V字形)
这个也是买入点和卖出点的指数水平差不多,但是卖出前是经历了一波下跌的,可以看到其收益也大打折扣,这里引发一个思考:是不是需要设置一个止盈位置呢?
另外,中期的理财收益也慢慢可以接近10%了。
  1. 1# 定投开始和定投结束的指数水平差不多2result = AIP(data_sz,'2001-10-01','2004-11-30',1000)3showme_all(result)4showme_rate(result)5showme_money(result)
复制代码




4.2.2 定投开始和定投结束的指数水平单调递增 or单调递减
这里不再过多讨论。

4.3 长期定投(5年以上)
4.3.1 定投开始和定投结束的指数水平差不多(V字形)
长期投资,从整体上看,投资基金指数还是略胜于理财产品的。
  1. 1# 定投开始和定投结束的指数水平差不多2result = AIP(data_sz,'2007-10-01','2015-06-30',1000)3showme_all(result)4showme_rate(result)5showme_money(result)
复制代码




4.3.2 定投开始和定投结束的指数水平单调递增or单调递减
这里不再过多讨论。

[h1] 总结及后续动作[/h1][h3]1)总结[/h3]这里通过对上证综指的历史数据的模拟投资,得出以下的一些个人观点:
1: 行情震荡,可以定投买入指数基金,无论是短中长期投资;
2: 定投需要设置止盈点,不然收益“冻过水”;
(粤语:意思为收益全无,为夸张手法)
3: 定投了,在下跌过程中不要慌,持续按计划买入,等待指数回调的那天到来;
4: 定投时间越久,收益会更加吸引;

[h3]2)后续验证动作[/h3]对于以上的分析,自己也多了一些疑惑点需要进一步去验证:
2.1 上涨行情与下跌行情,是否需要改变定投金额来优化收益?
2.2 定投设立多少的止盈点较为合适?
2.3 未达到预期止盈点,行情开始下行,何时应该止盈?
2.4 随机设置定投开始位置,预测最优定投周期?
欢迎等待下一篇文章。
感谢阅读
推荐阅读:
1:漫话:程序员要失业了??!机器人开始在GitHub上修Bug了。
2:非科系大学生如何学编程?
3:阿里入职的第一年,这是你想要的职场生活吗?
4:2018年Python爱好者社区历史文章合集(作者篇)
5:2018年终精心整理|Python爱好者社区历史文章合集(类型篇)



分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:155
帖子:32
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP