这是我计算中国股市beta的函数:
mybeta <- function(company) {
require(quantmod)
setSymbolLookup(CSI300=list(name="000300.ss",src="yahoo"))
getSymbols("CSI300",from="2010-01-01",to="2011-01-01")
setSymbolLookup(SDB=list(name=company,src="yahoo"))
getSymbols("SDB",from="2010-01-01",to="2011-01-01")
csi=as.data.frame(weeklyReturn(CSI300))
sdb=as.data.frame(weeklyReturn(SDB))
cbeta=merge(csi, sdb, by="row.names")
cov(cbeta[2],cbeta[3])/var(cbeta[2])
}
当我输入时:
mybeta("600005.ss")
weekly.returns.y
weekly.returns.x 1.105631
我只想要输出中的1.105631
,而不是&#34; weekly.returns.y&#34;和&#34; weekly.returns.x&#34;。我怎么能这样做?
答案 0 :(得分:3)
很明显英语不是你的第一语言,所以我会耐心等待。
您已经透露了您实际上要做的事情,因此您可以避免前两个问题(one,two),因为它们对解决您的实际问题无用。
以下是您的功能的修改版本,它实现了相同的目标,并且减少了不必要的工作。
mybeta <- function(company) {
if(!require(quantmod))
stop("quantmod must be installed; try install.packages('quantmod')")
setSymbolLookup(CSI300=list(name="000300.ss",src="yahoo"),
SDB=list(name=company,src="yahoo"))
getSymbols(c("CSI300","SDB"),from="2010-01-01",to="2011-01-01")
ret <- merge(weeklyReturn(CSI300),weeklyReturn(SDB))
cbeta <- cov(ret, use="pairwise.complete.obs")
cbeta[1,2]/cbeta[1,1]
}
答案 1 :(得分:2)
使用as.numeric
制作功能的最后一行
as.numeric(cov(cbeta[2],cbeta[3])/var(cbeta[2]))
顺便说一句,没有理由在这里使用data.frame
。 xts
太棒了;拥抱它。
编辑:
除了不需要转换为data.frame
之外,您的函数可能更安全,没有副作用(例如,getSymbols("SDB")
将返回不同的值,具体取决于您传递给{{1}的内容}最后;另外,mybeta
默认情况下会在getSymbols
中分配数据。您可以考虑使用.GlobalEnv
。这是我编辑您的功能的方式:
auto.assign=FALSE