均线模型量化股票交易Word下载.docx
《均线模型量化股票交易Word下载.docx》由会员分享,可在线阅读,更多相关《均线模型量化股票交易Word下载.docx(36页珍藏版)》请在冰豆网上搜索。
![均线模型量化股票交易Word下载.docx](https://file1.bdocx.com/fileroot1/2022-11/30/1bda6515-c2b2-4482-871c-6fee182bc11e/1bda6515-c2b2-4482-871c-6fee182bc11e1.gif)
首先画出股价和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)]<
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]<
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("
"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
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
8