R: Технический анализ Годовой результаты
-
27-10-2019 - |
Вопрос
Уважаемый список, я пытаюсь для технического анализа с R, используя пакеты TTR, QuantMod, ZOO У меня есть ежедневные цены на золото, данные выглядят как:
> 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
Я определил сигналы, генерируемые ежедневными доходами и сигналами случайным индикатором (в данном случае Дончианские каналы)
Коэффициент попадания тогда
> 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
Это дает мне результаты за весь период, однако я хочу видеть коэффициент попадания в течение каждого года, а также в течение определенного периода (скажем, 100 дней) я пробовал функцию Quantmod apply.yearly()
, но это не сработало. Более того, я также попробовал
> years <- unique(substr(g[,"Date"],1,4))
Error in dimnames(cd) <- list(as.character(index(x)), colnames(x)) :
'dimnames' applied to non-array
тогда как
> 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"
Любые идеи для Smart Loop были бы ценными (примечание: необходимо поддерживать класс XTS, чтобы надлежащая работа индикаторов из пакета TTR)
Алекс
Решение
Вы можете сделать это с apply.yearly
, но все данные, которые должны быть разделены на период, должны быть в одном объекте, потому что apply.yearly
только расщепляет x
и не signal
(или что -нибудь еще прошло через ...
).
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
Кроме того, ваше «примечание», которое TTR требует объектов XTS, является неверным. Функции TTR используют XTS внутренне, что позволяет им обрабатывать большинство классов временных рядов (XTS, ZOO, TimeSeries, Chron, ITS, IRTS, FTS и т. Д.), А также Data.Frame, матрица и числовые/целочисленные векторы. Если объект принуждает к XTS, функции TTR вернут объекту того же класса, который им дал.
Например:
> 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 ...