2013-06-06 1 views
5

Я очень новичок в R и пытаюсь воспроизвести стратегию, которую я запрограммировал уже в WealthLab.R: Протестируйте торговую стратегию. Начинающие к квантовому моменту и R

Несколько вещей я не понимаю (и это не работает, очевидно :)

  1. Я не получить Закрыть Цены приятно в векторе ... или какой-то вектор, но это начинается со структуры, и я действительно не понимаю, что делает эта функция. Вот почему моя серия [, 1], вероятно, не работает.

  2. < п - nrow (серия) не работает, либо, но мне нужно, что для Loop

Так что я думаю, если я получаю эти 2 вопросы моя стратегия должна работать ... Я «м очень благодарен за любой help..R кажется довольно сложным, даже с опытом программирования на других языках

#rm(list = ls(all = TRUE)) 

#import data, default is yahoo 
require(quantmod) 
series <- getSymbols('AAPL',from='2013-01-01') 
#generate HLOC series 
close <- Cl(AAPL) 
open <- Op(AAPL) 
low <-Lo(AAPL) 
high <- Hi(AAPL) 

#setting parameters 
lookback <- 24 #24 days ago 
startMoney <- 10000 


#Empty our time series for position and returns 
f <- function(x) 0 * x 

position <- apply(series[,1],FUN=f) 
colnames(position)="long_short" 

returns <- apply(series[,1],FUN=f) 
colnames(returns)="Returns" 

trades = returns 
colnames(trades)="Trades" 

amount = returns 
colnames(amount) = "DollarAmount" 
amt[seq(1,lookback)] = startMoney 


#Calculate all the necessary values in a loop with our trading strategy 
n <- nrow(series) 

for(i in seq(lookback+1,n)){ 
    #get the return 
    if(position[i-1] == 1){ 
    #we were long 
    returns[i] = close[i]/close[i-1] - 1 
    } else if(position[i-1] == -1){ 
    #we were short 
    returns[i] = close[i-1]/close[i] - 1 
    } 


    #long/short position 
    if(open[i-lookback]<open[i] && low[i-1] < open[i]){ 
    #go long 
    position[i] = 1  
    } else if(open[i-lookback]>open[i] && high[i-1] > open[i]){ 
    # go short 
    position[i] = -1 
    } else { 
    position[i] = position[i-1] 
    } 

    #mark a trade if we did one 
    if(position[i] != position[i-1]) trades[i] = 1 

    #Calculate the dollar amount 
    amount[i] = amount[i-1]*exp(returns[i]) 
    if(trades[i]) amount[i] = amount[i] - 2 
} 
+0

Просьба [воспроизводимый пример] (HTTP: // stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). 'position <- apply (series [, 1], FUN = f)' приводит к ошибке. –

+0

да Я вроде скопировал некоторые строки кода из этого урока и не очень понимаю эту строку. Я имею в виду ряд [, 1], который, как я думал, применил бы функцию f к «столбцу» 1 серии. Но так как эта серия является некоторым дополнением со структурой и т. Д., Это не сработает. Я говорю об этом учебнике: http://www.r-bloggers.com/backtesting-a-trading-strategy/ – MichiZH

+1

'fapply'! =' Apply'. Это разные функции, с разными аргументами и различным поведением. –

ответ

14

Начиная со вторым вопросом

> s <- getSymbols('SPY') 
> nrow(s) 
NULL 
> class(s) 
[1] "character" 
> s.data <- get(s) 
> class(s.data) 
[1] "xts" "zoo" 
> nrow(s.data) 
[1] 1635 

Для того чтобы работать над фактическим xts объектом, вам необходимо использовать get.

О вашем первом вопросе - я не думаю, что вам действительно нужно вытащить данные в виде вектора - объект xts - это массив, индексированный по дате, и с ним легко работать. Если вы все еще хотите, чтобы получить данные, которые вы можете использовать

closing.prices <- coredata(Cl(s)) 

Теперь, чтобы вы начали с простого обратно тестирования стратегий я предложу работать в следующих шагах

определить свою стратегию. 2. создайте массив или добавьте столбец к вашему объекту xts, который будет представлять вашу позицию за каждый день. 1 для длинных, 0 без позиции и -1 для коротких (позже вы можете играть с номером для рычага). 3. умножьте каждый день возврат с позиции, и вы получите вектор возврата стратегии. 4. проанализировать результаты - моя рекомендация PerformanceAnalytics.

простая стратегия - покупать, когда близко над SMA20 в, продают под

library(quantmod) 
library(PerformanceAnalytics) 

s <- get(getSymbols('SPY'))["2012::"] 
s$sma20 <- SMA(Cl(s) , 20) 
s$position <- ifelse(Cl(s) > s$sma20 , 1 , -1) 
myReturn <- lag(s$position) * dailyReturn(s) 
charts.PerformanceSummary(cbind(dailyReturn(s),myReturn)) 

и это то, что вы получите

enter image description here

+1

. Отличный простой пример того, как тестировать стратегию. – StatsViaCsh

+0

Здравствуйте, @haki. Это должно быть: clos.prices <- coredata (Cl (s.data)), а не: clos.prices <- coredata (Cl (s)) – mql4beginner