给自己定的目标是量化7年建立一个1000万的投资组合,通过PMT公式计算7年1000万,每个月按1.67%收益率,7年84个月按月投入,套入公式=FMT(r,n,,FV,1)r为月收益率,n为84个月,FV为最后得到的本金加收益,1表示每个月1号投入资金,当月投入的资金也按月收益率计算收益,=FMT(0.0167,84,,10000000,1)得到初始投入资金54487元,按初始投入资金和预估月收益率制作执行表格如下
如果只每月定投沪深300指数基金能否实现这个目标呢?通过python学习,回测一下每月定投5.4万到沪深300指数基金看看能否实现这个目标。
从今天倒推7年,需要2014年8月23日到2021年8月22日沪深300指数基金数据,为了简便,直接以沪深300指数作为回撤对象,以4%固收的理财产品做对照。
回撤数据为7年定投468万,和表格457.7万有一些小差异,因为是按每个月20个工作日投的。最后的总资金为601万,虽然跑赢了理财定投,但是离一千万还是有很大的差距,所以仅仅只通过定投沪深300指数基金是无法简单实现目标。必须通过不断的学习,提高收益率才能完成目标。大家如果有好的不需要择时能实现年化20%的可定期量化投资的组合,希望能赐教。我追求是用量化自动交易,通过复利实现目标,我将实盘操作,如果能稳定的完成每个1.67%收益,必定红包感谢。
#导入所需要用到的库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 设置参数,将图形格式设置为‘svg’,能够输出更加清晰的图
%config InlineBackend.figure_format = 'svg'
#正常显示画图时出现的中文和负号
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False
#获取指数收盘价
df300 = get_market_data(['close','open','high','low','volume'], stock_code =['000300.SH'],start_time = '20140823',end_time = '20210822', period = '1d')
#按月定投,按量化7年1000万,理想状态,每30天投入54487元
trade_df = pd.DataFrame(index=df300.index,columns=['money','累计收益率','基金净值','无风险收益率','无风险收益_净值','基金份额',
'总基金份额','累计投入资金','理财份额','总理财份额','指数定投资金'])
trade_df['money']=0
indexes=np.arange(0,len(trade_df.index),20)
trade_df.iloc[indexes,0]=54487
logRet = np.diff(np.log(df300['close']))
trade_df['累计收益率'][1:]=logRet.cumsum()
trade_df['基金净值']=df300['close']/54487
#假设定投无风险理财产品收益率为4%
trade_df['无风险收益率']=(4.0/100+1)**(1.0/250)-1
trade_df['无风险收益_净值']=(trade_df['无风险收益率']+1).cumprod()
trade_df['基金份额']= trade_df['money']/trade_df['基金净值']
trade_df['总基金份额']=trade_df['基金份额'].cumsum()
trade_df['累计投入资金']=trade_df['money'].cumsum()
trade_df['理财份额']=trade_df['money']/trade_df['无风险收益_净值']
trade_df['总理财份额']=trade_df['理财份额'].cumsum()
trade_df['指数定投资金']=trade_df['基金净值']*trade_df['总基金份额']
trade_df['理财定投资金']=trade_df['无风险收益_净值']*trade_df['总理财份额']
# 每月定投沪深300指数及定投理财收益数据可视化
# 建立画布
fig = plt.figure(figsize = (12,4))
plt.xticks(list(range(0,len(df300),50)),list(np.array(df300.index)[list(range(0,len(df300),50))]), rotation=80)
# 绘制主坐标轴图表
plt.plot(np.arange(len(trade_df.index)), df300['close'], linestyle='dotted', label="沪深300指数")
plt.legend(loc='upper left') # 设置主坐标轴图表的图例
# 调用twinx方法
plt.twinx()
# 使用次坐标轴
plt.plot(np.arange(len(trade_df.index)), trade_df['累计投入资金'], label="累计投入资金")
plt.plot(np.arange(len(trade_df.index)), trade_df['指数定投资金'], label="指数定投资金")
plt.plot(np.arange(len(trade_df.index)), trade_df['理财定投资金'], label="理财定投资金")
plt.legend(loc='upper center')
# 设置次坐标轴图表的图例