下午!我刚刚开始使用R并学习数据框架,软件包等...在这里阅读了很多消息但是找不到答案。
我有一个我正在使用R访问的表,其中包含以下字段: [符号],[日期],[打开],[高],[低],[关闭],[音量]
而且,我正按近价计算SMA:
sqlQuery <- "Select * from [dbo].[Stock_Data]"
conn <- odbcDriverConnect(connectionString)
dfSMA <- sqlQuery(conn, sqlQuery)
sma20 <- SMA(dfSMA$Close, n = 20)
dfSMA["SMA20"] <- sma20
当我查看输出时,它似乎在计算SMA而不考虑符号是什么。我没有尝试复制计算,但我怀疑它只是通过20个移动行来完成,无论日期/符号如何。
如何将计算限制为给定符号? 感谢任何帮助 - 只需要指向正确的方向。
由于
答案 0 :(得分:0)
如果您提供可重复的示例,则更有可能获得答案。首先,让我们复制您的数据:
library(quantmod)
symbols <- c("GS", "MS")
getSymbols(symbols)
# Create example data:
dGS <- data.frame("Symbol" = "GS", "Date" = index(GS), coredata(OHLCV(GS)))
names(dGS) <- str_replace(names(dGS), "GS\\.", "")
dMS <- data.frame("Symbol" = "MS", "Date" = index(MS), coredata(OHLCV(MS)))
names(dMS) <- str_replace(names(dMS), "MS\\.", "")
dfSMA <- rbind(dGS, dMS)
> head(dfSMA)
Symbol Date Open High Low Close Volume Adjusted
1 GS 2007-01-03 200.60 203.32 197.82 200.72 6494900 178.6391
2 GS 2007-01-04 200.22 200.67 198.07 198.85 6460200 176.9748
3 GS 2007-01-05 198.43 200.00 197.90 199.05 5892900 177.1528
4 GS 2007-01-08 199.05 203.95 198.10 203.73 7851000 181.3180
5 GS 2007-01-09 203.54 204.90 202.00 204.08 7147100 181.6295
6 GS 2007-01-10 203.40 208.44 201.50 208.11 8025700 185.2161
您要做的是对长数据对象进行子集化,然后单独应用每个符号的技术指标。这是一种引导您实现理想结果的方法。
您可以使用list
执行此操作,并在每个符号的xts
数据对象上构建指标,而不是像您在示例中那样在data.frame
上构建指标(您可以应用TTR的功能是data.frame中的列,但它很丑陋 - 使用xts对象更加理想。这是您如何做到这一点的模板。最终输出l.data
应该是直观的。将每个符号保存在单独的“容器”(列表元素)中,而不是将一个data.frame
中的所有符号组合起来,这是不容易使用的。
make_xts_from_long_df <- function(x) {
# Subset the symbol you desire
res <- dfSMA[dfSMA$Symbol == x, ]
#Create xts, then allow easy merge of technical indicators
x_res <- xts(OHLCV(res), order.by = res$Date)
merge(x_res, SMA(Cl(x_res), n = 20))
}
l.data <- setNames(lapply(symbols, make_xts_from_long_df), symbols)