诸 君安。当我们在处理股票交易数据时,经常会遇到这样的情况,由于存在周末和假期这些非交易日,所以股票交易数据会出现间隔。对于存在间隔的股票交易数据, 如果我们使用正常的日期时间格式可能会导致错误的分析。在这种情况下,我们不应该将股票交易数据中的间隔看做缺失值,而是应该调整我们的计算方式,一个很 方便的方法就是使用business calendar.今天小编就带大家了解business calendar。
我们可以通过cntrade 命令调用浦发银行的历史市场报价(关于cntrade的具体使用,请参看往期推文天路——chinafin与cntrade命令,有小惊喜哦),具体命令如下:
cntrade 600000
为了观察的方便我们仅保留stkcd、volume、date,命令为:
keep stkcd volume date
同时,为了便于观察和后续处理,我们还通过gen函数按照date生成mydate和mydate1,我们将mydate的数据显示格式变成%td格式,mydate1则直接以stata 数值型日期的形式保存。
gen mydate = date
format %td mydate
gen mydate1 = date
list date mydate mydate1
以上操作结果如图:
接下来我们需要对mydate使用tsset命令并且显示volume变量及其滞后一期的数据,具体命令如下:
tsset mydate
list date mydate mydate1 volume L.volume
可以发现L.volume的第一个观察值缺失这是因为在volume中没有观察值要先于第一个观察值,但是L.volume第4个,第9个等等也出现缺失值,我们可以用dow函数,这个函数可以计算出Stata 数值型日期所处的星期数,具体命令如下:
di dow(14560)
di dow(14563)
di dow(14567)
di dow(14570)
可以发现之所以出现缺失值是因为stata在遇到周末非交易日时将其作为缺失值而并不是忽略他。
为了避免股票交易数据中出现间隔所带来的问题,我们可以创建business calendar。business calendar需指明哪些日期被忽略。
我们可以通过创建.stbcal文件来定义business calendar,每一个stbcal-file要求指明以下四个内容:
1.所使用的stata的版本
2.calendar的范围
3.calendar的中心日期
4.被忽略的数据
我们创造一个stbcal-file,忽略每个月的周六和周日,编写do文件如下:
version 13.1
dateformat dmy
range 10nov1999 28oct2016
centerdate 10nov1999
omit dayofweek (Sa Su)
第 一行指明使用的stata为13.1版,第二行为可选项指明了显示数据的格式,第三行指明了数据范围,第四行指明了数据中心,这里的中心并不意味着要选择 事实上的样本中心,可以选择在范围中的任何一个数据,在这里选择了样本的第一个数据,第五行指明了我们忽略每个月的周末。
将do-file保存为stkcd.stbcal,接下来我们就可以将regular date转化为business date,首先要将calendar导入stata中,命令如下:
bcal load stkcd
在这里要隆重介绍一个函数bofd( ),用他可以创造business date,bofd( )函数的使用方法如下:
我们需要在bofd函数中指明business calendar的名称和包含有regular date变量的名称,之后我们可以用assert命令来检验是否所有在mydate中的数据都出现在了business calendar中,以上操作具体命令如下:
generate bcaldate = bofd("stkcd",mydate)
assert !missing(bcaldate) if !missing(mydate)
list date mydate mydate1 bcaldate
我们也可以利用bofd函数返回范围内的日期,查看mydate中没有出现的周末日期的结果是否为缺失值。
可以编辑do-file:
forvalues i = 14558/14600{
di `"`i':`=bofd("stkcd",`i')'"'
}
运行结果如下:
可以发现周末的显示值都表现为缺失值。
Business date有一个特定的显示格式,%tbcalname,在本例中为%tbstkcd,我们可以将bcaldate转化为该显示格式,并显示出来,具体命令如下:
format %tbstkcd bcaldate
list in 1/5
尽管mydate和bcaldate看起来是一样的,但是在编码上却是不同的,现在我们对bcaldate使用tsset命令,并且显示bcaldate volume L.volume,具体命令如下:
tsset bcaldate
list bcaldate volume L.volume
可以发现,由于我们的business calendar已经将周末排除了,当在计算L.volume时,bcaldate自动跳过了周末。
今天的分享到这儿就结束了,但是business calendar内容还远远没有结束哦,欲知后事如何,请听下回分解,business calendar(二)与你不见不散哦!
另外,祝大家周末愉快~
编辑by强宇曦
往期推文推荐:
8.爬虫俱乐部周末送大礼——chinagcode提取中文地址经纬度
12.I have a Stata, I have a python
此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。
长按二维码关注你懂哟~
微信扫一扫
关注该公众号