首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >切片和rollapply函数

切片和rollapply函数
EN

Stack Overflow用户
提问于 2022-02-24 03:45:50
回答 1查看 67关注 0票数 0

我正在编写一个脚本来计算S&P 500的标准差,并希望将滚动标准差与SD的长期平均值进行比较。

我可以使我的密码工作,但似乎有点笨拙。我想问两个问题,让我的代码更容易理解。

  1. 假设我有两个索引。我是否可以使用一行代码来为这两种代码找到年化SD?现在我得用

的代码

代码语言:javascript
复制
GSPC.new <- merge(GSPC.new,rollapply(GSPC.new$GSPC.adj.ret, 252, sd)) 

  1. 很容易分割xts对象。我可以在tibble中做同样的事情吗?

代码语言:javascript
复制
gspc.avg10yr <- mean(na.omit(GSPC.new$GSPC.adj.std.annualised["2011/2022"]))

下面的所有代码都可以直接在RStudio中执行。

代码语言:javascript
复制
library(tidyverse)
library(quantmod)
library(ggplot2)

tickers <- c("^HSI","^GSPC")
getSymbols(Symbols = tickers,
           src = "yahoo",
           index.class = "POSIXct",
           from = "1997-01-01")

GSPC.new <- na.omit(GSPC)
GSPC.new <- merge(GSPC.new, dailyReturn(GSPC.new$GSPC.Adjusted))
colnames(GSPC.new)[7] <- "GSPC.adj.ret"
GSPC.new <- merge(GSPC.new,rollapply(GSPC.new$GSPC.adj.ret, 252, sd)) # how to annualised both tickers in one line
colnames(GSPC.new)[8] <- "GSPC.adj.std"
GSPC.new <- merge(GSPC.new, GSPC.new$GSPC.adj.std*sqrt(252))
colnames(GSPC.new)[9] <- "GSPC.adj.std.annualised"
GSPC.new.tbl <- as_tibble(fortify(GSPC.new))
p.gspc <- ggplot(GSPC.new.tbl, aes(x=Index,y=GSPC.adj.std.annualised))
p.gspc + geom_line()
gspc.avg10yr <- mean(na.omit(GSPC.new$GSPC.adj.std.annualised["2011/2022"])) # is it possible to do in tibble way?
gspc.avg15yr <- mean(na.omit(GSPC.new$GSPC.adj.std.annualised["2006/2022"]))
gspc.avg20yr <- mean(na.omit(GSPC.new$GSPC.adj.std.annualised["2001/2022"]))
gspc.avg25yr <- mean(na.omit(GSPC.new$GSPC.adj.std.annualised["1997/2022"]))
p.gspc + geom_line()+
  geom_hline(yintercept = gspc.avg10yr, color = "red")+
  geom_hline(yintercept = gspc.avg15yr, color = "blue")+
  geom_hline(yintercept = gspc.avg20yr, color = "green")+
  geom_hline(yintercept = gspc.avg25yr, color = "black")
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-25 14:24:40

将滴答数据放在环境中,例如,迭代计算列表( ret.list )中返回的代码标记名,然后将其形成一个xts对象ret。由此计算标准化的年化返回( std_ann )作为xts对象。

要创建该图,请创建一个网格数据框架g,从中数据框架意味着使用列Series、col (colors)和在geom_hline中使用的方法。“自动绘图”将使用“系列”来引用面,而geom_hline将使用“系列”列将每条水平线与适当的面相匹配。

只使用下面列出的包(以及它们所依赖的包)。

代码语言:javascript
复制
library(quantmod)
library(ggplot2)

tickers <- c("^HSI","^GSPC")
yrs <- c(red = 10, green = 15, blue = 20, black = 25)

getSymbols(Symbols = tickers, env = e <- new.env(), from = "1997-01-01")

ret.list <- Map(function(nm) dailyReturn(na.omit(Ad(e[[nm]]))), ls(e))
ret <- setNames(do.call("merge", ret.list), names(ret.list))
std_ann <- rollapplyr(ret, 252, function(x) sqrt(252) * sd(x, na.rm = TRUE))

g <- expand.grid(Series = names(std_ann), col = names(yrs), 
  stringsAsFactors = FALSE)
meansfun <- function(Series, col) {
    st <- as.Date(as.yearqtr(2022-yrs[[col]]-1))
    mean(window(std_ann[, Series], start = st), na.rm = TRUE)
}
Means <- transform(g, means = mapply(meansfun, Series, col))

autoplot(std_ann) +
  geom_hline(aes(yintercept = means), Means, col = Means$col) +
  xlab("")

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71246861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档