使用 for 循环的 QuantMod 错误。 runSum(x, n) 错误:n = 20 超出有效范围:[1, 5]

QuantMod error using the for loop . Error in runSum(x, n) : n = 20 is outside valid range: [1, 5]

我目前正在尝试 运行 对大约 500 个股票代码进行 for 循环,并尝试为所有这些股票创建一个图表。我已经成功地做到了这一点,但是我的 for 循环因这个错误而中断 Error in runSum(x, n) : n = 20 is outside valid range: [1, 5] 我从 BatchGetSymbols 库中获得了股票代码。

这是我的脚本,底部是我的 for 循环:

library(stocks)
library(BatchGetSymbols)
library(quantmod)
datalist <- list()
stocks <- c('MMM','ABT','ABBV','ABMD','ACN','ATVI','ADBE','AMD','AAP','AES','AFL','A',
            'APD','AKAM','ALK','ALB','ARE','ALXN',
            'ALGN','ALLE','AGN','ADS','LNT','ALL','GOOGL','GOOG','MO','AMZN','AMCR',
            'AEE','AAL','AEP','AXP','AIG','T','AMT','AWK','AMP','ABC','AME','AMGN','APH','ADI','ANSS',
            'ANTM','AON','AOS','APA','AIV','AAPL','AMAT','APTV','ADM','ARNC','ANET','AJG','AIZ','ATO','ADSK','ADP',
            'AZO','AVB','AVY','BKR','BLL','BAC','BK','BAX','BDX','BRK.B',
            'BBY','BIIB','BLK','BA','BKNG','BWA','BXP','BSX','BMY','AVGO',
            'BR','BF.B','CHRW','COG','CDNS','CPB','COF','CPRI','CAH','KMX','CCL',
            'CAT','CBOE','CBRE','CDW','CE','CNC','CNP','CTL', 'CERN','CF','SCHW','CHTR','CVX','CMG','CB',
            'CHD','CI','CINF','CTAS','CSCO','C','CFG','CTXS','CLX','CME','CMS',
            'KO','CTSH','CL','CMCSA','CMA','CAG','CXO','COP','ED','STZ','COO','CPRT','GLW',
            'CTVA','COST','COTY','CCI','CSX','CMI', 'CVS','DHI','DHR','DRI','DVA','DE','DAL',
            'XRAY','DVN','FANG','DLR','DFS','DISCA','DISCK',
            'DISH','DG','DLTR','D','DOV','DOW','DTE','DUK','DRE','DD','DXC','ETFC',
            'EMN','ETN','EBAY','ECL','EIX','EW','EA','EMR','ETR','EOG','EFX','EQIX',
            'EQR','ESS','EL','EVRG','ES','RE','EXC','EXPE','EXPD','EXR',
            'XOM','FFIV','FB','FAST','FRT','FDX','FIS',
            'FITB','FE','FRC','FISV','FLT','FLIR','FLS','FMC', 'F','FTNT','FTV','FBHS','FOXA','FOX','BEN',
            'FCX','GPS','GRMN','IT','GD','GE','GIS','GM',
            'GPC','GILD','GL','GPN','GS','GWW','HRB','HAL','HBI','HOG','HIG',
            'HAS', 'HCA','PEAK','HP','HSIC','HSY','HES','HPE','HLT', 'HFC','HOLX','HD',
            'HON', 'HRL','HST', 'HWM','HPQ','HUM',  'HII', 'IEX',
            'IDXX', 'INFO','ITW','ILMN','INCY', 'IR','INTC',
            'ICE','IBM','IP','IPG','IFF','INTU','ISRG','IVZ','IPGP',
            'IQV', 'IRM', 'JKHY','J','JBHT', 'SJM', 'JNJ', 'JCI','JPM','JNPR','KSU','K','KEY', 'KEYS',
            'KMB', 'KIM','KMI', 'KLAC','KSS','KHC','KR',
            'LB', 'LHX', 'LH', 'LRCX','LW', 'LVS','LEG', 'LDOS', 'LEN','LLY','LNC',
            'LIN','LYV','LKQ','LMT','L','LOW','LYB','MTB','M','MRO','MPC','MKTX','MAR','MMC','MLM','MAS','MA',
            'MKC','MXIM', 'MCD','MCK','MDT','MRK','MET',  'MTD','MGM','MCHP','MU','MSFT', 'MAA',
            'MHK', 'TAP','MDLZ','MNST','MCO','MS', 'MOS','MSI','MSCI',
            'MYL','NDAQ', 'NOV','NTAP','NFLX','NWL','NEM','NWSA','NWS','NEE','NLSN','NKE',
            'NI','NBL','JWN','NSC','NTRS','NOC','NLOK','NCLH','NRG','NUE','NVDA','NVR', 'ORLY', 'OXY',
            'ODFL', 'OMC','OKE','ORCL','PCAR','PKG','PH','PAYX','PAYC','PYPL','PNR', 'PBCT','PEP','PKI','PRGO',
            'PFE','PM', 'PSX', 'PNW','PXD', 'PNC','PPG','PPL','PFG',
            'PG','PGR','PLD','PRU','PEG','PSA','PHM','PVH','QRVO','PWR','QCOM',
            'DGX','RL','RJF', 'RTX','O','REG','REGN','RF','RSG', 'RMD',
            'RHI','ROK','ROL','ROP','ROST','RCL','SPGI','CRM','SBAC','SLB','STX',
            'SEE', 'SRE','NOW','SHW','SPG','SWKS', 'SLG','SNA','SO','LUV', 'SWK','SBUX',
            'STT', 'STE', 'SYK','SIVB', 'SYF','SNPS','SYY','TMUS','TROW','TTWO','TPR','TGT','TEL',
            'FTI', 'TFX','TXN','TXT','TMO','TIF','TJX','TSCO','TT',
            'TDG','TRV','TFC', 'TWTR','TSN','UDR','ULTA', 'USB', 'UAA','UA',
            'UNP','UAL','UNH', 'UPS','URI','UHS','UNM','VFC','VLO','VAR', 'VTR',
            'VRSN', 'VRSK','VZ', 'VRTX','VIAC', 'V', 'VNO','VMC',
            'WRB','WAB','WMT','WBA', 'DIS','WM','WAT','WEC','WFC','WELL','WDC','WU','WRK','WY','WHR',
            'WMB','WLTW','WYNN',  'XEL', 'XRX','XLNX', 'XYL','YUM', 'ZBRA','ZBH','ZION', 'ZTS'
)

stockEnv <- new.env()
View(stockEnv)
symbols <- getSymbols(stocks, src='yahoo', env=stockEnv)

for (stocks in ls(stockEnv)){
  chartSeries(stockEnv[[stocks]], theme="white", name=stocks,
              TA="addVo();addBBands();addCCI();
        addSMA(5, col='red');addMACD();addRSI();addROC()", subset='last 30 days')     
}

下载数据后,我收到以下警告消息:

Warning message:
HWM contains missing values. Some functions will not work if objects contain missing values in the middle of the series. Consider using na.omit(), na.approx(), na.fill(), etc to remove or replace them. 

这可能是该错误消息的来源。让我们来看看HWM

head(stockEnv[[stocks]])
           HWM.Open HWM.High HWM.Low HWM.Close HWM.Volume HWM.Adjusted
2019-10-03    24.17    24.28   23.74     24.25    2828500        24.25
2019-10-04    24.21    24.50   23.96     24.49    2250500        24.49
2019-10-07       NA       NA      NA        NA         NA           NA
2019-10-08       NA       NA      NA        NA         NA           NA
2019-10-09       NA       NA      NA        NA         NA           NA
2019-10-10       NA       NA      NA        NA         NA           NA

tail(stockEnv[[stocks]])
           HWM.Open HWM.High HWM.Low HWM.Close HWM.Volume HWM.Adjusted
2020-03-27       NA       NA      NA        NA         NA           NA
2020-03-30       NA       NA      NA        NA         NA           NA
2020-03-31       NA       NA      NA        NA         NA           NA
2020-04-01    15.40    15.40   12.71     13.20    2531000        13.20
2020-04-02    12.97    13.71   12.00     12.50    4431900        12.50
2020-04-03    12.10    12.69   11.85     12.54    4053100        12.54

所以根据警告信息,HMW 在系列中间有 NA,但这是 for 循环失败的原因吗? for循环会告诉你导致循环停止的罪魁祸首,只需检查stocks变量的内容即可。

stocks
[1] "HWM"

是的,HWM 是造成这种情况的原因。问题是 为什么 这会失败?查看 chartseries() 源代码,前两行检查它是否是 xts 对象并删除 NA:

x <- try.xts(x, error = "chartSeries requires an xtsible object")
x <- na.omit(x)

stockEnv[[stocks]] 上调用 na.omit 得到:

 na.omit(stockEnv[[stocks]])
           HWM.Open HWM.High HWM.Low HWM.Close HWM.Volume HWM.Adjusted
2019-10-03    24.17    24.28   23.74     24.25    2828500        24.25
2019-10-04    24.21    24.50   23.96     24.49    2250500        24.49
2020-04-01    15.40    15.40   12.71     13.20    2531000        13.20
2020-04-02    12.97    13.71   12.00     12.50    4431900        12.50
2020-04-03    12.10    12.69   11.85     12.54    4053100        12.54

五行数据,与报错信息中x中的五行匹配:

Error in runSum(x, n) : n = 20 is outside valid range: [1, 5] 

查看您传递给 TA 参数的函数列表,addBBands 有一个参数 n,默认值为 20。我不确定 addBBands 的确切位置 addBBands() 调用 runSum() 但我假设它使用 n 的值,即 20 传递给 runSum() 中的 n 参数。 n 的值大于数据的行数然后导致该错误。

如何解决这个问题?这取决于您想如何对待这些 NA。我的建议是完全排除这个份额。您可能更愿意用零替换 NA,我不建议这样做,因为零表示当天交易的股票,而对于 NA,您不知道发生了什么。数据太小,无法近似或插值。

希望对您有所帮助。