上证指数量化交易策略报告
1. 目的及意义
1.1 目的
金融领域,算法的作用之一就是风控,另外就是量化投资领域,通过量化算
法模型实现赚钱。金融市场的规则,就是通过各种各样的数据,判断出国家的经
济形势和个股的走势,结合投资组合的算法,实现投资者的盈利。
1.2 意义
R 语言在量化投资领域,已经有很多年的积累,很多的算法已经成型。从投
资研究到交易分析,再到风险管理,有着完整的体系结构。我们同样可以沿着前
人走出来的路,快速学习,快速搭建出量化投资的系统来。
R 语言让我们更接近数据,同时提供了各种数学统计的工具,又有大量由第
三方贡献的行业知识库,所以我会选择 R 语言,我会把 R 语言作为最好的工具,
进行量化投资的分析。
1.3 数据来源
本次报告,我们采用上证指 A 股在 2019 年 1 月 1 日到 2019 年 6 月 10 日的
数据做测试。数据下载地址:
http://quotes.money.163.com/trade/lsjysj_zhishu_000001.html,部分数据如下
图所示:
2. 模型实现
下文我们将以中线为例,进行建模和程序实现。那么对于中线追涨的情况,
我们核心的策略思路就可以转化为,当股价(成交量)向上突破最近 20 日最高价
格(量)时买入,当股价向下突破最近 10 日最低价格卖出。其中,为什么是 20 日
最高和 10 日最低都是经验值,可以做为模型参数进行训练和优化。选择上证指
数做实验,符合量化策略的假设条件。
计算公式:
20 日最高价 = max(T 日股价,T-1 日股价 ... , T-19 日股价)
20 日最高量 = max(T 日成交量,T-1 日成交量 ... , T-19 日成交量)
10 日最低价 = min(T 日股价,T-1 日股价 ... , T-9 日股价)
R 语言本身提供了丰富的金融函数工具包,时间序列包 zoo 和 xts,指标计算
包 TTR,数据处理包 plyr,可视包 ggplot2 等,我们会一起使用这些工具包来完
成建模、计算和可视化的工作。
本文用到的数据,包括 A 股日 K 线(向前复权)数据,从 2015 年 1 月到 2019
年日 6 月,以 CSV 格式保存到本地文件 stock.csv。
数据格式如下:
股票代码,日期,收盘价,最高价,最低价,开盘价,成交量
000001.sz,2019/6/11,2925.72,2927.43,2854.07,2854.07,260525796
000001.sz,2019/6/10,2852.13,2861.13,2824.36,2833.01,166585918
000001.sz,2019/6/6,2827.8,2862.33,2822.19,2862.33,177064411
000001.sz,2019/6/5,2861.42,2888.77,2858.57,2882.94,181561047
000001.sz,2019/6/4,2862.28,2888.39,2851.97,2887.64,188463541
一共 7 列:
① 第 1 列,股票代码,code,000001.SZ
② 第 2 列,交易日期,date,2015-07-02
③ 第 3 列,开盘价,Open,2854.07
④ 第 4 列,最高价,High,2927.43
⑤ 第 5 列,最低价,Low,2854.07
⑥ 第 6 列,收盘价,Close,2925.72
⑦ 第 7 列,交易量,Volume,260525796
通过 R 语言加载股票数据,按股票代码进行分组,生成 R 语言的 list 对象,
同时把每支股票的 data.frame 类型对象转成 XTS 时间序列类型对象,方便后续的
数据处理。
setwd("C:\\Users\\Administrator\\Desktop\\xxtj\\")
#加载工具包
library(plyr)
library(xts)
library(TTR)
library(ggplot2)
library(scales)
read<-function(file){
df<-read.table(file=file,header=TRUE,sep = ",", na.strings = "NULL") # 读文件
names(df)<-c("code","date","Close","High","Low","Open","Volume") # 设置列名
df$Close = as.double(df$Close)
dl<-split(df[-1],df$code) # 按 code 分组
lapply(dl,function(row){ # 换成 xts 类型数据
xts(row[-1],order.by = as.Date(row$date))
})
}
data<-read("stock.csv")
# 查看数据类型
class(data)
# 查看数据的索引值
head(names(data))
# 查看包括的股票数量
length(data)
# 获得时间范围
dateArea<-function(sDate=Sys.Date()-365,eDate= Sys.Date(),before=0){ #开始日期,结束日期,
提单开始时
if(class(sDate)=='character') sDate=as.Date(sDate)
if(class(eDate)=='character') eDate=as.Date(eDate)
return(paste(sDate-before,eDate,sep="/"))
}
# 查看股票 000001.sz
head(data[['000001.sz']])
通过上面的步骤,把数据准备好了,我们就可以来建立模型了。下面获取日
K 线数据,并进行绘图,选取数据是时间为 2019-01-01 到 2019-06-12 时间段的数
据。
# 日 K 线和均线
title<-'000001.sz'
stock<-data[[title]] # 获得股票数据
sDate<-as.Date("2019-01-01") # 开始日期
eDate<-as.Date("2019-06-10") # 结束日期
cdata<-stock[dateArea(sDate,eDate,360)]$Close # 获得收盘价
vdata<-stock[dateArea(sDate,eDate,360)]$Volume # 获得交易量
names(cdata)<-"Value" # 重置列名
tail(cdata)
# 交易量
tail(vdata)
# 画图函数
drawLine<-function(cdata,titie="Stock",sDate=min(index(cdata)),eDate=max(index(cdata)),break
s="1 year"){
if(sDate<min(index(cdata))) sDate=min(index(cdata))
if(eDate>max(index(cdata))) eDate=max(index(cdata))
cdata<-na.omit(cdata)
g<-ggplot(aes(x=Index, y=Value),data=fortify(cdata[,1],melt=TRUE))
g<-g+geom_line()
if(ncol(cdata)>1){ # 多条线
g<-g+geom_line(aes(colour=Series),data=fortify(cdata[,-1],melt=TRUE))
}
g<-g+scale_x_date(labels=date_format("%Y-%m"),breaks=date_breaks(breaks),limits =
c(sDate,eDate))
g<-g+ylim(min(cdata$Value), max(cdata$Value))
g<-g+xlab("") + ylab("Price")+ggtitle(title)
g
}
# 计算最近 20 日的最高价和 10 日的最低价
minmaxx<-function(data,max=20,min=10){
d1<-na.locf(data,fromLast=TRUE)
d2<-merge(d1,min=runMin(d1,min),max=runMax(d1,max))
return(d2[,-1])
}
# 画出股价,最高价和最低价
ldata<-cbind(cdata,minmax(cdata))
drawLine(ldata,title,sDate,eDate,'1 month') # 画图
得到的绘图结果为: