2013-02-22 79 views
3

我正在使用quantmod軟件包。我有行情的載體是這樣的:R quantmod :: getFinancials

c("AAPL","GOOG","IBM","GS","AMZN","GE") 

,我想創建一個函數來計算股票(=營業收入/總收入)的息稅前利潤率。因此,對於一個給定的股票,我用下面這段代碼只適用於GE(提供了一個「.F」添加了股票的年底):

require(quantmod) 
getFinancials("GE",period="A") 
ebit.margin <- function(stock.ticker.f){ 
    return(stock.ticker$IS$A["Operating Income",]/stock.ticker$IS$A["Total Revenue",]) 
} 
ebit.margin("GE") 

我想概括這個功能爲了使用那麼apply函數。有幾個難點:

  • 當將quantmod::getFinancial函數應用於股票行情時,股票的財務報表被保存在默認環境中。然後viewFinancial用於獲取和打印財務報表。我需要一種直接訪問財務報表功能的方法
  • 函數的參數函數是一個類似「GE.f」的字符串,但直接輸入股票代碼(「GE」)會更方便。我試圖使用paste0gsub來得到一個像「GE.f」這樣的字符串,它不起作用,因爲「GE.f」不屬於financials類。

綜上所述,我有點失落......

+0

'period'是用於'viewFinancials'函數的參數,並且不使用由'getFinancials' – GSee 2013-02-23 00:39:36

回答

4

Anaother選擇是LAOD您的行情在一個新的環境在它更容易。

tickers <- new.env() 
s <- c("AAPL","GOOG","IBM","GS","AMZN","GE") 
lapply(s, getFinancials,env=tickers) 
sapply(ls(envir=tickers), 
     function(x) {x <- get(x) ## get the varible name 
        x$IS$A["Operating Income", ]/x$IS$A["Total Revenue",]}) 

       AAPL.f  AMZN.f  GE.f GOOG.f  GS.f  IBM.f 
2012-09-29 0.3529596 0.01106510 0.11811969 0.2543099 0.2689852 0.2095745 
2011-09-24 0.3121507 0.01792957 0.13753327 0.3068724 0.1676678 0.1964439 
2010-09-25 0.2818704 0.04110630 0.09415548 0.3540466 0.2804621 0.1974867 
2009-09-26 0.2736278 0.04606471 0.06387029 0.3514585 0.3837401 0.1776439 

編輯

無需使用lsget ....只是方便eapply(感謝@GSee),它適用FUN從環境中指定的值,並返回結果爲列表

eapply(tickers, function(x) 
       x$IS$A["Operating Income", ]/x$IS$A["Total Revenue",]) 
+1

甚至'eapply(行情,函數(X)X $爲$ A [ 「營業收入」 ,]/x $ IS $ A [「總收入」,])' – GSee 2013-02-23 01:49:58

+0

@明白! 'eapply'我不知道這個!我已經upvote你的答案,但+ 10 eapply! – agstudy 2013-02-23 01:55:22

+0

這很方便,但請記住,如果環境被散列,結果的順序將是任意的。 (並且,盡我所知,如果它沒有被散列,則以相反的順序) – GSee 2013-02-23 02:01:17

6

如果使用auto.assign=FALSE

s <- c("AAPL","GOOG","IBM","GS","AMZN","GE") 
fin <- lapply(s, getFinancials, auto.assign=FALSE) 
names(fin) <- s 
lapply(fin, function(x) x$IS$A["Operating Income", ]/x$IS$A["Total Revenue",]) 
#$AAPL 
#2012-09-29 2011-09-24 2010-09-25 2009-09-26 
# 0.3529596 0.3121507 0.2818704 0.2736278 
# 
#$GOOG 
#2012-12-31 2011-12-31 2010-12-31 2009-12-31 
# 0.2543099 0.3068724 0.3540466 0.3514585 
# 
#$IBM 
#2012-12-31 2011-12-31 2010-12-31 2009-12-31 
# 0.2095745 0.1964439 0.1974867 0.1776439 
# 
#$GS 
#2012-12-31 2011-12-31 2010-12-31 2009-12-31 
#0.2689852 0.1676678 0.2804621 0.3837401 
# 
#$AMZN 
#2012-12-31 2011-12-31 2010-12-31 2009-12-31 
#0.01106510 0.01792957 0.04110630 0.04606471 
# 
#$GE 
#2012-12-31 2011-12-31 2010-12-31 2009-12-31 
#0.11811969 0.13753327 0.09415548 0.06387029