Frage

Liebe Liste, ich versuche technische Analyse mit R, verwendete Pakete TTR, Quantmod, Zoo Ich habe tägliche Goldpreise. Die Daten sehen aus wie:

> 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

Ich habe Signale definiert, die durch tägliche Rückgaben und Signale nach Zufallsanzeige generiert wurden (in diesem Fall Donchische Kanäle von Donchischen)

Das Trefferverhältnis ist dann

> 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

Dies gibt mir die Ergebnisse für den gesamten Zeitraum, aber ich möchte das Trefferverhältnis für jedes Jahr und auch für einen bestimmten Zeitraum (sagen wir 100 Tage), habe ich Quantmods Funktion ausprobiert apply.yearly(), aber es hat nicht funktioniert. Außerdem habe ich es auch versucht

> years <- unique(substr(g[,"Date"],1,4))
Error in dimnames(cd) <- list(as.character(index(x)), colnames(x)) : 
  'dimnames' applied to non-array

wohingegen

> 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"

Alle Ideen für die Smart Loop wären wertvoll (Hinweis: Es ist erforderlich, die XTS -Klasse zu pflegen, um die ordnungsgemäße Arbeit von Indikatoren aus dem Paket -TTR zu ordnungsgemäß).

Alex

War es hilfreich?

Lösung

Sie können dies mit tun apply.yearly, aber alle Daten, die nach Perioden aufgeteilt werden sollen, müssen in einem Objekt sein, weil apply.yearly Nur Splits x und nicht signal (oder irgendetwas anderes über übergeben über ...).

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

Außerdem ist Ihr "Hinweis", dass TTR XTS -Objekte benötigt, falsch. TTR-Funktionen verwenden XTS intern, mit denen sie die meisten Zeitreihenklassen (XTs, Zoo, Timeseries, Chron, ITS, IRTs, FTS usw.) sowie Daten.Frame, Matrix- und numerische/ganzzahlige Vektoren verarbeiten können. Wenn das Objekt für XTS zwanghaft ist, gibt TTR -Funktionen ein Objekt der gleichen Klasse zurück, die ihnen gegeben wurde.

Zum Beispiel:

> 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 ...
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top