2013-06-06 32 views
5

Tôi rất mới để R và cố gắng để backtest một chiến lược tôi đã lập trình đã có trong WealthLab.R: Hoàn thiện chiến lược giao dịch. Người mới bắt đầu để quantmod và R

vài thứ mà tôi không hiểu (và nó không hoạt động rõ ràng :)

  1. tôi không nhận được giá Đóng độc đáo vào một vector ... hoặc một số loại vector nhưng nó bắt đầu với cấu trúc và tôi không thực sự hiểu chức năng này làm gì. Đó là lý do tại sao chuỗi cuộc gọi [, 1] của tôi có thể không hoạt động.

  2. n < - nrow (series) không làm việc một trong hai, nhưng tôi cần phải có cho Loop

Vì vậy, tôi đoán nếu tôi nhận được những câu hỏi đã trả lời 2 chiến lược của tôi nên làm việc ... Tôi đang rất biết ơn đối với bất kỳ help..R có vẻ khá phức tạp ngay cả với kinh nghiệm lập trình bằng ngôn ngữ khác

#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

Vui lòng cung cấp một [ví dụ tái sản xuất] (http: // stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). 'vị trí <- áp dụng (chuỗi [, 1], FUN = f)' dẫn đến lỗi. –

+0

yeah Tôi đã sao chép một số dòng mã từ hướng dẫn này và không thực sự hiểu dòng này. Tôi có nghĩa là loạt [, 1] tôi nghĩ sẽ áp dụng các chức năng f vào "cột" 1 của bộ truyện. Nhưng kể từ khi loạt bài này là một số compley với cấu trúc, vv nó không hoạt động. Tôi đang nói về hướng dẫn này: http://www.r-bloggers.com/backtesting-a-trading-strategy/ – MichiZH

+1

'fapply'! =' Apply'. Chúng là các hàm khác nhau, với các đối số khác nhau và hành vi khác nhau. –

Trả lời

14

Bắt đầu với câu hỏi thứ hai

> 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 

Vì vậy, nếu bạn muốn làm việc trên đối tượng xts thực tế bạn cần sử dụng get.

Giới thiệu câu hỏi đầu tiên của bạn - tôi không nghĩ bạn thực sự cần lấy dữ liệu dưới dạng vectơ - đối tượng xts là một mảng được lập chỉ mục theo ngày và rất dễ làm việc. Nếu bạn vẫn muốn để có được những dữ liệu mà bạn có thể sử dụng

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

Bây giờ, để giúp bạn bắt đầu với thử nghiệm trở lại đơn giản của các chiến lược tôi sẽ đề nghị làm việc trong các bước sau

xác định chiến lược của bạn. 2. tạo một mảng hoặc thêm một cột vào đối tượng xts của bạn sẽ đại diện cho vị trí của bạn cho mỗi ngày. 1 cho dài, 0 cho không có vị trí và -1 cho ngắn (sau này bạn có thể chơi với số cho đòn bẩy). 3. nhân mỗi ngày trở lại với vị trí và bạn sẽ nhận được vector trả về chiến lược của mình. 4. kiểm tra kết quả - đề xuất của tôi là PerformanceAnalytics.

đơn giản chiến lược - mua khi gần qua SMA20, bán dưới

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)) 

và đây là những gì bạn sẽ nhận được

enter image description here

+1

cảm ơn vì điều này. Ví dụ đơn giản tuyệt vời về cách kiểm tra chiến lược. – StatsViaCsh

+0

Xin chào @haki, Nó phải là: closing.prices <- coredata (Cl (s.data)) và không: closing.prices <- coredata (Cl (s)) – mql4beginner

Các vấn đề liên quan