R 特殊数据帧
我问了一个问题,跟我昨天在这篇文章中问的一样: 我设法找出了每个季度最重要的技术交易规则。我已经建立了一个数据框来放置这些TTR的名称。给你,我有一个季度专栏R 特殊数据帧,r,xts,random-forest,R,Xts,Random Forest,我问了一个问题,跟我昨天在这篇文章中问的一样: 我设法找出了每个季度最重要的技术交易规则。我已经建立了一个数据框来放置这些TTR的名称。给你,我有一个季度专栏 1 2 3 4 5 6 7 8 9 10 11 1 RSI2 RSI3 RSI2 RSI10 RSI2 RSI2 RSI2 RSI2 RSI2
1 2 3 4 5 6 7 8 9 10 11
1 RSI2 RSI3 RSI2 RSI10 RSI2 RSI2 RSI2 RSI2 RSI2 RSI2 RSI2
2 RSI3 RSI4 RSI3 RSI20 RSI3 RSI3 RSI3 RSI4 RSI4 RSI3 RSI3
3 RSI4 RSI5 RSI4 EMA5 RSI4 RSI4 RSI5 RSI5 RSI5 RSI4 RSI4
4 RSI5 RSI10 RSI5 EMA20 RSI5 RSI5 RSI10 EMA5 RSI10 RSI5 RSI5
5 RSI10 RSI20 RSI10 EMA60 SMA5 RSI10 RSI20 EMA20 RSI20 RSI10 RSI10
6 SMA20 SMA60 RSI20 SMI atr RSI20 SMA60 EMA60 SMA5 RSI20 SMA5
7 SMA60 pctB SMA20 ADX pctB EMA5 atr atr SMA60 atr SMA20
8 atr calcs.1 pctB pctB macd EMA20 pctB ADX pctB ADX EMA20
9 pctB <NA> <NA> macd myVolat EMA60 <NA> pctB macd pctB EMA60
10 myChaikinVol <NA> <NA> signal calcs.1 pctB <NA> macd signal myVolat ADX
11 myVolat <NA> <NA> calcs <NA> macd <NA> signal mySAR calcs.1 pctB
12 calcs <NA> <NA> <NA> <NA> <NA> <NA> myVolat myVolat <NA> myChaikinVol
13 <NA> <NA> <NA> <NA> <NA> <NA> <NA> calcs.1 <NA> <NA> myVolat
14 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> calcs
我想做的是,在TTR不显著的期间,放置一个NA
。例如,如果RSI2 TTR在第一季度不显著,我想用NA
s替换数值,但如果RSI2在第五季度显著,我想保留数值
最后,我应该得到一个与初始数据框尺寸相同的数据框
有什么想法吗?谢谢 首先,您应该将规则存储在列表中,而不是data.frame中。这样您就不必用NAs填充每个“规则列表”以使其长度相同,还可以使用
lappy
处理数据
由于您没有提供任何数据,我编造了一些:
#Load data
set.seed(42)
library(quantmod)
getSymbols('SPY')
SPY <- adjustOHLC(SPY)
dat <- dailyReturn(Cl(SPY))
#Add some TTRs
for (rule in c('RSI', 'SMA')){
for (n in c(5, 10, 15, 20, 25)){
newvar <- paste(rule, n, sep='_')
FUN <- get(rule)
dat <- cbind(dat, FUN(dat[,1], n=n))
names(dat)[length(names(dat))] <- newvar
}
}
dat <- na.omit(dat)
rulenames <- names(dat)[-1]
我还制作了一些每年使用的TTR
#Make a list of rules for each year
library(lubridate)
dat$Year <- year(index(dat))
uniqueYear <- sort(unique(dat$Year))
rulesList <- lapply(uniqueYear, function(x) rulenames[runif(length(rulenames))>.5])
names(rulesList) <- uniqueYear
现在只需每年循环一次,并将dat
对象子集到适当的行(年)和列(TTR):
如果你发布代码,你会得到更好的答案。请尝试存储一个
列表,而不是data.frame
。非常感谢Zach给出的非常有价值的答案。
> dat[1:5, 1:5]
daily.returns RSI_5 RSI_10 RSI_15 RSI_20
2007-02-08 -0.001308450 40.06379 46.99824 48.59484 49.11738
2007-02-09 -0.007447249 26.65296 40.34267 44.35689 46.10753
2007-02-12 -0.003404196 42.49883 45.94447 47.58264 48.30373
2007-02-13 0.008434995 67.89045 58.59450 55.64932 54.07276
2007-02-14 0.006567123 62.45177 56.28547 54.23836 53.08886
#Make a list of rules for each year
library(lubridate)
dat$Year <- year(index(dat))
uniqueYear <- sort(unique(dat$Year))
rulesList <- lapply(uniqueYear, function(x) rulenames[runif(length(rulenames))>.5])
names(rulesList) <- uniqueYear
> rulesList
$`2007`
[1] "RSI_5" "RSI_10" "RSI_20" "RSI_25" "SMA_5" "SMA_10" "SMA_20" "SMA_25"
$`2008`
[1] "RSI_10" "RSI_15" "SMA_5" "SMA_10" "SMA_25"
$`2009`
[1] "RSI_5" "RSI_15" "RSI_20" "SMA_5" "SMA_15" "SMA_25"
$`2010`
[1] "RSI_5" "RSI_10" "RSI_20" "SMA_5" "SMA_20" "SMA_25"
$`2011`
[1] "RSI_20" "SMA_5" "SMA_10" "SMA_15" "SMA_20" "SMA_25"
$`2012`
[1] "RSI_20" "SMA_5" "SMA_10" "SMA_25"
#Apply the rules to each data.frame
data.by.year <- lapply(uniqueYear, function(year){
rule_subset <- rulesList[[as.character(year)]]
data_subset <- dat[dat$Year==year, rule_subset]
})
names(data.by.year) <- uniqueYear
> str(data.by.year[[1]])
An ‘xts’ object from 2007-02-08 to 2007-12-31 containing:
Data: num [1:226, 1:8] 40.1 26.7 42.5 67.9 62.5 ...
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr [1:8] "RSI_5" "RSI_10" "RSI_20" "RSI_25" ...
Indexed by objects of class: [Date] TZ:
xts Attributes:
List of 3
$ tclass : chr "Date"
$ tzone : chr ""
$ na.action:Class 'omit' atomic [1:25] 1 2 3 4 5 6 7 8 9 10 ...
.. ..- attr(*, "index")= num [1:25] 1.17e+09 1.17e+09 1.17e+09 1.17e+09 1.17e+09 ...
>