R: Análisis técnico de resultados anuales
-
27-10-2019 - |
Pregunta
Estimado lista, estoy tratando de análisis técnico con R, utilizando paquetes TTR, Quantmod, Zoo tengo precios diarios de oro, los datos se ven como:
> library(quantmod)
> library(timeSeries)
> gold <- read.csv("gold.csv")
> g <- as.xts(gold, dateFormat = "Date")
> g.c<-Cl(g)
> head(g)
Open High Low Close
1999-01-08 292.2 293.3 291.2 292.0
1999-01-11 292.3 294.3 291.6 293.6
1999-01-12 292.2 292.5 288.0 289.3
1999-01-13 288.8 289.1 285.0 287.0
1999-01-14 287.4 287.4 285.0 287.4
1999-01-15 286.7 287.6 286.4 287.4
> first(g)
Open High Low Close
1999-01-08 292.2 293.3 291.2 292
> last(g)
Open High Low Close
2010-10-20 1332 1346.5 1330.8 1343.6
He definido señales generadas por devoluciones diarias y señales por indicador aleatorio (en este caso, canales de Donchian)
La relación de éxito es entonces
> x<-g.c
> timeseries.eval <- function(x,signal) {
+ returns <- returns(x)
+ hit.rate <- function(x,signal) {
+ rate<- length(which(signal*returns> 0))/length(x)
+ rate
+ }
+ round(data.frame(N=length(x),HitRate=hit.rate(x,signal)),3)
+ }
> timeseries.eval(x, sig.dc)
N HitRate
1 3074 0.628
Esto me da resultados durante todo el período, sin embargo, quiero ver la relación de éxito para cada año y también para un período específico (digamos 100 días) he probado la función de Quantmod apply.yearly()
, Pero no funcionó. Además, también he probado
> years <- unique(substr(g[,"Date"],1,4))
Error in dimnames(cd) <- list(as.character(index(x)), colnames(x)) :
'dimnames' applied to non-array
mientras
> j<-as.data.frame(g)
> years <- unique(substr(y,1,4))
> years
[1] "1999" "2000" "2001" "2002" "2003" "2004" "2005" "2006" "2007" "2008" "2009" "2010"
Cualquier idea para Smart Loop sería valioso (nota: es necesario mantener la clase XTS para el trabajo adecuado de indicadores del paquete TTR)
Alex
Solución
Puedes hacer esto con apply.yearly
, pero todos los datos que se dividirán por período deben estar en un objeto porque apply.yearly
Solo divisiones x
y no signal
(o cualquier otra cosa pasó a través de ...
).
library(quantmod)
getSymbols("GLD", from="2007-01-03", to="2011-01-28")
set.seed(21)
sig <- sign(runif(NROW(GLD)))
hit.rate <- function(returnSignal) {
N <- NROW(na.omit(returnSignal))
HitRate <- sum(returnSignal[,1]*returnSignal[,2]>0, na.rm=TRUE)/N
cbind(N,HitRate)
}
hit.rate(merge(ROC(Cl(GLD)),sig))
# N HitRate
# [1,] 1026 0.539961
apply.yearly(merge(ROC(Cl(GLD)),sig), hit.rate)
# GLD.Close sig
# 2007-12-31 250 0.5560000
# 2008-12-31 253 0.5256917
# 2009-12-31 252 0.5277778
# 2010-12-31 252 0.5634921
# 2011-01-28 19 0.3684211
Además, su "nota" de que TTR requiere objetos XTS es incorrecto. Las funciones TTR usan XTS internamente, lo que les permite manejar la mayoría de las clases de serie temporal (XTS, Zoo, Timeseries, Chron, ITS, IRTS, FTS, etc.), así como datos. Vectores de datos, matriz y numéricos/enteros. Si el objeto es coercible para XTS, las funciones TTR devolverán un objeto de la misma clase que se les da.
Por ejemplo:
> str(ROC(Cl(GLD)))
An ‘xts’ object from 2007-01-03 to 2011-01-28 containing:
Data: num [1:1027, 1] NA -0.01017 -0.0243 0.00514 0.0061 ...
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr "GLD.Close"
Indexed by objects of class: [Date] TZ:
xts Attributes:
List of 2
$ src : chr "yahoo"
$ updated: POSIXct[1:1], format: "2011-01-31 08:41:53"
> str(ROC(as.zoo(Cl(GLD))))
‘zoo’ series from 2007-01-03 to 2011-01-28
Data: Named num [1:1027] NA -0.01017 -0.0243 0.00514 0.0061 ...
- attr(*, "names")= chr [1:1027] "2007-01-03" "2007-01-04" "2007-01-05" "2007-01-08" ...
Index: Class 'Date' num [1:1027] 13516 13517 13518 13521 13522 ...
> str(ROC(as.timeSeries(Cl(GLD))))
Time Series:
Name: object
Data Matrix:
Dimension: 1027 1
Column Names: GLD.Close
Row Names: 2007-01-03 ... 2011-01-28
Positions:
Start: 2007-01-03
End: 2011-01-28
With:
Format: %Y-%m-%d
FinCenter: GMT
Units: GLD.Close
Title: Time Series Object
Documentation: Mon Jan 31 08:48:35 2011
> str(ROC(as.ts(Cl(GLD))))
Time-Series [1:1027] from 1 to 1027: NA -0.01017 -0.0243 0.00514 0.0061 ...
> str(ROC(as.data.frame(Cl(GLD))))
'data.frame': 1027 obs. of 1 variable:
$ GLD.Close: num NA -0.01017 -0.0243 0.00514 0.0061 ...
> str(ROC(as.matrix(Cl(GLD))))
num [1:1027, 1] NA -0.01017 -0.0243 0.00514 0.0061 ...
- attr(*, "dimnames")=List of 2
..$ : chr [1:1027] "2007-01-03" "2007-01-04" "2007-01-05" "2007-01-08" ...
..$ : chr "GLD.Close"
> str(ROC(as.numeric(Cl(GLD))))
num [1:1027] NA -0.01017 -0.0243 0.00514 0.0061 ...