R语言新手使用xts对象计算BTC收益率时遇非数值参数错误求助
解决R中计算比特币收益率的错误问题
问题根源
从str(bitcoin)的输出可以看到,你创建的xts对象中所有数据都是字符类型(character),包括BTC.Close列。而log()函数仅支持数值型输入,这就是报错non-numeric argument to mathematical function的核心原因。
修复步骤
1. 将BTC.Close转换为数值型并规范xts对象
你可以选择在构建xts前处理原数据框,或者直接修正已有的错误xts对象:
方式一:构建xts前处理原数据框(推荐)
# 将BTC.Close列转为数值型,若数据含$、逗号等特殊符号,先清理再转换 btc$BTC.Close <- as.numeric(btc$BTC.Close) # 构建xts时仅传入数值列,时间列作为索引(无需将date列放入数据部分) bitcoin <- xts(btc$BTC.Close, order.by = btc$date) # 给列命名,方便后续使用quantmod的Cl()函数 colnames(bitcoin) <- "BTC.Close"
方式二:修正已有的错误xts对象
# 将BTC.Close列转为数值型 bitcoin$BTC.Close <- as.numeric(bitcoin$BTC.Close) # 删除冗余的date列(xts的索引已经是时间,无需重复存储) bitcoin <- bitcoin[, "BTC.Close"]
2. 重新计算收益率
现在BTC.Close是数值型,即可正常执行收益率计算:
library(quantmod) ret_btc <- diff(log(Cl(bitcoin)))
或者不用quantmod的Cl()函数,直接通过列名访问:
ret_btc <- diff(log(bitcoin$BTC.Close))
得到的ret_btc就是xts格式的收益率序列。
注意事项
- 构建xts对象时,数据部分只保留分析用的数值列即可,时间列仅作为
order.by的索引,避免冗余数据引发问题。 - 如果转换数值型时出现
NA,检查原Excel中BTC.Close列是否包含非数字内容,可通过gsub清理,例如:btc$BTC.Close <- as.numeric(gsub("\\$|,", "", btc$BTC.Close))
内容的提问来源于stack exchange,提问作者ines
相关产品推荐
相关产品推荐

