2013-11-15 9 views
1

저는 가이 욘린 (Guy Yonlin)의 우수 사례 코드 & 블로터에 대한 훌륭한 예제 코드를 작성하려고 노력하고 있지만 일련의 포트폴리오에 대해 작동하도록하고 있습니다. 불행히도 나는 기호의 목록을 읽고 R이 다운로드 된 실제 xts 데이터에 액세스하려고 노력하고있다.xts 오브젝트의 이름을 얻기 위해리스트를 읽으십시오

다음 코드에서 정확하게 첫 번째 심볼 인 "BND"을 찾을 수 있지만 TempSym을 심볼의 실제 xts 객체로 설정하여 실제로 행이 있도록하는 방법을 알 수는 없습니다.

내가 뭘 잘못하고 있니? 실제로 볼 수있는 오류는 다음과 같습니다.

[1] "BND" 
Error in 1:nrow(TempSym) : argument of length 0 

이 시점에서 주석 처리 된 부분은 디버깅되지 않았습니다. 그들은 내가 Guy의 예제 코드에서 갈 것이라고 생각하는 곳을 기반으로합니다.

library(blotter) 
MyPortfolios = c("Port1", "Port2") 

MySymbols=list() 
MySymbols[[1]]= c("BND","DBC","DXJ") 

MySymbols[[2]]= c("ALD", "BND","DBC","ECON") 

currency("USD") 

get("USD",envir=FinancialInstrument:::.instrument) 

Date_Start = "2013-01-01" 
Date_End = format(Sys.time(), "%Y-%m-%d") 

Sys.setenv(TZ="UTC") 

TotalSymbols = 0 
for (j in 1:length(MySymbols)){ 
    TempSym = MySymbols[[j]] 
    for (i in 1:length(TempSym)){ 
    if (!exists(paste(TempSym[i]))){ 
     stock(TempSym[i], currency="USD", multiplier=1) 
     get(TempSym[i],envir=FinancialInstrument:::.instrument) 
     getSymbols(TempSym[i], from=Date_Start, to=Date_End, adjust=T) 
     TotalSymbols = TotalSymbols + 1 
    } 
    } 
    rm(TempSym) 
} 

print(paste("Total symbols downloaded: ", TotalSymbols)) 
rm(TotalSymbols) 

suppressWarnings(rm("account.LongTerm",pos=.blotter)) 
suppressWarnings(rm("portfolio.Port1", pos=.blotter)) 
suppressWarnings(rm("portfolio.Port2", pos=.blotter)) 

initPortf(MyPortfolios[1], as.list(MySymbols[[1]]), initDate="2013-06-01") 
initPortf(MyPortfolios[2], as.list(MySymbols[[2]]), initDate="2013-06-01") 

initAcct("LongTerm", MyPortfolios, initDate="2013-06-01", initEq=600000) 

addTxn("Port1", Symbol="BND", TxnDate="2013-06-10", TxnQty=733, TxnPrice=81.83, TxnFees=0) 
addTxn("Port1", Symbol="DBC", TxnDate="2013-06-10", TxnQty=343, TxnPrice=26.22, TxnFees=0) 
addTxn("Port1", Symbol="DXJ", TxnDate="2013-06-10", TxnQty=259, TxnPrice=46.30, TxnFees=0) 

addTxn("Port2", Symbol="ALD", TxnDate="2013-06-11", TxnQty=60, TxnPrice=49.92, TxnFees=0) 
addTxn("Port2", Symbol="BND", TxnDate="2013-06-11", TxnQty=159, TxnPrice=81.83, TxnFees=0) 
addTxn("Port2", Symbol="ECON", TxnDate="2013-06-11", TxnQty=58, TxnPrice=26.67, TxnFees=0) 

################### 
# For each portfolio 
# look up each symbol 
# and calculate equity for each bar 
################### 

for (k in 1:length(MyPortfolios)){ 
    TempList = MySymbols[[k]] 
    for (j in 1:length(TempList)){ 
    TempSym = TempList[[j]] 
    print(paste(TempSym)) 
    for (i in 1:nrow(TempSym)){ 
#  CurrentDate <- time(TempSym)[i] 
#  updatePortf(MyPortfolios[k], Dates = CurrentDate) 
#  updateAcct(MyPortfolios[k], Dates = CurrentDate) 
#  updateEndEq(MyPortfolios[k], Dates = CurrentDate) 
    } 
    } 
} 


# create custom theme 
myTheme<-chart_theme() 
myTheme$col$dn.col<-'purple' 
myTheme$col$dn.border <- 'lightgray' 
myTheme$col$up.col<-'orange' 
myTheme$col$up.border <- 'lightgray' 

chart.Posn(MyPortfolios[1], Symbol = "BND", Dates = "2013::", theme=myTheme) 
chart.Posn(MyPortfolios[1], Symbol = "DBC", Dates = "2013::", theme=myTheme) 
chart.Posn(MyPortfolios[1], Symbol = "DXJ", Dates = "2013::", theme=myTheme) 

chart.Posn(MyPortfolios[2], Symbol = "ALD", Dates = "2013::", theme=myTheme) 
chart.Posn(MyPortfolios[2], Symbol = "BND", Dates = "2013::", theme=myTheme) 
chart.Posn(MyPortfolios[2], Symbol = "ECON", Dates = "2013::", theme=myTheme) 

답변

2

당신은 stocksgetSymbols 모두 벡터화 기능은 모두 같은 모든 루프가 필요하지 않습니다. get 명령도 필요하지 않습니다. 또한 모든 타임 스탬프에 대해 updatePortf, updateAcctupdateEndEq을 호출 할 필요가 없습니다. 포트폴리오 이름과 계정 이름으로 호출 할 수 있으며 가격 데이터를 사용할 수있는 모든 타임 스탬프에 대한 계정 및 포트폴리오를 자동으로 시장에 표시합니다.

library(blotter) 
MyPortfolios = c("Port1", "Port2") 

MySymbols = list() 
MySymbols[[1]] = c("BND", "DBC", "DXJ") 

MySymbols[[2]] = c("ALD", "BND", "DBC", "ECON") 

currency("USD") 
## [1] "USD" 


Date_Start = "2013-01-01" 
Date_End = format(Sys.time(), "%Y-%m-%d") 

Sys.setenv(TZ = "UTC") 


stock(MySymbols[[1]], currency = "USD", multiplier = 1) 
## [1] "BND" "DBC" "DXJ" 

stock(MySymbols[[2]], currency = "USD", multiplier = 1) 
## [1] "ALD" "BND" "DBC" "ECON" 


getSymbols(MySymbols[[1]], from = Date_Start, to = Date_End, adjust = T) 
## [1] "BND" "DBC" "DXJ" 

getSymbols(MySymbols[[2]], from = Date_Start, to = Date_End, adjust = T) 
## [1] "ALD" "BND" "DBC" "ECON" 




suppressWarnings(rm("account.LongTerm", pos = .blotter)) 
suppressWarnings(rm("portfolio.Port1", pos = .blotter)) 
suppressWarnings(rm("portfolio.Port2", pos = .blotter)) 

initPortf(MyPortfolios[1], as.list(MySymbols[[1]]), initDate = "2013-06-01") 
## [1] "Port1" 

initPortf(MyPortfolios[2], as.list(MySymbols[[2]]), initDate = "2013-06-01") 
## [1] "Port2" 


initAcct("LongTerm", MyPortfolios, initDate = "2013-06-01", initEq = 6e+05) 
## [1] "LongTerm" 


addTxn("Port1", Symbol = "BND", TxnDate = "2013-06-10", TxnQty = 733, TxnPrice = 81.83, TxnFees = 0) 
## [1] "2013-06-10 00:00:00 BND 733 @ 81.83" 

addTxn("Port1", Symbol = "DBC", TxnDate = "2013-06-10", TxnQty = 343, TxnPrice = 26.22, TxnFees = 0) 
## [1] "2013-06-10 00:00:00 DBC 343 @ 26.22" 

addTxn("Port1", Symbol = "DXJ", TxnDate = "2013-06-10", TxnQty = 259, TxnPrice = 46.3, TxnFees = 0) 
## [1] "2013-06-10 00:00:00 DXJ 259 @ 46.3" 


addTxn("Port2", Symbol = "ALD", TxnDate = "2013-06-11", TxnQty = 60, TxnPrice = 49.92, TxnFees = 0) 
## [1] "2013-06-11 00:00:00 ALD 60 @ 49.92" 

addTxn("Port2", Symbol = "BND", TxnDate = "2013-06-11", TxnQty = 159, TxnPrice = 81.83, TxnFees = 0) 
## [1] "2013-06-11 00:00:00 BND 159 @ 81.83" 

addTxn("Port2", Symbol = "ECON", TxnDate = "2013-06-11", TxnQty = 58, TxnPrice = 26.67, TxnFees = 0) 
## [1] "2013-06-11 00:00:00 ECON 58 @ 26.67" 


updatePortf(MyPortfolios[1]) 
## [1] "Port1" 

updatePortf(MyPortfolios[2]) 
## [1] "Port2" 


updateAcct("LongTerm") 
## [1] "LongTerm" 

updateEndEq("LongTerm") 
## [1] "LongTerm" 

btw. 당신이 직면 한 특정 오류는 을 사용하여 TempSym에 xts 객체를 할당해야한다는 것입니다. 하지만 위의 코드에서 볼 수 있듯이이 루프를 사용할 필요가 없습니다.

for (k in 1:length(MyPortfolios)){ 
    TempList = MySymbols[[k]] 
    for (j in 1:length(TempList)){ 
    TempSym = get(TempList[[j]]) # <--------------------- 
    print(paste(TempSym)) 
    for (i in 1:nrow(TempSym)){ 
     CurrentDate <- time(TempSym)[i] 
     updatePortf(MyPortfolios[k], Dates = CurrentDate) 
     updateAcct(MyPortfolios[k], Dates = CurrentDate) 
     updateEndEq(MyPortfolios[k], Dates = CurrentDate) 
    } 
    } 
} 
+0

감사합니다. 벡터화 된 함수 주석을 이해하기 위해 노력해야 할 것입니다. 나는 포인터에 감사드립니다. 감사! – LGTrader