如何解决R语言计算股票收益时出现non-numeric argument to binary operation报错
R计算股票收益率报错解决方案
错误原因
报错Error in x[i + 1, ]/x[i, ] : non-numeric argument to binary operator核心是除法运算符两侧出现了非数值类型的变量,主要诱因有两个:
- 输入的
JSMR数据不是数值类型:可能是因子、字符型,或者你传入的是带非数值列的数据框而非价格向量 - 代码本身存在语法逻辑bug:
- 用R内置关键字
return作为自定义函数名,容易触发作用域冲突 - for循环的循环范围
1:n-1存在运算符优先级问题:R中冒号优先级高于减号,实际会生成0,1,2...n-1的序列,当i=0时取x[0,]为空值,也会触发类型报错
- 用R内置关键字
解决步骤
- 先校验输入数据类型,运行以下代码确认
JSMR为数值向量:
# 查看数据结构 str(JSMR) # 如果是因子/字符型,转成数值 JSMR <- as.numeric(JSMR) # 如果JSMR是数据框,取对应价格列,比如列名为close的话: # JSMR <- as.numeric(JSMR$close)
- 修正自定义函数的语法问题
修正后可运行代码
# 更换函数名避免和内置关键字冲突 calc_log_return <- function(x) { n <- length(x) x <- matrix(x, nrow = n, ncol = 1) return_data <- matrix(nrow = n-1, ncol = 1) # 给n-1加括号修正循环范围 for(i in 1:(n-1)) { return_data[i] = log(x[i+1,]/x[i,]) } return(return_data) } R_JSMR <- calc_log_return(JSMR)
更简化的高效写法
R支持向量化操作,不需要写循环即可直接计算对数收益率:
R_JSMR <- diff(log(JSMR))
内容的提问来源于stack exchange,提问作者Auliana Rahma
相关产品推荐
相关产品推荐

