2012-08-09 65 views
3

我有日期和價格作爲一個數據幀:Quantmod的getSymbol有什麼副作用?

>df 
Price Date 
1.25 2012-01-05 
... 

我創建一個貨幣和股票:

currency("USD") 
stock("GSPC", "USD") 

我然後創建一個XTS對象:

GSPC <- xts(df$Price, df$Date) 
colnames(GSPC) <- "Close" 

的打算使用的是創建一個吸墨紙組合 - 這是有效的。但是,當我嘗試

updatePortf(portfolio, Symbols="GSPC", Dates = current.date) 

我得到以下錯誤:

Error in get(Symbol, pos = env) : object 'GSPC' not found 

GSPC不「showSymbols()」顯示出來,所以我認爲它需要的地方註冊。有什麼方法可以註冊符號嗎?

一個非常哈克解決方法,由另一計算器答案的啓發是:

GSPC$GSPC.High <- GSPC$Open 
GSPC$GSPC.Low <- GSPC$Open 
GSPC$GSPC.Close <- GSPC$Open 
GSPC$GSPC.Volume <- GSPC$Open 
GSPC$GSPC.Adjusted <- GSPC$Open 

write.zoo(GSPC, file="GSPC.csv", sep=",") 
setSymbolLookup(GSPC=list(src="csv",format="%Y-%m-%d")) 

getSymbols("GSPC") 

有沒有更好的方式來創建上面?我沒有(需要)音量,高,低,關閉和調整 - 我仍然需要他們的吸墨紙?

UPDATE 我設法重現了這個問題,然後明白了它的原因。看起來你不能在本地函數環境中聲明xts對象。這是一個可重複腳本:

library(xts) 
library(FinancialInstrument) 
library(blotter) 
library(lubridate) 
rm(list=ls(envir=.blotter),envir=.blotter) 

runme <- function() { 
    currency("USD") 
    stock("GSPC", "USD") 

    dates <-ymd("2012-03-02") + seq(0,9) * ddays(1) 
    prices <- abs(rnorm(10)) 

    GSPC <- xts(prices, dates) 
    colnames(GSPC) <- "Close" 

    # Initialise 
    initPortf("p", symbols="GSPC", initDate=ymd("2012-01-01"), currency="USD") 
    initAcct("a", portfolios="p", initDate=ymd("2012-01-01"), initEq=2e6, currency="USD") 

    trade.date <- ymd("2012-03-04") 
    addTxn("p", "GSPC", trade.date, 1, GSPC[trade.date]) 

    updatePortf("p", Symbols="GSPC", Dates = trade.date) 
    updateAcct("a", Dates = trade.date) 

    updateEndEq("a", Dates = trade.date) 

    chart.Posn("p") 

} 
+0

什麼是'portfolio'?什麼是'current.date'?什麼是你得到的**精確**錯誤信息?如果您需要使其具有可重現性的幫助,請參閱http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example – GSee 2012-08-09 14:20:39

+0

感謝您添加可重複的代碼! :-) – GSee 2012-08-09 19:21:31

回答

2

吸墨紙包利用了FinancialInstrument包。您可能需要定義您的儀器。我想如果你做這樣的事情,它應該工作。

synthetic("GSPC", currency("USD")) 

如果不是,也許你可以提供一個可重複的例子。 (我們沒有自己的投資組合)

編輯:

更直接地回答這個問題在您的標題,getSymbols存儲list稱爲.getSymbols你,你已經使用getSymbols加載所有符號.GlobalEnv 。不過,我不認爲吸墨紙看着它。

編輯2:

你得到該錯誤消息告訴你,有你的.GlobalEnv名爲「全球植物保護戰略」的數據。您必須在.GlobalEnv中有xts對象,或者在Prices參數中將xts對象傳遞給updatePortf。再說一遍,如果你的例子是可重複的,我可以給予更好的幫助(更不用說它會使它對本網站的未來訪問者更有用)。

+0

對不起,我沒有包括定義股票的第一行。我會更新我的帖子。 – svenski 2012-08-09 14:15:02

+1

當你這樣做,繼續前進,使整個事情重現! – GSee 2012-08-09 14:16:42

+0

這可能是因爲你沒有關於'current.date'的任何數據。你可以嘗試使用'Dates = NULL'或'Dates = paste0(「/」,current.date)',但是你沒有提供你收到的實際錯誤,或者顯示了你的對象中有什麼數據。 – GSee 2012-08-09 14:27:44

1

只是爲了保持完整性,使片段工作上面,你需要GSPC分配給.GlobalEnv:

assign("GSPC", GSPC, envir=.GlobalEnv) 

完整的腳本是:

library(xts) 
library(FinancialInstrument) 
library(blotter) 
library(lubridate) 
rm(list=ls(envir=.blotter),envir=.blotter) 

runme <- function() { 
    currency("USD") 
    stock("GSPC", "USD") 

    dates <-ymd("2012-03-02") + seq(0,9) * ddays(1) 
    prices <- abs(rnorm(10)) 

    GSPC <- xts(prices, dates) 
    colnames(GSPC) <- "Close" 
    assign("GSPC", GSPC, envir=.GlobalEnv) 

    # Initialise 
    initPortf("p", symbols="GSPC", initDate=ymd("2012-01-01"), currency="USD") 
    initAcct("a", portfolios="p", initDate=ymd("2012-01-01"), initEq=2e6, currency="USD") 

    trade.date <- ymd("2012-03-04") 
    addTxn("p", "GSPC", trade.date, 1, GSPC[trade.date]) 

    updatePortf("p", Symbols="GSPC", Dates = trade.date) 
    updateAcct("a", Dates = trade.date) 

    updateEndEq("a", Dates = trade.date) 

    chart.Posn("p") 

} 
相關問題