forked from ncornwell/R
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathNewMA.R
76 lines (66 loc) · 2.92 KB
/
NewMA.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#get MAImp code from GIST
#thanks to http://systematicinvestor.wordpress.com
#for showing me how to do this
#con=url("https://raw.github.com/gist/1405187/92e7c24ff2459a0830c45b828f1dba41143e9436/MAImp.r")
#source(con)
require(quantmod)
require(PerformanceAnalytics)
getSymbols("^GSPC",from = "1896-01-01", to = Sys.Date())
#test 20 day simple crossover 50 day simple
signals <- MAImp(GSPC, k1=20, k2=50)
#another example would be a simple 100 day moving average price cross
#signals <- MAImp(GSPC, k1=100)
#use lag 1 to eliminate foresight
#signal is 1 (in) and 0 (out)
ret <- merge(rep(ROC(GSPC[,4],type="discrete",n=1),3) * lag(signals,k=1),ROC(GSPC[,4],type="discrete",n=1))
colnames(ret) <- c(colnames(signals),"BuyHold")
jpeg(filename="performance summary.jpg",
quality=100,width=6.25, height = 8, units="in",res=96)
charts.PerformanceSummary(ret,ylog=TRUE,
main = "Test of Improved Moving Average",
colorset=c("cadetblue","darkolivegreen3","gray70","bisque3"))
#dev.off()
#table.AnnualizedReturns(ret)
require(ggplot2)
#ggplot downside statistics
downside <- as.data.frame(table.DownsideRisk(ret))
#get rid of drawdown since it messes up the chart
#and is already shown on Performance Summary
downside <- downside[c(1:6,8:11),]
downsideMelt<-melt(cbind(rownames(downside),downside),id.vars=1)
colnames(downsideMelt)<-c("Statistic","System","Value")
jpeg(filename="ggplot downside.jpg",
quality=100,width=6.25, height = 8, units="in",res=96)
ggplot(downsideMelt, stat="identity", aes(x=Statistic,y=Value,fill=System)) +
geom_bar(position="dodge") +
coord_flip() +
scale_fill_manual(values=c("cadetblue","darkolivegreen3","gray70","bisque3","purple")) +
theme_bw()
#dev.off()
#ggplot CAPM statistics
capm <- as.data.frame(table.CAPM(ret[,1:3],ret[,4]))
capmTable<-melt(cbind(rownames(capm),capm),id.vars=1)
colnames(capmTable)<-c("Statistic","System","Return")
jpeg(filename="ggplot capm.jpg",
quality=100,width=6.25, height = 8, units="in",res=96)
ggplot(capmTable, stat="identity", aes(x=Statistic,y=Return,fill=System)) +
geom_bar(position="dodge") +
coord_flip() +
scale_fill_manual(values=c("cadetblue","darkolivegreen3","gray70","bisque3","purple")) +
theme_bw()
#dev.off()
#test 10 month Mebane Faber style moving average for another example
GSPC.monthly <- to.monthly(GSPC)[,4]
#convert date index to yyyy-mm-dd
index(GSPC.monthly) <- as.Date(index(GSPC.monthly))
signals.monthly <- MAImp(GSPC.monthly, k1=10)
#use lag 1 to eliminate foresight
#signal is 1 (in) and 0 (out)
ret.monthly <- merge(rep(ROC(GSPC.monthly,type="discrete",n=1),3) * lag(signals.monthly,k=1),ROC(GSPC.monthly,type="discrete",n=1))
colnames(ret.monthly) <- c(colnames(signals.monthly),"BuyHold")
jpeg(filename="performance monthly.jpg",
quality=100,width=6.25, height = 8, units="in",res=96)
charts.PerformanceSummary(ret.monthly,ylog=TRUE,
main = "Test of Improved Moving Average on Monthly",
colorset=c("cadetblue","darkolivegreen3","gray70","bisque3"))
#dev.off()