最近笔者在研究新闻事件与股票价格的相关关系。由于股市相对比较特殊,事件对于股价的影响时长更需要使用交易日的数据进行衡量,比如春节期间发生的重大事件,由于闭市其影响必须要在其后的交易日内才生显现,所以获取事件发生时是否处于股市的交易日,并研究事件发生后的若干个交易日内的股价变动情况,才能进行有效相应回测。
笔者首先想到的是先获取上证指数的交易信息,将其中的交易日期单独取出,做为交易日的基线。但是这样的做法不够简单明了,且耗时较长,由于股市的开市规则是周末及法定节假日均不开市,于是笔者考虑使用黑名单策略,构建一个函数来判断当前日期是否是工作日。
代码如下:
IsWorkDay<-function(day)
{
day=as.Date(day)
yuanDan18=seq(as.Date('-12-31'),as.Date('-01-02'),by=1)
yuanDan19=seq(as.Date('-12-30'),as.Date('-01-01'),by=1)
chunjie=seq(as.Date('-02-15'),as.Date('-02-21'),by=1)
qingming=seq(as.Date('-04-05'),as.Date('-04-07'),by=1)
laodong=seq(as.Date('-04-29'),as.Date('-05-01'),by=1)
duanwu=seq(as.Date('-06-16'),as.Date('-06-18'),by=1)
guoQing=seq(as.Date('-10-01'),as.Date('-10-07'),by=1)
zhongQiu=seq(as.Date('-09-22'),as.Date('-09-24'),by=1)
holidays=c(yuanDan18,yuanDan19,chunjie,qingming,laodong,duanwu,guoQing,zhongQiu)
result1=weekdays(day)%in%c("星期六","星期天")
result2=day%in%holidays
result=result1|result2
if(result)
{
return(F)
}
else
{
return(T)
}
}
这种做法最简单粗暴,效率也高。那么判断事件后的若干个交易日是哪天,也很简单代码如下:
NextWorkDay<-function(day,i)
{
day=as.Date(day)
gap=0
dayres=day
while(gap<i)
{
dayres=dayres+1
if(IsWorkDay(dayres))
{
gap=gap+1
}
}
return(dayres)
}
接下来介绍下TusharePro,我们知道Tushare做为老牌的量化社区一直是python的踏实拥护者,但是他们最近也开始拥抱R语言了,并开始提供R语言包,具体见https://tushare.pro/register?reg=229559注册获得token后即可运行以下代码。
install.packages('Tushare')
library(Tushare)
api <- Tushare::pro_api(token = '你的token')
api(api_name = 'stock_basic')
bar <- Tushare::pro_bar(token = '你的token')
#假设中国平安十一发生了发布新产品的事件为例,那么这样操作就可以了
startdateTmp='-10-01'
startdate=format(as.Date(startdateTmp),,"%Y%m%d")
enddate=format(NextWorkDay(startdateTmp',14),"%Y%m%d")
testbar=bar(ts_code = '000001.SZ', adj='qfq',start_date = startdate, end_date = enddate)
这样将testbar中的相关交易行情取出来就可以做回测啦。