之前分享过选择基金投资,最好是选择股票型的指数基金,而且是采用不定期不定额的投资方式,那么针对没有空闲时间的上班族,如果选择每周定投、每两周定投,选择不同的定投日对收益有什么影响呢?
对这个非常的好奇,所以上网抓取了大成沪深300指数基金和工银沪深300指数基金从成立以来的历史数据,主要是分析每个交易日中,基金上涨的概率,通过这个结果再探讨假设每周一、周二、周三、周四、周五定投,收益率各是多少。
一、大成沪深300指数基金
1、网页抓取数据&数据整理
##从网页上抓取数据
library("XML")
n <- 0:44
for(i in n){
url_a <- "http://quotes.money.163.com/fund/jzzs_519300_"
url_b <- ".html?start=2006-03-02&end=2017-05- 05&sort=TDATE&order=desc"
url = paste(url_a,i,url_b,sep="")
tbls <- readHTMLTable(url) #确定网页地址,通过网页地址分析网页表格
sapply(tbls,nrow) ##第1个表格是需要的表格
fund_data <- readHTMLTable(url,which=1)
datapath=paste("F:/大成沪深300/fund_data",i,".csv",sep="")
print(write.csv(fund_data,file = datapath))
}
总共抓取了44个文件,再将这44个文件汇总到一个文件中:
##将44个文件内的数据整合到一个文件夹中
setwd("F:/")
a = list.files("大成沪深300指数")
dir = paste("./大成沪深300指数/",a,sep="")
n = length(dir)
fund_data = read.csv(file = dir[1],header=T,sep=",")
for (i in 2:n){
new.data = read.csv(file = dir[i], header=T, sep=",")
fund_data = rbind(fund_data,new.data)
}
write.csv(fund_data,file = "./大成沪深300指数/fund_data.csv",row.names=F)
到这里,抓取历史数据就结束了。
2、数据处理
fund_data <- read_excel("F:/大成沪深300指数/fund_data.xlsx")
View(fund_data)
##重命名
names(fund_data) <- c("date","days","Unit net worth","Accumulated net worth","growth rate")
##删除多余的一列
fund_data <- fund_data[,-6]
fund_data
##按日期进行排序。
library(dplyr)
fund_data <- arrange(fund_data,desc(date))
fund_data
##按照days分组.
days_funddata <- group_by(fund_data,days)
days_funddata##数据计算,用summarise()函数
days_funddata <- summarise(days_funddata,count=n())
days_funddata
得到的结果是分成了7组,我觉得挺奇怪的,就计算了一下每个组的类别,得到以下结果:
周六、周日各有4天和2天的交易日,难道之前还有周末也进行交易了?
接着,开始筛选出各个交易日上涨的数据,以及上涨的次数,同时计算上涨的概率:
##自定义函数计算每天增长率大于0的数据。
days_data <- function(n){
days_data <- fund_data[fund_data$days == n,]
days_data <- days_data[days_data$`growth rate` > 0,]
return(days_data)
}
##周一增长率大于0的数据
days_data(1)
##周二增长率大于0的数据
days_data(2)
##周三增长率大于0的数据
days_data(3)
##周四增长率大于0的数据
days_data(4)
##周五增长率大于0的数据
days_data(5)
##重新组合成数据
newdays <- c("1","2","3","4","5") ##周一到周五
newtotal <- c("527","542","544","540","536") ##周一到周 五总共的交易日
newcount <- c("308","302","287","245","300") ##周一到 周五总共的交易日上涨次数
newdata <- data.frame(newdays,newtotal,newcount)
##计算周一到周五交易日上涨的概率
newcount <- as.numeric(newcount)
newtotal <- as.numeric(newtotal)
rate <- newcount/newtotal
newdata <- cbind(newdata,rate)
结果如下:
也就是说,每周定投,不同的交易日对于大成沪深300指数基金的收益还是有点影响的,比如说周一和周五上涨的概率大些,而周四上涨概率相对低些,但是,总体概率相差不大。
那么是不是真的如此呢?
接着计算周一到周五分别的收益率。
3.定投日为周一到周五的收益率
选择了2012年1月4日至2017年5月5日的历史数据,假设5月5日将全部份额的基金赎回,计算收益率。
3.1每周定投计算过程如下:
##自定义函数,每周定投1000,计算从2012年1月2日至2017年5月5日
vote_data <- function(n,money){
##选择子集
vote_data <- fund_data[1:1298,-(4:5)]
vote_data
##每周定投1000
days_votedata <- vote_data[vote_data$days == n,] ##n为周几定投
days_votedata
unit_worth <- days_votedata$`Unit net worth`
days_votedata$share <- (money- money*0.0012)/(unit_worth) ##计算每次定投时购买的份额数
days_votedata$money <- money ##定投的金额
share <- sum(days_votedata$share) ##定投购 买的总份额数
fundUnit <- 0.9887 ##2017-05-05的单位净值
total_worth <- share*fundUnit ##计算2017-05-05账面的总额
total_money <- sum(days_votedata$money) ##计算定投的总金额
total_Purchasefee <- total_money*0.0012 ##计算申购费的总金额
total_Redemptionfee <- total_worth*0.005 ##计算赎回费的总金额
Actual_income <- total_worth-total_Redemptionfee ##计算赎回到账实际金额
income <- Actual_income-total_money ##计算定投的收益
rate_incom <- income/total_money*100 ##计算收益率
startday <- as.Date("2012-01-04")
endday <- as.Date("2017-05-05")
days <- as.numeric(endday-startday) ##计算投资天数
year <- days/360 ##计算投资年数
year_rate <- rate_incom/year
return(rate_incom)
}
##每周一定投
vote_data(1,1000)
##每周二定投
vote_data(2,1000)
##每周三定投
vote_data(3,1000)
##每周四定投
vote_data(4,1000)
##每周五定投
vote_data(5,1000)
计算出来的结果如下:
从结果中,也可以得出跟刚刚一样的结论,无论是哪天进行定投,收益不会相差很大,如果说真的要找出一天的话,在这里显示周五收益更高一些,所以可以选择每周五定投大成沪深300指数基金,同时,也跟上面算出的周一上涨概率更高相呼应。当然,在这里是不考虑任何的国家政策影响的走势。
3.2每两周定投计算过程如下:
##自定义函数,每两周定投1000,计算从2012年1月2日至2017年5月5日
vote_data <- function(n,money){
##选择子集
vote_data <- fund_data[1:1298,-(4:5)]
vote_data
##每两周定投投1000
vote_data$number <- c(1,2)
days_votedata <- vote_data[vote_data$days == n & vote_data$number == 2 ,] ##n为周几定投,2为每两周定投
days_votedata
unit_worth <- days_votedata$`Unit net worth`
days_votedata$share <- (money- money*0.0012)/(unit_worth) ##计算每次定投时购买的份额数
days_votedata$money <- money ##定投的金额
share <- sum(days_votedata$share) ##定投购买的总份额数
fundUnit <- 0.9887 ##2017-05-05的单位净值
total_worth <- share*fundUnit ##计算2017-05-05账面的总额
total_money <- sum(days_votedata$money) ##计算定投的总金额
total_Purchasefee <- total_money*0.0012 ##计算申购费的总金额
total_Redemptionfee <- total_worth*0.005 ##计算赎回费的总金额
Actual_income <- total_worth-total_Redemptionfee ##计算赎回到账实际金额
income <- Actual_income-total_money ##计算定投的收益
rate_incom <- income/total_money*100 ##计算收益率
startday <- as.Date("2012-01-04")
endday <- as.Date("2017-05-05")
days <- as.numeric(endday-startday) ##计算投资天数
year <- days/360 ##计算投资年数
year_rate <- rate_incom/year
return(rate_incom)
}
##每两周一定投
vote_data(1,1000)
##每两周二定投
vote_data(2,1000)
##每两周三定投
vote_data(3,1000)
##每两周四定投
vote_data(4,1000)
##每两周五定投
vote_data(5,1000)
计算结果如下:
这里的结论跟上面的一样,也是选择周五定投收益率相对来说稍微高一点。
二、工银沪深300指数基金
工银沪深300指数基金的计算过程跟大成沪深300指数一样,在这里省略计算过程,直接得出结论:
##从网页上抓取数据
library("XML")
n <- 0:33
for(i in n){
url_a <- "http://quotes.money.163.com/fund/jzzs_481009_"
url_b <- ".html?start=2009-02-03&end=2017-05-05&sort=TDATE&order=desc"
url = paste(url_a,i,url_b,sep="")
tbls <- readHTMLTable(url) #确定网页地址,通过网页地址分析网页表格
sapply(tbls,nrow) ##第1个表格是需要的表格
fund_data <- readHTMLTable(url,which=1)
datapath=paste("F:/工银沪深300指数/fund_data",i,".csv",sep="")
print(write.csv(fund_data,file = datapath))
}
##将44个文件内的数据整合到一个文件夹中
setwd("F:/")
a = list.files("工银沪深300指数")
dir = paste("./工银沪深300指数/",a,sep="")
n = length(dir)
fund_data = read.csv(file = dir[1],header=T,sep=",")
for (i in 2:n){
new.data = read.csv(file = dir[i], header=T, sep=",")
fund_data = rbind(fund_data,new.data)
}
write.csv(fund_data,file = "./工银沪深300指 数/fund_data.csv",row.names=F)
##得到所需的文件fund_data
library(readxl)
fund_data <- read_excel("F:/工银沪深300指数/fund_data.xlsx")
View(fund_data)
##重命名
names(fund_data) <- c("date","days","Unit net worth","Accumulated net worth","growth rate")
##删除多余的一列
fund_data <- fund_data[,-6]
fund_data
##按日期进行排序。
library(dplyr)
fund_data <- arrange(fund_data,desc(date))
fund_data
##按照days分组.
days_funddata <- group_by(fund_data,days)
days_funddata
##数据计算,用summarise()函数
days_funddata <- summarise(days_funddata,count=n())
days_funddata
##自定义函数计算每天增长率大于0的数据。
days_data <- function(n){
days_data <- fund_data[fund_data$days == n,]
days_data <- days_data[days_data$`growth rate` > 0,]
return(days_data)
}
##周一增长率大于0的数据
days_data(1)
##周二增长率大于0的数据
days_data(2)
##周三增长率大于0的数据
days_data(3)
##周四增长率大于0的数据
days_data(4)
##周五增长率大于0的数据
days_data(5)
##重新组合成数据
newdays <- c("1","2","3","4","5") ##周一到周五
newtotal <- c("382","397","399","397","397") ##周一到周五总共的交易日
newcount <- c("211","216","203","170","226") ##周一到周 五总共的交易日上涨次数
newdata <- data.frame(newdays,newtotal,newcount)
newdata
##计算周一到周五交易日上涨的概率
newcount <- as.numeric(newcount)
newtotal <- as.numeric(newtotal)
rate <- newcount/newtotal
newdata <- cbind(newdata,rate)
newdata
##自定义函数,每周定投1000,计算从2012年1月2日至2017年5月5日
vote_data <- function(n,money){
##选择子集
vote_data <- fund_data[1:1298,-(4:5)]
##每周定投1000
money <- 1000
days_votedata <- vote_data[vote_data$days == n,] ##n为周几定投
days_votedata
unit_worth <- days_votedata$`Unit net worth`
days_votedata$share <- (money-money*0.0012)/(unit_worth) ##计算每次定投时购买的份额数
days_votedata$money <- money ##定投的金额
share <- sum(days_votedata$share) ##定投购买的总份额数
fundUnit <- 0.9816 ##2017-05-05的单位净值
total_worth <- share*fundUnit ##计算2017-05-05账面的总额
total_money <- sum(days_votedata$money) ##计算定投的总金额
total_Purchasefee <- total_money*0.0012 ##计算申购费的总金额
total_Redemptionfee <- total_worth*0.005 ##计算赎回费的总金额
Actual_income <- total_worth-total_Redemptionfee ##计算赎回到账实际金额
income <- Actual_income-total_money ##计算定投的收益
rate_incom <- income/total_money*100 ##计算收益率
startday <- as.Date("2012-01-04")
endday <- as.Date("2017-05-05")
days <- as.numeric(endday-startday) ##计算投资天数
year <- days/360 ##计算投资年数
year_rate <- rate_incom/year
return(rate_incom)
}
##每周一定投
vote_data(1,1000)
##每周二定投
vote_data(2,1000)
##每周三定投
vote_data(3,1000)
##每周四定投
vote_data(4,1000)
##每周五定投
vote_data(5,1000)
结果如下:
从这个数据也可以得出是周五定投时,收益率更高一些。所以,不考虑任何的政策导致的走势,可以选择周五定投工银沪深300指数。
总结:
由于大成沪深300指数基金和工银沪深300指数基金都是跟踪沪深300指数的,所以沪深300指数基金的走势大致上差异不大,因此,在不考虑任何客观因素的情况下,我们定投沪深300指数时,可以考虑周五定投。
疑惑的是,为什么同样是沪深300指数的基金,两者的收益会差这么大呢?经过蓝老师的解惑,原来是两个基金的分红情况不同,工银沪深300指数基金多次分红,导致基金净值下降。所以,下一篇模拟一下看看同样是跟踪沪深300指数的基金,收益率是否相差很大。