2017-07-02 26 views
3

我試圖將MACD和RSI技術指標應用於股票列表的調整價格。代碼的最終目標是基於2個指標爲每隻股票生成買/賣信號。但是,使用lapply函數應用指標時遇到了問題。我會感謝你的幫助。謝謝!如何將技術指標應用到股票列表中

#Load Packages 
    library(quantstrat) 

#Initialise Settings 
    start.date <- "2016-01-01" 
    end.date <- as.character(Sys.Date()) 

#Stock Tickers 
    tickers <- c("JPM", #JP Morgan 
    "FB", #Facebook 
    "SPY", #S&P 500 
    "AMZN", #Amazon 
    "WMT", #Wal-Mart 
    "LVMUY", #LVMH 
    "MCD", #Mac Donald's 
    "BMW", #BMW 
    "KO", #Coca-Cola 
    "G13.SI", #Genting Sg 
    "Z74.SI" #Singtel 
    ) 

#Retrieving Stock Data 
    options("getSymbols.yahoo.warning"=FALSE) 
    suppressMessages(getSymbols(Symbols = tickers, from = start.date, to = end.date, src = "yahoo", adjust = TRUE)) 

#Grouping Adjusted Prices 
    AdjPrices <- do.call(merge, lapply(tickers, function(x) Ad(get(x)))) 

#Apply MACD Indicator 
    MACD <- lapply(AdjPrices, MACD, list(AdjPrices, nFast =12, nSlow = 26, nSig = 9)) 

回答

4

試試這個:

MACD <- lapply(AdjPrices, FUN = MACD, nFast =12, nSlow = 26, nSig = 9) 

也許你最終要這樣呢?

z <- do.call(merge, lapply(AdjPrices, function(x, nFast, nSlow, nSig) { 
     y <- MACD(x, nFast, nSlow, nSig) 
     colnames(y) <- paste0(colnames(y),".", gsub(pattern = ".Adjusted", replacement = "", x = colnames(x))) 
     y 
     }, nFast = 12, nSlow = 26, nSig = 9)) 

> tail(z) 
      macd.JPM signal.JPM macd.FB signal.FB macd.SPY signal.SPY 
2017-06-23 0.5439033 0.2746984 0.7333757 0.6242897 0.4931503 0.5617852 
2017-06-26 0.5628315 0.3323250 0.7378923 0.6470103 0.4735852 0.5441452 
2017-06-27 0.6455863 0.3949773 0.5754388 0.6326960 0.3884193 0.5130000 
2017-06-28 0.8647098 0.4889238 0.5809413 0.6223450 0.3883060 0.4880612 
2017-06-29 1.1460891 0.6203568 0.4633677 0.5905496 0.3134080 0.4531306 
2017-06-30 1.3738249 0.7710504 0.3627919 0.5449980 0.2656285 0.4156302 

編輯,所要去的更多說明:

在上述lapply函數調用,一個匿名函數被定義(該位:function(x, nFast, nSlow, nSig) { ..... }),其計算MACD爲一個代碼,然後重命名列。請注意,此函數沒有「名稱」,或者換句話說,函數未分配給變量(編寫此代碼將函數分配給R中的變量,例如use_macd <- function() {}

上述代碼等同於以下(更詳細)代碼,在這裏我們明確地定義lapply將調用的函數,然後將結果與do.call(merge ....合併)

use_MACD <- function(x, nFast, nSlow, nSig) { 
       y <- MACD(x, nFast, nSlow, nSig) 
       colnames(y) <- paste0(colnames(y),".", gsub(pattern = ".Adjusted", replacement = "", x = colnames(x))) 
       y 
} 


tickerLst <- lapply(AdjPrices, FUN = use_MACD, nFast = 12, nSlow = 26, nSig = 9) 
# Now have a list of "macd" values for each ticker. 

#Combine into one xts object: 
z <- do.call(merge, tickerLst) 
+0

你好,很抱歉這麼晚纔回復,再次感謝你的幫助。你能否向我解釋你的代碼是如何工作的?爲了回答你的問題,是的,我最終希望看到這個。另外,如果兩個指標的標準都滿足,我想包括RSI指標,然後生成買入/賣出信號。 –

+0

關於此代碼的含義尚不清楚,我將展開?你首先在你的問題中使用了這些函數(如do.call等),所以不確定你不清楚什麼。 – FXQuantTrader

+0

您可以向我解釋do.call函數中方括號{}的作用嗎?謝謝! –