大家好,我是小一
基金定投,想必都不陌生吧,但是很多人都会遇到一个终极问题:
每周一定投还是周四定投?月中定投还是月末定投?
到底哪种方式收益率更高,如何选择?今天,我们不妨以量化研究的方式来探索基金定投的真相,一起揭秘这个看起来很难的问题!
接下来,就是用数据说话的时候!!
1. 背景介绍
按照惯例,先来看一下背景介绍
基金定投是定期定额投资基金的简称,说白了就是每周/每月/每年的某个固定时间点买入固定金额的基金。
举个例子,通过支付宝可以规定每月10号,用1000元钱买入天弘沪深300etf联接基金A,这就是一个定投。
通常,我们通过定投的方式来投资波动较大的基金,比如股票指数型基金。因为对于风险大、收益高的股票而言,一般人难以准确入场,往往是抄底抄到半山腰。但是对于波动比较小的货币基金和债券基金,其实买入点的选择,对收益影响不大。
ok,那今天这节就通过历史10年的数据,来分析一下定投究竟有没有用,一起了解基金定投的真相。
本文选择股市具有代表性的沪深300指数作为定投对象。观察时间是2012-01-01~2022-09-20
2、获取数据
首先是导入相关的包
因为会绘制分析图形,所以需要用到seaborn。对了,关于为什么用seaborn绘图以及怎么用,大家可以翻翻以前的文章
# 加载相关的包
from WindCharts import *
from WindPy import *
import time,datetime
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
# 声明使用 Seaborn 样式
sns.set()
# 有五种seaborn的绘图风格,它们分别是:darkgrid, whitegrid, dark, white, ticks。默认的主题是darkgrid。
sns.set_style("whitegrid")
# 有四个预置的环境,按大小从小到大排列分别为:paper, notebook, talk, poster。其中,notebook是默认的。
sns.set_context('talk')
# 中文字体设置-黑体
plt.rcParams['font.sans-serif'] = ['SimHei']
# 解决保存图像是负号'-'显示为方块的问题
plt.rcParams['axes.unicode_minus'] = False
# 解决Seaborn中文显示问题并调整字体大小
sns.set(font='SimHei')
w.start()
通过数据接口获取2012年至今的沪深300的相关数据
代码如下:
# 取数据
err, data = w.wsd("000300.SH", "open,high,low,close,volume", "2012-01-01", "2022-09-20", "", usedf=True)
data = data.dropna()
绘图如下:
常见的基金定投方式有:每周定投、每月定投。今天我们不妨多对比几种定投方式,看看不同的定投方式到底能不能提高收益率。
所以,后面我们会对六种定投方式进行对比分析,他们分别是:每周定投、每两周定投、每月定投、每两月定投、每季度定投、每年定投
先对数据进行处理:
# 处理数据的时间
data = data.reset_index()
data_y = pd.DataFrame()
data_y['day'] = data['index'].apply(lambda x:str(x)[:10])
data_y['year'] = data['index'].apply(lambda x:str(x)[:4])
data_y['close'] = data['close'].values
# 每 N 个交易日定投固定的m元, 以年末时的收盘价计算该年的收益率
def get_res(N):
Years = data_y['year'].drop_duplicates().tolist()
res = []
for y in Years: #计算每年的收益率
tmp = data_y[data_y['year'] == y]
tmp.index = np.arange(len(tmp))
buy_index = [x for x in range(len(tmp)) if (x%N == 0) and (x!=len(tmp)-1)] #获取定投的日期
buy_price = tmp.iloc[buy_index, 2].values #定投时的价格
#以年末收盘价计算该年收益率
r = (np.sum([tmp['close'].values[-1]/x for x in buy_price])-len(buy_price))/len(buy_price)
res.append(r)
all_res = (np.array(res)+1).cumprod()-1 # 用每年收益率得到累计收益率
res.append(all_res[-1])
return [round(100*x,2) for x in res]
result = pd.DataFrame()
for N in [5, 10, 21, 42, 63, 300]:
result['每{}个交易日定投'.format(N)] = get_res(N)
Years = data_y['year'].drop_duplicates().tolist()
result.index = ['{}'.format(y) for y in Years]+['累计收益率(%)']
result.columns = ['每周定投', '每两周定投', '每月定投', '每两月定投', '每季度定投', '每年定投']
处理之后的数据如下:
绘制图表如下:
通过上图可以看出,
其中,在收益最大的2014年
在6种定投方式中,两月定投收益>季度定投>年定投收益。
有意思的是,年定投收益>周定投>两周定投>月定投
也就是说,在2014年年初买入拿着不动的,就可以战胜60%的定投方式
此外,在收益最惨的2018年
在6种定投方式中,年定投收益亏损26.34%,其余5种定投方式亏损程度相近,平均亏损16%,远小于年定投亏损
最后,在2013年、2015年、2016年和2021年,年定投收益均小于其他5种定投方式
而其他5种定投方式中,收益率大概呈现:周>2周>月>2月>季度 的规律。换句话说,在震荡行情中,周定投相对其他定投方式的收益更高一点点,亏损也更小一点点。
再来看一下近11年的总收益情况
年定投的方式可以拿到最高收益73.86%、每月定投的方式收益最少63.18%
总结一下:
年定投的方式,我们都知道,就是年初买入,年末卖出,其实也就是一直持有的意。但是通过对比,我们发现,在不同的行情中,不同的定投方式收益不一,其中:
-
每周定投和每月定投的效果差不多;
-
在大牛市中,定投的收益相比指数较差一些
-
在大跌中,定投可以减小一半的损失,但也无法避免亏损的结果;
-
在小震荡市中,定投可以避免损失,但收益也有限
说白了,就是上涨过程中,定投收益较差;在小跌过程中,定投亏损较少。
一句话:在牛市中,定投收益减半;在熊市中,定投亏损减半;而在小震荡和大震荡中行情中,定投==瞎忙活。
而从大A近些年的走势也能看出,震荡多,大行情少。要是定投了某一指数,保本的话问题不大,但是要想翻倍,那就真的需要极大的运气了。
不过,还是可以从两个方向去提高定投收益率,后续我也会持续分享这两个方向的一些研报和复现文章。
首先是:①行业研究
针对行业进行深入研究,在行业景气度上升的时候开始入场,并在行业景气度停滞/下滑的时候切换至其他景气度上升的行业。在此过程中,一直保持同样频率的定投,提高收益率。
其次是:②做好择时
根据市场风向和行业走势,以及某些特征因子的大小,制定择时策略,在合适的时间开始定投,在不合适的时间停止定投,以此往复,提高收益率。
以上。
👆关注和星标,学习更多数分&量化知识
对了,我最近正在结合数据分析研究一些量化策略。但是因为一个好的模型,往往会需要对历史十几年的数据进行回测来验证,涉及的数据也比较多,所以会写的慢一些
感兴趣的不妨看看之前的几篇文章,也简单了解一下量化:
>值得一读的实战策略