python实现基金定投并可视化结果(及时止损)实现基金定投并可视化结果(及时止损)
1.什么是指数基金
2.什么是基金定投
3.本次数据来源
4.作出假设
每周定投一次,每次定投500,计算2019年对沪深300指数基金进行定投的收益率
每周定投一次,每次定投500,分别计算从2002年开始到2019年,每年定投沪深300指数基金的收益率
5.改变定投策略,获得更好的收益(以2018和2019的平均收益率分析)
改变定投周期(三月一次定投)
改变定投金额(设置投入资金固定比例)
及时止损(资金最大时收盘)
1.什么是指数基金什么是指数基金
股票指数股票指数是指按照一定的规则所选择的股票的平均值。比如:
上证50指数:就是把上海证券交易所规模最大、流动性最好的50家公司的股票统计起来的股票平均值。
沪深300指数:就是把上交所和深交所前300只规模最大、流动最好的300家公司的股票统计起来的股票平均值。
中证500指数:把沪深300指数的前300家大公司排除,剩下的大公司中再选前500只规模最大、流动最好的500家公司的股票统计起来的股票平均值。
因此:指数基金即按照某选股规则选出来的一堆股票的集合即指数基金指数基金
2.什么是基金定投什么是基金定投
基金定投,就是按照固定的频率和固定的金额,不停分批次小额买入金融市场上的基金。定投可以选择任何种类的基金。我们以指数基金为例(大部分传说中无脑定投的案例都是以
指数基金的定投方式),分析本案例
3.本次数据来源本次数据来源
通过API接口从网易财经上进行调取
接口规范
http://quotes.money.163.com/service/chddata.html?code=003833&start=19901219&end=20200228&fields=TCLOSE;HIGH;LOW;TOPEN;LCLOSE;CHG;PCHG;VOTURNOVER;VATURNOVER
说明:
code参数后面的7位整数代表了股票代码;比如0000001指的是上证指数。注意这串数字要分0和000001两部分看。0代表sh,1代表sz。所以0000001其实是sh000001的意思。同
理,0 000300也就是sh000300 沪深300的代码。
start和end参数后面的8位整数代表年(xxxx)月(xx)日(xx)
fields选项中,TCLOSE,HIGH,LOW,TOPEN分别表示当日的收盘,最高,最低,开盘价;LCLOSE表示昨日收盘>价。CHG,PCHG,VOTURNOVER,VAT分别表示涨跌额,涨跌幅,
成交量,成交金额。
本次研究沪深本次研究沪深300指数基金指数基金
4.作出假设作出假设
# 加载模块
from datetime import datetime,timedelta
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
# 指定默认字体
plt.rcParams['font.family']=['SimHei'] # 解决负号'-'显示为方块的问题
plt.rcParams['axes.unicode_minus']=False
# 获取数据
def get_data(indexID,dateStart="20000101",dateEnd="20200320",local=True):
# 定义网络数据接口
api="http://quotes.money.163.com/service/chddata.html?code="
if local:
data=pd.read_csv(indexID[1:]+'.csv',index_col=0,encoding='gb2312') # index_col将第一列作为index使用,'gb2312'文件里有中文
else:
api+=indexID+"&start="+dateStart+"&end="+dateEnd
api+="&fields=TCLOSE;HIGH;LOW;TOPEN;LCLOSE;CHG;PCHG;VOTURNOVER;VATURNOVER"
data=pd.read_csv(api,index_col=0,encoding='gb2312')
data=data.loc[(data.index>datetime.strptime(dateStart,"%Y%m%d").strftime("%Y-%d-%m"))
&(data.index<datetime.strptime(dateEnd,"%Y%m%d").strftime("%Y-%d-%m"))] data=data.sort_values(by=['日期']) #排序
return data
def invest(indexID,dateStart,dateEnd,amount,freq,fixRate=None,fixPercent=0.15,strategy=1):
'''
简单定投的实现
strategy-定投策略:
1-固定金额(amount)
2-固定比例(fixPercent)
3-给定最小投入额情况下的固定比例(max(fixPercent,amount))
4-逢低加大买入
fixRate-定期存款的年利率:用于计算收益对比
'''
# 获取数据
data=get_data(indexID,dateStart,dateEnd,False)
# 初始化定投金额/份额列表/定投日期
listAmount=[] listShare=[] listDate=[]
# 定投比例
percent=fixPercent
# 定投次数
num=0
# 固定收益
fixProfit=0
# 开始定投
st=datetime.strptime(dateStart,"%Y%m%d")
sd=datetime.strptime(dateEnd,"%Y%m%d")