【问题标题】:Generalize "$-notation"概括“$-notation”
【发布时间】:2021-12-09 15:13:29
【问题描述】:

我仍然习惯于在 R 中工作,并认为构建一个“简单的”MACD 筛选器将是了解 R 的一些内部工作的好方法。但是,我遇到了以下问题。 我已经完全能够计算出单独股票的 te MACD 和信号线。所以现在,为了能够扫描多只股票,我不得不概括代码。我的问题是:“如何在“$-notation”中使用变量(例如当前正在查看的股票名称)? 在此之后,我计划对列表对象中的股票名称进行“for 循环”迭代。这是一种实用的方法吗?

我在下面插入了到目前为止的代码。在这段代码中,我希望将“QQQ”替换为一个变量。

library(quantmod)
tickers <- c('QQQ','SPY','APPL','MMM')

ema.s = 12
ema.l = 26
ema.k = 9
ema.t = 200

getSymbols(tickers, from = '2021-01-6',
           to = "2021-10-21",warnings = FALSE,
           auto.assign = TRUE)

QQQ$QQQ.EMA.S <- EMA(QQQ[,6], n = ema.s)
QQQ$QQQ.EMA.L <- EMA(QQQ[,6], n = ema.l)
QQQ$QQQ.MACD <- QQQ$QQQ.EMA.S - QQQ$QQQ.EMA.L
QQQ$QQQ.SIG <- EMA(QQQ$QQQ.MACD, n = ema.k)

【问题讨论】:

  • 不要使用$ 表示法。 x$yx[["y"]] 几乎相同,所以使用后一种表示法。 (不同的是,如果x$y 没有找到,x$y 将提取x$y1,而括号表示法将给出NULL。)

标签: r quantmod


【解决方案1】:

您可以一次性使用 tidyquant 完成所有这些操作。

library(tidyquant)

ema.s = 12
ema.l = 26

tickers <- c('QQQ','SPY','AAPL','MMM')

# get all the data in a tibble
stock_data <- tq_get(tickers, 
                     from = '2021-01-6',
                     to = "2021-10-21")


stock_data <- stock_data %>% 
  group_by(symbol) %>% 
  tq_mutate(select = adjusted,
            mutate_fun = MACD,
            n_fast = ema.s,
            n_slow = ema.l)

stock_data 

# A tibble: 800 x 10
# Groups:   symbol [4]
   symbol date        open  high   low close   volume adjusted  macd signal
   <chr>  <date>     <dbl> <dbl> <dbl> <dbl>    <dbl>    <dbl> <dbl>  <dbl>
 1 QQQ    2021-01-06  307   312.  306.  308. 52809600     306.    NA     NA
 2 QQQ    2021-01-07  310.  316.  310.  315. 30394800     314.    NA     NA
 3 QQQ    2021-01-08  317.  319.  315.  319. 33955800     318.    NA     NA
 4 QQQ    2021-01-11  316.  317.  314.  314. 32746400     313.    NA     NA
 5 QQQ    2021-01-12  314.  316.  311.  314. 29266800     313.    NA     NA
 6 QQQ    2021-01-13  314.  317.  314.  316. 22898400     315.    NA     NA
 7 QQQ    2021-01-14  316.  318.  314.  314. 23500100     313.    NA     NA
 8 QQQ    2021-01-15  314.  315.  311.  312. 35118700     311.    NA     NA
 9 QQQ    2021-01-19  314.  317.  313.  316. 24537000     315.    NA     NA
10 QQQ    2021-01-20  320.  325.  317.  324. 30728100     323.    NA     NA  

如果您想在仅结合 quantmod 函数的基本 R 函数中执行此操作,请检查 quantmod 标签,有一些帖子使用 lapply 执行此操作。如果你没有找到你需要的东西,请告诉我。

【讨论】:

  • 非常感谢,这种方法也适用于 100 多个股票代码吗?它已经运行了几分钟,但没有给出任何反馈?
  • 它有效,但可能需要一些时间。拥有 100 多个代码时,xts 和 tibble 格式之间有很多转换,这需要时间。为了加快速度,另一种方式可能涉及未来的并行处理包、带有 lapply 的 data.table 或其他重构代码的步骤。
  • 是的,效果很好,但此警告不断弹出:警告消息:1:mutate() 列有问题nested.col。 ℹnested.col = purrr::map(...)。 ℹ type_convert() 只转换“字符”类型的列。 - df 没有“字符”类型的列
  • 这些警告您可以忽略。他们就是这样。有一个与此相关的 github 问题和一个拉取请求。它只需要合并到代码库中并重新发布到 cran。我向包维护者提出了对这个问题的更多认识。
  • 应该可以正常工作。我看到的唯一一件事是,由于记录量少,当您使用 ema.t = 200 时您只能获得 1 个值。但试试stock_data &lt;- stock_data %&gt;% group_by(symbol) %&gt;% tq_mutate(select = adjusted, mutate_fun = SMA, n = ema.t, col_rename = "sma200")。 col_rename 选项可确保您没有覆盖现有列。
猜你喜欢
  • 2017-05-06
  • 2017-05-11
  • 2019-12-20
  • 1970-01-01
  • 1970-01-01
  • 2021-09-04
  • 2014-08-22
  • 2022-01-09
相关资源
最近更新 更多