【问题标题】:R Finding the RSI on a subsetR在子集上查找RSI
【发布时间】:2021-05-31 19:13:36
【问题描述】:

我正在使用以下代码来查找股票的 RSI(相对强弱指数)和 DEMA(双指数移动平均线)。

library(quantmod)
library(TTR)
getSymbols("AAPL")
chartSeries(AAPL, TA=NULL)
data=AAPL[,4]
AAPL$rsi = TTR::RSI(data)
AAPL$dema = TTR::DEMA(data)

# object B stores the copy of AAPL object and I save it in a CSV file
B = AAPL 

每天,对象AAPL 都会有一个新行来反映最后一个收盘日的数据。

RSIDEMA 函数每天都在整个数据集上运行。似乎在过去 12 年以上的数据上一次又一次地运行 RSI 是在浪费 CPU 能力和时间,即使数据中只添加了一个新行(最后一个交易日)。

有没有办法在AAPL 对象中找到仅最后一天的RSIDEMA 等,并将其添加到旧数据集B

我想知道当量化交易者每秒钟获取报价数据时,他们会如何进行这种操作,并且他们需要在新的和所有过去的数据上找到 RSI 和其他一些指标。即使使用最快的计算机,也需要几分钟才能获取指标数据,届时市场会发生变化。

谢谢!

【问题讨论】:

  • 下载数据比计算 RSI 需要更长的时间。如果您想获得时间,限制您下载的数据量,您可以仅将最后一行数据附加到带有write.table(rows_to_append, "mycvs.csv", append = TRUE, row.names = FALSE, col.names = FALSE)的csv文件
  • 下载数据不是问题。我有最新的数据,没有任何延迟。只是指标需要时间。
  • 有些数据提供者允许您直接获取 RSI,即它是预先计算的。替代方案只是刷新最后一个 RSI 值,将代码移动到较低级别/编译的语言,这将使计算比在 R 中快得多(尽管 TTR 正在使用编译代码,据我所知,因此应该相当快)。
  • 有许多图表工具可以逐笔获取数据 (OHLC),它们几乎可以即时更新所有指标。我确信他们不会每天为整个数据集计算指标。我完全错过了一些东西。此外,我不想依赖数据提供者提供指标,因为我无法调整它们。

标签: r quantmod ttr


【解决方案1】:

假设您昨天下载了所有相关数据并计算了所有 RSI 和 DEMA 统计数据。以下是截至 2021 年 3 月 2 日的数据。

library(quantmod)
library(TTR)
getSymbols("AAPL")
chartSeries(AAPL, TA=NULL)
AAPL <- AAPL[, ]
data=AAPL[,4]
AAPL$rsi = TTR::RSI(data)
AAPL$dema = TTR::DEMA(data)
#            AAPL.Open AAPL.High AAPL.Low AAPL.Close AAPL.Volume AAPL.Adjusted      rsi     dema
# 2021-02-23    123.76    126.71   118.39     125.86   158273000        125.86 35.08898 127.7444
# 2021-02-24    124.94    125.56   122.23     125.35   111039900        125.35 34.28019 126.5275
# 2021-02-25    124.68    126.46   120.54     120.99   148199500        120.99 28.27909 124.2326
# 2021-02-26    122.59    124.85   121.20     121.26   164320000        121.26 29.10677 122.6783
# 2021-03-01    123.75    127.93   122.79     127.79   115998300        127.79 45.49055 123.7497
# 2021-03-02    128.41    128.72   125.01     125.12   102015300        125.12 41.28885 123.7178

然后,将此结果保存到 CSV:

write_csv(as.data.frame(AAPL), "aapl.csv")

现在,您今天下载了数据并获得了一个新数据点。通过使用最近 200 天的数字,您可以为最近一天生成与使用整个数据集相同的值。这似乎也适用于其他符号,但您需要确保它具有泛化性。

getSymbols("AAPL")
data=AAPL[(nrow(AAPL)-200):nrow(AAPL),4]
AAPL$rsi = TTR::RSI(data)
AAPL$dema = TTR::DEMA(data)
tail(AAPL)
#            AAPL.Open AAPL.High AAPL.Low AAPL.Close AAPL.Volume AAPL.Adjusted      rsi     dema
# 2021-02-24    124.94    125.56   122.23     125.35   111039900        125.35 34.28019 126.5275
# 2021-02-25    124.68    126.46   120.54     120.99   148199500        120.99 28.27909 124.2326
# 2021-02-26    122.59    124.85   121.20     121.26   164320000        121.26 29.10677 122.6783
# 2021-03-01    123.75    127.93   122.79     127.79   115998300        127.79 45.49055 123.7497
# 2021-03-02    128.41    128.72   125.01     125.12   102015300        125.12 41.28885 123.7178
# 2021-03-03    124.81    125.71   121.84     122.06   112430400        122.06 37.06365 122.7313

然后您可以按照@phiver 的建议将最后一行附加到上一个 CSV:

write_csv(as.data.frame(AAPL)[nrow(AAPL), ], "aapl.csv", append=TRUE)

真正的问题是从这样的程序中可以获得什么?查看两个不同程序的基准,使用中值估计,对完整数据执行 RSI 操作几乎慢了 40%,但如果您只进行几次调用,则不会明显。我没有在这里打印结果,但是 DEMA 例程在完整数据集上慢了大约 30%。如果您必须每天这样做数千次,这样做可能是有道理的,但如果您必须每天这样做 10 次,则可能不值得这么麻烦。

library(microbenchmark)
microbenchmark(TTR::RSI(AAPL[,4]), times=1000)
# Unit: microseconds
#                       expr    min      lq     mean   median      uq      max neval
# TTR::RSI(AAPL[, 4]) 797.03 823.431 1008.936 852.5145 924.193 18113.29  1000
microbenchmark(TTR::RSI(AAPL[(nrow(AAPL)-200):nrow(AAPL),4]), times=1000)
# Unit: microseconds
#                                             expr     min      lq     mean median      uq      max neval
# TTR::RSI(AAPL[(nrow(AAPL) - 200):nrow(AAPL), 4]) 634.306 652.424 710.9095 671.79 706.294 11743.02  1000

【讨论】:

  • 谢谢,戴夫。我实际上每天都在做几千次,速度真的很重要。默认情况下,RSI 回溯期仅为 14 天。如果我对过去 14 天进行子集化并在这些天运行 RSI,则结果值与我在整个集合上运行后得到的值不同。只是想知道,为什么您决定回顾 200 天而不是 100 天或 50 天?
  • 100 不足以产生与在完整数据集上所做的相同的答案。结果收敛到 200 左右。
  • 知道了。由于 RSI 在 200 天内稳定,有使用 EMA、DEMA 等的指标需要 500 天或更长时间才能稳定。一定有办法避免这种重复计算。
  • 对于比我更了解这些事情的人来说,这是一个很好的问题。祝你好运!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-24
  • 2012-06-08
相关资源
最近更新 更多