首页 > 解决方案 > 在 R 中计算 periodReturn 时出错

问题描述

我有一个.csv。包含每日 ohlc 汇率数据的文件。现在我需要每小时数据,但是当我尝试使用 quantmod 包的 periodReturn 函数时收到错误消息。这是我所做的:

EURUSD_Min = CSV_EUR


eurusd_minutedata_df = as.data.frame(EURUSD_Min)


colnames(eurusd_minutedata_df)[1] <- "Date"
colnames(eurusd_minutedata_df)[2] <- "Time"
colnames(eurusd_minutedata_df)[3] <- "Bid"
colnames(eurusd_minutedata_df)[4] <- "Ask"
colnames(eurusd_minutedata_df)[5] <- "High"
colnames(eurusd_minutedata_df)[6] <- "Low"
colnames(eurusd_minutedata_df)[7] <- "Close"

eurusd_minutedata_df$Date = as.POSIXct(paste(eurusd_minutedata_df$Date, eurusd_minutedata_df$Time), format="%Y-%m-%d %H:%M:%S")
eurusd_minutedata_df_final <- eurusd_minutedata_df[-2]



  index_min_eurusd <- eurusd_minutedata_df_final$Date
  data_min_eurusd <- data.frame(eurusd_minutedata_df_final[,2:6])
  df.ohlc.min_eurusd_xts <- xts(data_min_eurusd, index_min_eurusd)
  eurusd_min_return <- diff(log(Cl(df.ohlc.min_eurusd_xts)), lag=1)
 
  eurusd_min_return

 2021-07-28 21:16:00  1.690188e-04
 2021-07-28 21:17:00  3.379520e-04
 2021-07-28 21:18:00  0.000000e+00
 2021-07-28 21:19:00 -1.689617e-04

 periodReturn(eurusd_min_return, period = "hourly")

但我得到了错误:

   Error in if (on == "secs" || on == "mins") on <- substr(on, 1L, 3L) : 
   missing value where TRUE/FALSE needed

有谁知道我需要做什么才能使它工作?

原始数据如下所示:# A tibble: 2,982 x 7

     `Local Date` `Local Time`    Bid   Ask  High   Low  Open
       <date>       <time>       <dbl> <dbl> <dbl> <dbl> <dbl>
    1 2021-07-30   23:00         1.19  1.19  1.19  1.19  1.19
    2 2021-07-30   22:59         1.19  1.19  1.19  1.19  1.19
    3 2021-07-30   22:58         1.19  1.19  1.19  1.19  1.19
    4 2021-07-30   22:57         1.19  1.19  1.19  1.19  1.19
    5 2021-07-30   22:56         1.19  1.19  1.19  1.19  1.19

标签: rreturnquantmod

解决方案


你应该学会检查中间结果。您呼叫的格式规范as.POSIXct有秒数,但您的数据没有。因此,您在处理的一开始就获得了 NA。这是我的主张的证明。

 txt <- "2021-07-30 23:00" # my guess at the results of `paste` on your data
 as.POSIXct(txt, format="%Y-%m-%d %H:%M:%S")
#[1] NA

您应该打印出中间结果以找出生成 NA 的位置。(这可能不是唯一的地方,但它肯定会给你一个 NA,所以你可以尝试适当地改变你的格式规范。)

 as.POSIXct(txt, format="%Y-%m-%d %H:%M")
#[1] "2021-07-30 23:00:00 PDT"

我怀疑你实际上并没有给出一个明确的描述,如果数据正在处理,因为错误直到你处理的后期才发生。更好的是提供结果dput(head(eurusd_minutedata_df))作为起点,然后提供所有需要的library调用来加载所需的包,然后是产生该错误的代码。


推荐阅读