作者:幻好
来源:恒生LIGHT云社区
最近几年,越来越多的年轻人开始接触基金,购买基金定投理财,本文将通过数据验证指数定投是否真的有效。
背景简述
1993 年巴菲特在《致投资者的信》中首次提到了他的建议,原话是“通过定期投资指数基金,一个什么都不懂的投资者通常都能打败大部分的专业基金经理”。
定期投资指数基金,指的是在固定的时间,以固定的金额,投资到指定的开放式基金中,这是懒人投资理财的最佳方法。这种方式通过积少成多,聚沙成塔,分散和平摊风险,不会因股票市场的一时波动影响正常的生活和情绪。在交易市场中,由于指数编制的方式,指数上涨是大概率事件,这也符合投资是追求确定性的要义。
通过背景介绍,让我们对于指数定投有了一个基本的理解,然而以上说法都是从概念上对于指数定投的相关理解,如果要让人们真正的信服,还需要有真实的数据作为支撑。
概念介绍
讲到指数定投,就不得不先聊聊经常谈到的重要指数:沪深 300,上证 50,中证 500。对于没了解过的人可能只会认为这是大盘指数,并不知道这三者的关系和区别。
首先我们看看三者之间的关系:
4056
沪深 300 :通常指的是 300 只样本股选自沪深两个证券市场,包含的成分股都是市值大、流动性好的主流股票,可以说沪深 300 能相对较好地反映市场上成熟公司的情况,是最能代表中国股市的指数,被称为 A 股市场走势的“晴雨表”。
上证 50:通常指的是沪市所有股票按照规模和流动性进行排列,然后选取前 50 家企业,最后根据规模和流动性给予一定的加权,计算出相应的指数。
中证 500:通常指的是沪深两市小盘股,样本股是全部 A 股剔除沪深 300 成分股以及总市值排名前 300 名的股票后,总市值靠前的 500 只股票,反映沪深两个市场中小市值公司整体状况的指数。
实践验证
前提概述
通过一个简单的定投策略,在大盘波动大情况下,算出最大收益能达到多少。设置每个月 1 号,拿出 2 千元进行指数定投,然后计算出最终能获得多少收益。为了更直观的展示数据,我们直接使用沪深 300 指数收益模拟指数基金收益。
为了能够凸显出指数收益,我们将定期理财收益也作为数据参照,比如货币基金等理财产品年化收益 3.8%左右,计算收益走势。
数据准备
所需的数据通过【恒有数】获取以下相关参数:
证劵代码 prod_code
交易日期 trading_date
开盘价 open_price
最高价 high_price
最低价 low_price
收盘价 close_price
成交数量 business_amount
成交额 business_balance
涨跌幅 px_change_rate
换手率 turnover_ratio
涨跌停状态 up_down_status
交易状态 turnover_status
复制代码
获取沪深 300 指数近 10 年的数据,如下:
4057
程序设计
以下为相关计算程序代码:
import pandas as pd
import matplotlib.pyplot as plt
import time
"""
param pro_code: 定投的产品代码
param start_date: 定投的开始日期
param end_date: 定投的结束日期
return: 返回每日的投资资金信息
"""
def investment_regular_plan(pro_code, start_date, end_date):
pro_data = pd.read_csv('temp/' + str(pro_code) + '.csv', parse_dates=['交易日期'], index_col=['交易日期'])
pro_data = pro_data[['prod_code', 'close_price']].sort_index()
pro_data = pro_data[start_date:end_date]
# 假设年化无风险利率是 3.8% (货币基金等理财产品)
pro_data['无风险利率'] = (3.8 / 100 + 1) ** (1.0 / 250) - 1
pro_data['无风险收益_净值'] = (pro_data['无风险利率'] + 1).cumprod()
# 每月第一个交易日定投
by_month = pro_data.resample('M', kind='period').first()
# 定投购买指数基金
trade_data = pd.DataFrame(index=by_month.index)
# 以指数当天收盘点位除以 2000 作为单位基金净值
trade_data['基金净值'] = by_month['close_price'] / 2000
# 每月月初投入 2000 元申购该指数基金
trade_data['money'] = 2000
# 当月的申购份额
trade_data['基金份额'] = trade_data['money'] / trade_data['基金净值']
# 累积申购份额
trade_data['总基金份额'] = trade_data['基金份额'].cumsum()
# 累积投入的资金
trade_data['累计定投资金'] = trade_data['money'].cumsum()
# 定投购买余额宝等无风险产品
# 当月的申购份额
trade_data['理财份额'] = trade_data['money'] / by_month['无风险收益_净值']
# 累积申购份额
trade_data['总理财份额'] = trade_data['理财份额'].cumsum()
temp = trade_data.resample('D').ffill()
pro_data = pro_data.to_period('D')
# 计算每个交易日的资产(等于当天的基金份额乘以单位基金净值)
daily_data = pd.concat([pro_data, temp[['总基金份额', '总理财份额', '累计定投资金']]], axis=1, join='inner')
daily_data['基金定投资金曲线'] = daily_data['close_price'] / 2000 * daily_data['总基金份额']
daily_data['理财定投资金曲线'] = daily_data['无风险收益_净值'] * daily_data['总理财份额']
return daily_data
"""
程序开始执行
"""
if __name__ == '__main__':
# 运行程序
df = investment_regular_plan('000001.SH', '2011-01-01', '2021-11-11')
print(df[['定投成本累计资金', '基金定投累计资金', '理财定投累计资金']].iloc[[0, -1]])
df[['基金定投累计资金', '理财定投累计资金']].plot(figsize=(12, 6))
df['close_price'].plot(secondary_y=True)
plt.rcParams['font.sans-serif'] = ['KaiTi']
plt.legend(['指数行情'], loc='upper right')
plt.xlabel('交易日期')
plt.show()
复制代码
实践结果
通过最近 10 年的数据模拟指数定投,每月投入 2000 元,从 2011-11-11 到 2021-11-11,累计投入成本:262000 元,定投指数基金最终收益是 333672.802026 元,而购买定期买理财的收益最终是 321289.4334 元。
4058
总结
本文主要通过沪深 300 模拟指数定投的收益结果,验证了指数定投优势,坚持指数定投对于小白来说,是一个不错的选择。
但是指数定投并不能完全保证盈利,这也和国家的经济发展有关,最近 10 年的国家的经济实力越来越强才是关键。
投资有风险,入市须谨慎。
评论