tushare的团队已经封装了R接口:通过R语言调取tushare数据。
但我在我的R环境中没能安装上,索兴自己照猫画虎写了一个:
query <- function(api_name, token, params = list(), ts_api = "http://api.tushare.pro/"){
post_data <- list(api_name = api_name,
token = token,
params = params)
r <- httr::POST(ts_api, body = post_data, encode = 'json') # post json
content <- httr::content(r, "parsed", "application/json")
with(content, {
if(code == 0) { # retrieve data successfully when code equals 0
with(data, {
# combine 'items' with 'fields' to create a data.frame
dd <- data.table::rbindlist(items) # 返回一个data.table
# data.table与data.frame的一些行为不一致, 故转换回data.frame
dd <- data.frame(dd)
if(length(dd) > 0){
names(dd) <- unlist(fields)
} else { # create an empty data.frame when no items
dd <- data.frame(matrix(ncol = length(fields), nrow = 0))
names(dd) <- fields
}
list(code=code, data=dd)})
} else { # failed to retrieve data
list(code=code, msg=content[['msg']])
}
})
}
以上代码是用httr访问tushare的restful通用接口,获取并组织数据为数据框。接着是简单封装的获取股票基信息的函数:
stock_basic <- function(token=token) {
query(api_name = "stock_basic", token = token)
}
获取日股票日交易数据的函数:
daily <- function(token=token, ts_code=NULL, start_date=NULL, end_date=NULL) {
params <- list(ts_code=ts_code,
start_date=start_date,
end_date=end_date)
query(api_name = "daily",
token = token,
params = params)
}
用例:
token <- 'XXXXXXXX'
# 获取所有股票的日k数据
res1 <- daily(token = token, trade_date = "20190103")
df1 <- res1[['data']]
# 获取一支股票一个时间段的日k数据
res2 <- daily(token = token, ts_code = '600000.SH')
df2 <- res2[['data']]
# 获取股票的基本信息
res3 <- stock_basic(token=token)
df3 <- res3[['data']]
httr用起来非常方便,tushare.pro的接口亦不遑多让,十分感谢tushare的Jimmy老师及团队,为我们提供这么好的数据,这么优雅的接口。
日k数据的数据清理:
clean.daily <- function(dd, omit.na = F) {
# sort by trade_date
dd[['trade_date']] <- as.Date(dd[['trade_date']], "%Y%m%d")
new_order <- order(dd$trade_date, decreasing = FALSE)
dd <- dd[new_order, ]
# set column 'trade_date' as column
row.names(dd) <- dd[['trade_date']]
dd[['trade_date']] <- NULL
dd
}
n日均线的添加:
# 递归添加mas中的各种均线
ma <- function(dd, v, mas) {
if(length(mas) > 0) {
m <- mas[1]
col <- paste("ma", m, sep = "")
dd[[col]] <- TTR::SMA(dd[[v]], m)
# 去除第一个均线参数后,继续递归后边的均线
ma(dd, v, mas[-1])
} else {
dd
}
}