R: Jahresergebnisse zur technischen Analyse
-
27-10-2019 - |
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
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 ...