用数据来分析基金定投的真相!

大家好,我是小一

基金定投,想必都不陌生吧,但是很多人都会遇到一个终极问题

每周一定投还是周四定投?月中定投还是月末定投?

到底哪种方式收益率更高,如何选择?今天,我们不妨以量化研究的方式来探索基金定投的真相,一起揭秘这个看起来很难的问题!

接下来,就是用数据说话的时候!!

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()

绘图如下:

57c1844e10c1a2b0b5f16c6335e9ade9.png

常见的基金定投方式有:每周定投、每月定投。今天我们不妨多对比几种定投方式,看看不同的定投方式到底能不能提高收益率。

所以,后面我们会对六种定投方式进行对比分析,他们分别是:每周定投、每两周定投、每月定投、每两月定投、每季度定投、每年定投

先对数据进行处理:

# 处理数据的时间
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 = ['每周定投', '每两周定投', '每月定投', '每两月定投', '每季度定投', '每年定投']

处理之后的数据如下:

ce2069cd0e52e04f697a36aec52fefd5.png

绘制图表如下:

61b9165b940f03c6ee1a45d0dabfaa66.png

通过上图可以看出,

其中,在收益最大的2014年

0e9a92e4b5cfc925f1b7b1551bcea0f3.png

在6种定投方式中,两月定投收益>季度定投>年定投收益。

有意思的是,年定投收益>周定投>两周定投>月定投

也就是说,在2014年年初买入拿着不动的,就可以战胜60%的定投方式

此外,在收益最惨的2018年

9df4d5f0a35b2f00f78cd18b3b72ce16.png

在6种定投方式中,年定投收益亏损26.34%,其余5种定投方式亏损程度相近,平均亏损16%,远小于年定投亏损

最后,在2013年、2015年、2016年和2021年,年定投收益均小于其他5种定投方式

而其他5种定投方式中,收益率大概呈现:周>2周>月>2月>季度 的规律。换句话说,在震荡行情中,周定投相对其他定投方式的收益更高一点点,亏损也更小一点点。

再来看一下近11年的总收益情况

f85271f6298fc03b8074a0c3fe6769d0.png

年定投的方式可以拿到最高收益73.86%、每月定投的方式收益最少63.18%

 

总结一下:

年定投的方式,我们都知道,就是年初买入,年末卖出,其实也就是一直持有的意。但是通过对比,我们发现,在不同的行情中,不同的定投方式收益不一,其中:

  • 每周定投和每月定投的效果差不多;

  • 在大牛市中,定投的收益相比指数较差一些

  • 在大跌中,定投可以减小一半的损失,但也无法避免亏损的结果;

  • 在小震荡市中,定投可以避免损失,但收益也有限

说白了,就是上涨过程中,定投收益较差;在小跌过程中,定投亏损较少。

一句话:在牛市中,定投收益减半;在熊市中,定投亏损减半;而在小震荡和大震荡中行情中,定投==瞎忙活。

而从大A近些年的走势也能看出,震荡多,大行情少。要是定投了某一指数,保本的话问题不大,但是要想翻倍,那就真的需要极大的运气了。

不过,还是可以从两个方向去提高定投收益率,后续我也会持续分享这两个方向的一些研报和复现文章。

首先是:①行业研究

针对行业进行深入研究,在行业景气度上升的时候开始入场,并在行业景气度停滞/下滑的时候切换至其他景气度上升的行业。在此过程中,一直保持同样频率的定投,提高收益率。

其次是:②做好择时

根据市场风向和行业走势,以及某些特征因子的大小,制定择时策略,在合适的时间开始定投,在不合适的时间停止定投,以此往复,提高收益率。

以上。

👆关注和星标,学习更多数分&量化知识

对了,我最近正在结合数据分析研究一些量化策略。但是因为一个好的模型,往往会需要对历史十几年的数据进行回测来验证,涉及的数据也比较多,所以会写的慢一些

感兴趣的不妨看看之前的几篇文章,也简单了解一下量化:

>值得一读的实战策略

18张图,我发现了国庆节的赚钱效应...

比普通定投高20%的支付宝智能定投策略

根据成交量去买入个股,能不能赚钱?

基于北向资金的择时买入卖出策略复现

爬取了14455个已发行基金用来做理财分析

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
基金策略通常是每月入一金额的资金到指基金中,以长期持有为目的,实现稳健增长的资目标。下面是一个简单的 Python 实现。 首先,你需要导入 pandas 和 matplotlib 库。 ```python import pandas as pd import matplotlib.pyplot as plt ``` 然后,你需要下载历史基金净值数据,可以使用 tushare 库来获取数据。 ```python import tushare as ts # 假设你要获取“易方达蓝筹精选混合”基金的净值数据 fund_code = '110022' df = ts.get_k_data(fund_code, start='2010-01-01') ``` 接下来,你需要计算每月的金额,以及每个月购买的基金份额。 ```python # 假设你每个月 1000 元 monthly_investment = 1000 # 计算每个月购买的基金份额 df['month'] = pd.to_datetime(df['date']).dt.to_period('M') df['monthly_amount'] = monthly_investment df['monthly_share'] = monthly_investment / df['close'] ``` 然后,你需要计算后的基金价值,以及每月后的累计收益。 ```python # 计算后的基金价值 df['total_share'] = df['monthly_share'].cumsum() df['total_value'] = df['total_share'] * df['close'] # 计算每月的累计收益 df['monthly_return'] = df['total_value'] / df['monthly_amount'].cumsum() - 1 ``` 最后,你可以可视化每月的累计收益情况。 ```python # 绘制每月的累计收益曲线 plt.plot(df['month'].dt.to_timestamp(), df['monthly_return']) plt.xlabel('Month') plt.ylabel('Cumulative Return') plt.title('Fund Investment Strategy') plt.show() ``` 这样,你就可以使用 Python 实现基金策略啦!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值