均线模型量化股票交易Word文件下载.doc
《均线模型量化股票交易Word文件下载.doc》由会员分享,可在线阅读,更多相关《均线模型量化股票交易Word文件下载.doc(24页珍藏版)》请在冰点文库上搜索。
![均线模型量化股票交易Word文件下载.doc](https://file1.bingdoc.com/fileroot1/2023-4/29/f3557829-62b2-490b-8696-ac808f9c98d6/f3557829-62b2-490b-8696-ac808f9c98d61.gif)
2.当股价上穿20日均线则买入(红色),下穿20日均线卖出(蓝色)。
首先画出股价和20日均线图
以散点覆盖20日均线,红色点为买入持有,蓝色点为卖出空仓。
用股价和20日均线价格做比较,把股价大于均线的部分用蓝色表示,股价小于均线的部分用红色表示。
我们看到图中,蓝色点和红色点在20日均线上交替出现,我们可以在每次红色出现的第一个点买入股票,然后在蓝色的第一个点卖出股票。
找出交易信号点,并以100000本金做模拟交易。
为简化操作假定在信号点满仓买入或卖出,手续费为0。
运算结果显示,亏损的有11笔而盈利的只有3笔,一年下来一共亏损了17038元。
似乎一条均线模型是失败的,因为它不仅没能盈利反而带来的亏损。
下面就从股价和模拟现金投入来进行简单的分析亏损原因。
该图示,上半红色部分为日收盘价,下半蓝色部分为模拟交易的现金流,对比可见,阿里股价在14年年底开始走低,而根据一条均线模型进行的投资策略比较合理的预测了股市的走势并进行了股票的买入卖出,在一定程度上是减少了亏损。
两条均线的交易策略
一条均线模型,在大的趋势下是可以进行稳定投资的,但由于一条均线对于波动非常敏感性,如果小波动过于频繁,不仅会增加交易次数,而且会让模型失效。
然后,就有二条均线的策略模型,可以减低对波动的敏感性。
二条均线策略模型,与一条均线模型思路类似,以5日均线价格替换股价,是通过5日
均线和20日均线交叉来进行信号交易的。
画出股价、5日均线和20日均线图
以同样的条件进行两条均线交易策略的模拟交易。
根据运算结果,虽然依旧亏损了11笔
盈利3笔,但最终带来了总盈利7408元。
两种策略的简单分析
策略一在模拟交易中一共进行了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–Algorithmic.June23,2007.‐.2007b.DodgyTickers–StockExchanges.Economist.March10,2007.
[7]M.KearnsandL.Ortiz.ThePenn‐Lehmanautomatedtradingproject.IEEEIntelligentSystems,2003.Toappear.
[8]Domowitz,I.,andH.Yegerman.2005.“TheCostofAlgorithmicTrading:
AFirstLookatComparativePerformance.”EditedbyBrianR.Bruce,AlgorithmicTrading:
Precision,Control,Execution.InstitutionalInvestor.
附表一:
R语言代码
#加载必须的函数包
library(plyr)library(quantmod)library(TTR)library(ggplot2)library(scales)
library(reshape2)
#设置存储位置
setwd("
E:
/Statisticalmodeling/"
)
#下载数据
download<
-function(stock,from="
2013-01-01"
){df<
-getSymbols(stock,from=from,env=environment(),=FALSE) #下载数据names(df)<
-c("
Open"
"
High"
Low"
Close"
Volume"
Adjusted"
)(df,file=paste(stock,"
.csv"
sep="
"
),sep="
quote=FALSE)#保存到本地}
#本地读数据
read<
-function(stock){
(file=paste(stock,"
),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<
-cdatafor(minmas){ldata<
-merge(ldata,SMA(cdata,m))
}ldata<
(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("
2months"
),limits=
c(sDate,eDate))g<
-g+xlab("
)+ylab("
Price"
)+ggtitle(title)
if(out)ggsave(g,file=paste(titie,"
.png"
))elseg
#选取数据并运行
cdata<
-BABA['
2014/2015'
]$Closetitle<
Stock_BABA"
#图片标题sDate<
("
2014-9-19"
)#开始日期eDate<
2015-10-23"
)#结束日期
ldata<
-ma(cdata,c(5,20,60))#选择滑动平均指标
p0<
-drawLine(ldata,title,sDate,eDate)#画图ggsave(p0,file=paste(title,"
)) #存图
#画出股价和20日均线图
ldata1<
-ma(cdata,c(20))#选择滑动平均指标p11<
-drawLine(ldata1,title,sDate,eDate)#画图
###以散点覆盖20日均线,红色点为买入持有,蓝色点为卖出空仓
##定义均线图+散点函数
drawPoint<
-function(ldata,pdata,titie,sDate,eDate){g<
-g+geom_point(aes(x=Index,y=pdata[,3],colour=compare),data=pdata)
g<
),limits=c(sDate,eDate))g<
)+ggtitle(title)g
##定义获取散点数据函数
getPoint<
-function(ldata){data<
-fortify(ldata)n<
-nrow(data)
data<
(data,compare=vector(length=n))v1<
-data[,2]v2<
-data[,3]dist<
-(v2-v1)
data$compare[which(dist<
0)]<
down"
)data$compare[which(dist>
=0)]<
up"
)pdata<
-data
#运行并获取数据
pdata<
-getPoint(ldata1)
p1<
-drawPoint(ldata1,pdata,title,sDate,eDate)
##定义找出交易信号点函数
Signal<
-function(cdata,pdata){n<
-nrow(pdata)pdata1<
(pdata,Sigs=vector(length=n),comp=vector(length=n),p=vector(length=n))pdata1$comp[which(pdata1$compare=="
)]<
-1pdata1$comp[which(pdata1$compare=="
-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]<
B"
)pdata1$Sigs[which(pdata1$p>
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<
(tdata,cash,amount,asset,diff)
if(t[1,4]=="
)t[1,5]<
-capitalelset[1,5]<
-(capital%%t[1,2])if(t[1,4]=="
)t[1,6]<
-0elset[1,6]<
-floor(capital/t[1,2])t[1,7]<
-capitalt[1,8]<
n){if(t$Sigs[i]=="
){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
#定义数据,运行
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)<
Time"
cash"
)xx<
-melt(xx,id="
yy<
-fortify(ldata)k<
-c(1,2)yy<
-yy[,k]
colnames(yy)<
close"
)yy<
-melt(yy,id="
)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"
2month"
),limits=c(sDate,eDate))g<
)+ylab("
g
#运行
p2<
-drawCash(result1,ldata1)
ggsave(p2,file=paste("
close+cash"
###一条均线模型,在大的趋势下是可以稳定赚钱的,但由于一条均线对于波动非常敏感性,
###如果小波动过于频繁,不仅会增加交易次数,而且会让模型失效。
然后,就有二条均线的
###策略模型,可以减低对波动的敏感性。
二条均线策略模型,与一条均线模型思路类似,以###5日均线价格替换股价,是通过5日均线和20日均线交叉来进行信号交易的。
###首先画出股价,5日均线和20日均线图。
#选择5日和20日滑动平均指标
ldata2<
-ma(cdata,c(5,20))
#画图
p33<
-drawLine(ldata2,title,sDate,eDate)
#这步是为了将数据框与之前的函数格式对应
-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<
#画出股价现金图
p4<
-drawCash(result2,ldata2)
附表二:
阿里股票数据
Index
Open
High
Low
Close
Volume
Adjusted
2014/9/19
2014/9/22
2014/9/23
2014/9/24
2014/9/25
2014/9/26
2014/9/29
2014/9/30
89
2014/10/1
2014/10/2
2014/10/3
2014/10/6
9268400
2014/10/7
2014/10/8
88
2014/10/9
2014/10/10
2014/10/13
2014/10/14
2014/10/15
2014/10/16
2014/10/17
2014/10/20
9891400
2014/10/21
2014/10/22
2014/10/23
2014/10/24
98
2014/10/27
97
2014/10/28
2014/10/29
100
2014/10/30
2014/10/31
2014/11/3
2014/11/4
2014/11/5
2014/11/6
2014/11/7
2014/11/10
2014/11/11
2014/11/12
2014/11/13
120
2014/11/14
2014/11/17
2014/11/18
2014/11/19
2014/11/20
2014/11/21
2014/11/24
112
2014/11/25
2014/11/26
2014/11/28
8077800
2014/12/1
2014/12/2
110
2014/12/3
2014/12/4
2014/12/5
2014/12/8
2014/12/9
2014/12/10
2014/12/11
2014/12/12
2014/12/15
201