亲爱的名单, 我正在尝试用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
我已经定义了每日返回产生的信号和随机信号 指标(在这种情况下为donchian渠道)
那么命中率是
> 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"
智能循环的任何想法都是有价值的(注意:有必要 维护xts类以便从包中正确处理指标 TTR)
亚历
答案 0 :(得分:2)
您可以使用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,它们,irts,fts等)以及data.frame,matrix和numeric / integer向量。如果对象对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 ...