• R语言
  • 请问如何用quandmod获取多个股票的数据?

quandmod的getsymbol一次只能获取一只股票的数据,比如:

> setSymbolLookup(pinan=list(name='000001.SZ',src='yahoo'))
> getSymbols("pinan",from="1996-01-01")
[1] "PINAN"




现在我想要获取多只股票的数据,我的想法是把上面的过程写成一个函数,然后用反复调用这个函数,但是我的这个函数就是写不出来,请高手指教。

尝试1:

> mystock = function(se.name,se.code){
+   setSymbolLookup(se.name = list(name=se.code,src='yahoo'))
+   getSymbols(se.name,from="1996-01-01")
+ }
> mystock(SZ000001,000001.SZ)
Error: unexpected symbol in "mystock(SZ000001,000001.SZ"



尝试2:

> mystock(SZ000001,'000001.SZ')
 Show Traceback
 
 Rerun with Debug
 Error in force(Symbols) : object 'SZ000001' not found 



尝试3:

> mystock2 = function(se.name,se.code){
+   setSymbolLookup(se.name = list(name=se.code,src='yahoo'))
+   getSymbols(as.character(se.name),from="1996-01-01")
+ }
> mystock2(SZ000001,'000001.SZ')
 Show Traceback
 
 Rerun with Debug
 Error in force(Symbols) : object 'SZ000001' not found 
我对quandmod包不是很了解,如下是一种粗暴的做法
mystock <- function(se.name,se.code){
  eval(parse(text = sprintf("setSymbolLookup(%s = list(name = '%s', src='yahoo'))", se.name, se.code)))
  getSymbols(se.name,from="2006-01-01")
}
mystock("SZ000001","000001.SZ")
[未知用户]

运行结果不对,不知道为什么.

> mystock = function(se.name,se.code){
+   eval(parse(text = sprintf("setSymbolLookup(%s = list(name = '%s', src='yahoo'))", se.name, se.code)))
+   getSymbols(se.name,from="2006-01-01")
+ }
> mystock("SZ000001","000001.SZ")
[1] "SZ000001"
> ls(globalenv())
[1] "mystock"


这里其实没有得到数据,只是得到了一个函数mystcok而已.

得到数据的结果应该是这样的:

> setSymbolLookup(pinan=list(name='000001.SZ',src='yahoo'))
> getSymbols("pinan",from="1996-01-01")
[1] "PINAN"
> ls(globalenv())
[1] "mystock" "PINAN"  


这里有PINAN这个对象存在,而在上面的结果中,不存在对象SZ000001.
我似乎明白是什么原因了.

getSymbols函数会把读取的数据自动命名保存下来.

而我写的mystock函数,只是把数据读取了一遍,但是并没有保存,命名这个动作.

因为getSymbols会自动做保存,命名的事情,让我误以为调用它写的函数也会继承这个功能.
[未知用户]

我已经把mystock函数改到可以返回值了,但是在我想对多个股票代码获取数据的时候,又出现问题了,请指教改如何解决。

新的函数mystock2如下:

mystock2 = function(se.name,se.code){
  eval(parse(text = sprintf("setSymbolLookup(%s = list(name = '%s', src='yahoo'))", se.name, se.code)))
  assign(se.name, 
          get(getSymbols(Symbols = se.name,from="2015-10-07")),
          envir= globalenv())
}


用它来对一只股票进行测试如下:


> mystock2("sz000002","000002.SZ")
> sz000002
           000002.SZ.Open 000002.SZ.High 000002.SZ.Low 000002.SZ.Close
2015-10-07          12.73          12.73         12.73           12.73
2015-10-08          13.25          13.32         13.03           13.07
2015-10-09          13.13          13.28         13.07           13.23
2015-10-12          13.23          13.64         13.21           13.48
2015-10-13          13.41          13.56         13.35           13.47
2015-10-14          13.32          13.47         13.25           13.28
2015-10-15          13.30          13.56         13.28           13.52
2015-10-16          13.53          13.75         13.52           13.65
2015-10-19          13.70          13.70         13.40           13.53
2015-10-20          13.43          13.65         13.42           13.55
2015-10-21          13.55          13.61         13.20           13.23
2015-10-22          13.23          13.40         13.17           13.35
2015-10-23          13.36          13.80         13.31           13.74
           000002.SZ.Volume 000002.SZ.Adjusted
2015-10-07                0              12.73
2015-10-08         82086200              13.07
2015-10-09         63450500              13.23
2015-10-12         78417100              13.48
2015-10-13         56889300              13.47
2015-10-14         54490400              13.28
2015-10-15         43805300              13.52
2015-10-16         50645200              13.65
2015-10-19         57448700              13.53
2015-10-20         40724600              13.55
2015-10-21         55800500              13.23
2015-10-22         45233400              13.35
2015-10-23         67564500              13.74



现在我打算对codelist数据集里的所有股票代码使用mystock2函数,每只股票的数据一起保存在一个列表中,这里用plyr包中的mlply函数。

codelist的结构和内容如下:

> str(codelist)
'data.frame':	6 obs. of  2 variables:
 $ sename   : chr  "sz000001" "sz000002" "sz000004" "sz000005" ...
 $ stockcode: chr  "000001.SZ" "000002.SZ" "000004.SZ" "000005.SZ" ...
> codelist
    sename stockcode
1 sz000001 000001.SZ
2 sz000002 000002.SZ
3 sz000004 000004.SZ
4 sz000005 000005.SZ
5 sz000006 000006.SZ
6 sz000007 000007.SZ

mlply获取每只股票的数据,代码如下:

> mlply(codelist,mystock2)
Error in (function (se.name, se.code)  : 
  unused arguments (sename = "sz000001", stockcode = "000001.SZ")



这里说出现了unused arguments,请问这是怎么回事?该怎么解决?
完全没必要这么麻烦的。你有股票名字和代码的对应的data.frame,那么直接写个循环
假如data.frame为df,第一列为股票实际的名字,例如"PINAN".第二列为真实的yahoo代码

for(i in 1:dim(df)[1]){
   assign(df[ i,][1],getSymbols(Symbols=df[ i,][2],src="yahoo",auto.assign=FALSE),from="1800-01-01",to=Sys.Date())
}

就可以了,你这里需要将auto.assign设置为FALSE
起始时间最好设置到很早,这样可以将所有的数据全部抓取下来
[未知用户]
你再仔细看看我的代码,之前由于论坛渲染问题,少显示了一个中括号,所以会报错