均线模型量化股票交易.docx
- 文档编号:4455527
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:36
- 大小:271.04KB
均线模型量化股票交易.docx
《均线模型量化股票交易.docx》由会员分享,可在线阅读,更多相关《均线模型量化股票交易.docx(36页珍藏版)》请在冰豆网上搜索。
均线模型量化股票交易
均线模型量化股票交易
————————————————————————————————作者:
————————————————————————————————日期:
ﻩ
15金融专硕 15720708 仰军
均线模型量化股票交易
摘要:
移动平均线(MA)是股市中最常用的一种分析技术,用于在大行情的波动段找到有效的交易信号。
移动平均线简单、有效,对股市操作具有较好的指导作用。
均线模型能有效地打败了大部分的主观策略,成为炒股,炒期货的必备基本工具。
本文选用阿里巴巴 2014年 9月至今的股票数据,对其每日收盘价进行了5 日、20 日和
60日移动平均。
先用每日收盘价和 20日平均分析一条均线的交易策略,通过找出交易信号并模拟交易,发现一条均线交易策略会有些许的亏损,但通过图表分析,此策略能够较好的预测股价走势,相对主观投资更为合理;然后用5日平均和 20日平均做两条均线的交易策略,这是对一条均线模型的优化,模拟交易后发现此交易能够盈利。
关键词:
股票ﻩ移动平均ﻩ均线交易策略模拟交易II
1.均线模型的简单介绍
1.1移动平均线
本文采用统计学中”移动平均”的原理,计算一股票每日收盘价的简单移动平均,将一段时期内的股票价格平均值连成曲线,来显示股价的历史波动情况,进而反映股价指数未来发展趋势。
1.2均线的特性
(1)平滑性。
通过均线的平滑移动来修复股价的不规则偶然变动。
(2)灵敏性、稳定性。
均线参数取值不同,其特性也不同。
参数越小,灵敏性越强,稳定性越差;参数越大,稳定性越强,灵敏性越差。
(3)助涨性、助跌性。
上升趋势线有助涨的特性,下降趋势线有助跌的特性。
1.3均线模型
在日K线图中除了标准的价格K线以外,另外还有4条线,分别是白线、黄线、紫线、绿
线依次分别表示:
5日、10日、20日和60日移动平均线,通过这4条线与价格K线的交叉,就可以形成不同的均线模型。
利用均线平滑的特点,可以发现均线与价格K线会有叉,各均线之间也有交叉,我们可以通过这些交叉点判断交易信号:
黄金交叉,当10日均线由下往上穿越30日均线,10日均线在上,30日均线在下,其交叉点就是黄金交叉,黄金交叉是多头的表现,出现黄金交叉后,后市会有一定的涨幅空间,这是进场的最佳时机;死亡交叉,当30日均线与10日平均线交叉时,30日均线由下住上穿越10日平均线,形成
30日平均线在上,10日均线在下时,其交点称之为”死亡交叉”,”死亡交叉”预示空头市场来临,股市将下跌此时是出场的最佳时机。
2.用R语言实现模型建立
2.1从互联网下载股票数据
利用quantmod包的getSymbols()函数,默认会通过Yahoo的金融开放API下载数据,我们选择阿里巴巴的股票数据,从2014-09-19至今的1年多的日间交易数据。
数据类型为xts格式的时间序列,数据包括7个列,以日期做索引列,其他6列分别为开盘价(Open),最高价(High),最低价(Low),收盘价(Close), 交易量(Volume),调整价(Adjusted)。
2.2自定义均线图
自定义均线指标:
以日期时间序列为索引,收盘价做为价格指标,不考虑成交量及其他维度字段。
取2014-09-19至今,形成趋势的数据,画出价格曲线,5日均线,20日均线,60 日均线。
通过自己封装的移动平均函数和可视化函数,就实现了与交易软件中类似的日K线图和多条均线结合的可视化输出。
2.3一条均线的交易策略模型设计思路:
1.以股价和20日均线的交叉,进行交易信号的判断。
2.当股价上穿20日均线则买入(红色),下穿20日均线卖出(蓝色)。
首先画出股价和20日均线图
以散点覆盖20日均线,红色点为买入持有,蓝色点为卖出空仓。
用股价和20日均线价格做比较,把股价大于均线的部分用蓝色表示,股价小于均线的部分用红色表示。
我们看到图中,蓝色点和红色点在20日均线上交替出现,我们可以在每次红色出现的第一个点买入股票,然后在蓝色的第一个点卖出股票。
找出交易信号点,并以100000本金做模拟交易。
为简化操作假定在信号点满仓买入或卖出,手续费为0。
运算结果显示,亏损的有11笔而盈利的只有3笔,一年下来一共亏损了17038元。
似乎一条均线模型是失败的,因为它不仅没能盈利反而带来的亏损。
下面就从股价和模拟现金投入来进行简单的分析亏损原因。
该图示,上半红色部分为日收盘价,下半蓝色部分为模拟交易的现金流,对比可见,阿里股价在14年年底开始走低,而根据一条均线模型进行的投资策略比较合理的预测了股市的走势并进行了股票的买入卖出,在一定程度上是减少了亏损。
2.4两条均线的交易策略
一条均线模型,在大的趋势下是可以进行稳定投资的,但由于一条均线对于波动非常敏感性,如果小波动过于频繁,不仅会增加交易次数,而且会让模型失效。
然后,就有二条均线的策略模型,可以减低对波动的敏感性。
二条均线策略模型,与一条均线模型思路类似,以5日均线价格替换股价,是通过5日
均线和20日均线交叉来进行信号交易的。
画出股价、5日均线和20日均线图
以散点覆盖20日均线,红色点为买入持有,蓝色点为卖出空仓。
以同样的条件进行两条均线交易策略的模拟交易。
根据运算结果,虽然依旧亏损了11笔
盈利3笔,但最终带来了总盈利7408元。
2.5两种策略的简单分析
策略一在模拟交易中一共进行了30次交易,最终亏损10000元左右,而策略二只进行了
20次交易,最终带来盈利7000左右。
很明显两条均线的交易策略能更好的追踪股价趋势,带给投资者回报。
看起来均线模型是如此的简单,但实盘交易时真能在趋势行情中跑赢双均线(优化)模型,
也真不是一件容易的事情。
参考文献:
[1]常宁,徐国祥.金融高频数据分析的现状与问题研究.财经研究,2004,(3):
31-39
[2]武振,郑丕谔.基于遗传神经网络的股价波动预测.天津大学学报,2004, 6(4):
307—310
[3]马超群,张明良.ACD族计量模型的分类与比较分析.金融经济,2005,(8)86-87
[4]蒋学雷,陈敏,王国明等.股票市场的流动性度量的动态ACD模型.统计研究,2004,(4):
42-44
[5]王晶,王玉玲,向东进,阮曙芬.自回归条件持续期(ACD)模型研究统计与决策2006(6)
[6]Economist.2007a. AheadoftheTape–AlgorithmicTrading.Economist. June23,2007.‐. 2007b. Dodgy Tickers–Stock Exchanges. Economist.March 10, 2007.
[7]M.Kearnsand L. Ortiz.The Penn‐Lehmanautomated trading project.IEEEIntelligentSystems,2003. Toappear.
[8] Domowitz,I., andH. Yegerman. 2005.“The Costof AlgorithmicTrading:
A FirstLook at ComparativePerformance.” Editedby Brian R.Bruce, Algorithmic Trading:
Precision,Control,Execution.InstitutionalInvestor.
附表一:
R语言代码
#加载必须的函数包
library(plyr)library(quantmod) library(TTR) library(ggplot2) library(scales)
library(reshape2)
#设置存储位置
setwd("E:
/Statistical modeling/")
#下载数据
download<-function(stock,from="2013-01-01"){df<-getSymbols(stock,from=from,env=environment(),auto.assign=FALSE)#下载数据names(df)<-c("Open","High","Low","Close","Volume","Adjusted")write.zoo(df,(stock,".csv",sep=""),sep=",",quote=FALSE)#保存到本地 }
#本地读数据
read<-function(stock){
as.xts(read.zoo((stock,".csv",sep=""),header=TRUE,sep=",", format="%Y-%m-%d"))
}
stock<-"BABA"
download(stock,from='2013-01-01')BABA<-read(stock)
#定义移动平均函数
ma<-function(cdata,mas=c(5,20,60)){ldata<-cdata for(minmas){ldata<-merge(ldata,SMA(cdata,m))
}ldata<-na.locf(ldata,fromLast=TRUE)names(ldata)<-c('Value',paste('ma',mas,sep=''))return(ldata)
}
##定义均线图函数
drawLine<-function(ldata,titie="Stock_MA",sDate=min(index(ldata)),eDate=max(index(ldata)),out=FALSE){g<-ggplot(aes(x=Index,y=Value),data=fortify(ldata[,1],melt=TRUE))g<-g+geom_line()g<-g+geom_line(aes(colour=Series),data=fortify(ldata[,-1],melt=TRUE))g<-g+scale_x_date(labels=date_format("%Y-%m"),breaks=date_breaks("2 months"),limits=
c(sDate,eDate)) g<-g+xlab("")+ylab("Price")+ggtitle(title)
if(out)ggsave(g,(titie,".png",sep=""))elseg
}
#选取数据并运行
cdata<-BABA['2014/2015']$Close title<-"Stock_BABA"#图片标题sDate<-as.Date("2014-9-19")#开始日期eDate<-as.Date("2015-10-23") #结束日期
ldata<-ma(cdata,c(5,20,60))#选择滑动平均指标
p0<-drawLine(ldata,title,sDate,eDate)#画图ggsave(p0,(title,".png",sep=""))ﻩ#存图
#画出股价和20日均线图
ldata1<-ma(cdata,c(20))#选择滑动平均指标p11<-drawLine(ldata1,title,sDate,eDate)#画图
###以散点覆盖20日均线,红色点为买入持有,蓝色点为卖出空仓
##定义均线图+散点函数
drawPoint<-function(ldata,pdata,titie,sDate,eDate){g<-ggplot(aes(x=Index,y=Value),data=fortify(ldata[,1],melt=TRUE)) g<-g+geom_line()g<-g+geom_line(aes(colour=Series),data=fortify(ldata[,-1],melt=TRUE)) g<-g+geom_point(aes(x=Index,y=pdata[,3],colour=compare),data=pdata)
g<-g+scale_x_date(labels=date_format("%Y-%m"),breaks=date_breaks("2months"),limits= c(sDate,eDate))g<-g+xlab("")+ylab("Price")+ggtitle(title) g
}
##定义获取散点数据函数
getPoint<-function(ldata){data<-fortify(ldata)n<-nrow(data)
data<-data.frame(data,compare=vector(length=n))v1<-data[,2] v2<-data[,3]dist<-(v2-v1)
data$compare[which(dist<0)]<-c("down")data$compare[which(dist>=0)]<-c("up") pdata<-data
}
#运行并获取数据
pdata<-getPoint(ldata1)
p1<-drawPoint(ldata1,pdata,title,sDate,eDate)
##定义找出交易信号点函数
Signal<-function(cdata,pdata){n<-nrow(pdata)pdata1<-data.frame(pdata,Sigs=vector(length=n),comp=vector(length=n),p=vector(length=n))pdata1$comp[which(pdata1$compare=="up")]<-1pdata1$comp[which(pdata1$compare=="down")]<-0for(iin2:
(n-1)){pdata1$p[i]<-(pdata1$comp[i]-pdata1$comp[i-1])
}pdata1$p[1]<-pdata1$p[2]pdata1$Sigs[which(pdata1$p<0)+1]<-c("B")pdata1$Sigs[which(pdata1$p>0)+1]<-c("S")temp<-pdata1[-c(1,which(pdata1$p==0)+1),]x<-c(4,6,7)Signals<-temp[,-x]
}
#运行并获取数据
tdata<-Signal(cdata,pdata)
###模拟交易
###利用交易信号数据,进行模拟交易。
设定交易参数,以$10W为本金,满仓买入或卖出,手续为0,###传入交易信号。
###参数:
交易信号,本金,持仓比例,手续费比例
#规定数据格式以及小数点位数
options(scipen=4) options(digits=4)
##定义模拟交易函数
trade<-function(tdata,capital){n=nrow(tdata) cash<-vector(length=n)amount<-vector(length=n)asset<-vector(length=n)diff<-vector(length=n)
t<-data.frame(tdata,cash,amount,asset,diff)
if(t[1,4]=="S")t[1,5]<-capitalelset[1,5]<-(capital%%t[1,2]) if(t[1,4]=="S")t[1,6]<-0elset[1,6]<-floor(capital/t[1,2]) t[1,7]<-capitalt[1,8]<-0for(i in2:
n){ if(t$Sigs[i]=="B"){ t$amount[i]<-floor(t$cash[i-1]/t[,2][i])+amount[i-1]t$cash[i]<-t$cash[i-1]%%t[,2][i]t$asset[i]<-t$amount[i]*t[,2][i]+t$cash[i]t$diff[i]<-t$asset[i]-t$asset[i-1]
} else{t$amount[i]<-0t$cash[i]<-t$amount[i-1]*t[,2][i]+t$cash[i-1] t$asset[i]<-t$cash[i]t$diff[i]<-t$asset[i]-t$asset[i-1]
}
}
t
}
#定义数据,运行
capital=100000result1<-trade(tdata,capital)rise<-length(which(result1$diff>0))fall<-length(which(result1$diff<0))
###画出资金曲线
##定义画出股价+现金流量对比函数
drawCash<-function(result,ldata){
n<-which(result1$Sigs=='S') m<-c(1,5)xx<-result[n,m]
colnames(xx)<-c("Time","cash")xx<-melt(xx,id="Time")
yy<-fortify(ldata)k<-c(1,2) yy<-yy[,k]
colnames(yy)<-c("Time","close") yy<-melt(yy,id="Time") zz<-rbind(yy,xx)g<-ggplot(aes(Time,value),data=zz)g<-g+geom_line(aes(group=1,colour=variable))g<-g+facet_grid(variable~.,scales="free_y")
g<-g+scale_x_date(labels=date_format("%Y-%m"),breaks=date_breaks("2month"),limits=c(sDate,eDate))g<-g+xlab("")+ylab("Price")+ggtitle(title)
g
}
#运行
p2<-drawCash(result1,ldata1)
ggsave(p2,("close+cash",".png",sep=""))ﻩ#存图
###一条均线模型,在大的趋势下是可以稳定赚钱的,但由于一条均线对于波动非常敏感性,
###如果小波动过于频繁,不仅会增加交易次数,而且会让模型失效。
然后,就有二条均线的
###策略模型,可以减低对波动的敏感性。
二条均线策略模型,与一条均线模型思路类似,以###5日均线价格替换股价,是通过5日均线和20日均线交叉来进行信号交易的。
###首先画出股价,5日均线和20日均线图。
#选择5日和20日滑动平均指标
ldata2<-ma(cdata,c(5,20))
#画图
p33<-drawLine(ldata2,title,sDate,eDate)
#这步是为了将数据框与之前的函数格式对应
ldata2<-ldata2[,c(2,3)]
#获取散点图
pdata2<-getPoint(ldata2)
#画出散点图
p3<-drawPoint(ldata2,pdata2,title,sDate,eDate)
#找出交易信号
tdata2<-Signal(cdata,pdata2)
#模拟交易
result2<-trade(tdata2,capital)rise2<-length(which(result2$diff>0))fall2<-length(which(result2$diff<0))
#画出股价现金图
p4<-drawCash(result2,ldata2)
附表二:
阿里股票数据
Index
Open
High
Low
Close
Volume
Adjusted
2014/9/19
92.699997
99.699997
89.949997
93.889999
271879400
93.889999
2014/9/22
92.699997
92.949997
89.5
89.889999
89.889999
2014/9/23
88.940002
90.480003
86.620003
87.169998
87.169998
2014/9/24
88.470001
90.57
87.220001
90.57
90.57
2014/9/25
91.089996
91.5
88.5
88.919998
88.919998
2014/9/26
89.730003
90.459999
88.660004
90.459999
90.459999
2014/9/29
89.620003
89.699997
88.019997
88.75
88.75
2014/9/30
89
90.879997
88.459999
88.849998
88.849998
2014/10/1
88.699997
88.940002
86.040001
86.099998
86.099998
2014/10/2
86.269997
88.199997
85.611
87.059998
87.059998
2014/10/3
88.099998
89.940002
87.650002
88.099998
88.099998
2014/10/6
89.150002
89.650002
88.059998
88.309998
88.309998
2014/10/7
87.949997
89.699997
87.059998
87.669998
87.669998
2014/10/8
88
88.5
87.059998
88.300003
88.300003
2014/10/9
88.510002
90.349998
88
88.790001
88.790001
2014/10/10
88.25
88.739998
85.239998
85.879997
85.879997
2014/10/13
86.849998
86.889999
84.919998
85.120003
85.120003
2014/10/14
85.809998
85.879997
83.220001
84.949997
84.949997
2014/10/15
84.040001
86.489998
82.809998
85.599998
85.599998
2014/10/16
84.980003
89.175003
84.014999
88.849998
88.849998
2014/10/17
90.400002
90.900002
87.669998
87.910004
87.910004
2014/10/20
88
89.5
8
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 模型 量化 股票交易