merge 1:1 stkcd date using E:\\Lessons\\Stata11\\数据\\Lesson2\\txt\\allincome
现在是全部匹配的状态。
merge之后如果再重复merge的话会出现错误,提示你
所以一般在merge命令之后直接再紧跟一个命令:drop _merge 即将之前的_merge删除。
保证已写命令全部再次执行时不会出错。
6. 以后在写gen date之前先写capture drop date 其作用就是如果在gen date之后的命令有错误,需要全部重新执行时,因为已经生成了date,所以再次执行的时候会有错误,即提示你date已经存在了,所以如果加一条命令:capture drop date,就可以把date删除,然后再生成一个date; 而如果在第一次执行的时候就输入命令: capture drop date gen date
虽然这时候还没有date函数,capture 这一函数就可以保证程序不出错,先把后面的命令执行了,即生成date
2012/5/25
1.输入命令:
dir E:\\Lessons\\Stata11\\数据\\Lesson3\\CSV\\*.CSV
dir是反映文件的信息:大小,日期,时间,巴拉巴拉?
2.输出外部文件的命令
log是日志的意思;text是文本类文件
输入命令:
capture log close (一般都直接写在前面,要是打开过log就关闭,如果没打开也先保证后面程序的运行,不会出错。)
log using E:\\Lessons\\Stata11\\数据\\Lesson3\\log.txt,text replace dir E:\\Lessons\\Stata11\\数据\\Lesson3\\CSV\\*.CSV
log close
把之前输入到stata里面的文件的信息全部保存输出到E:\\Lessons\\Stata11\\数据\\Lesson3 是以log.txt为格式和名字的。
,text replace是防止重复执行的时候出错。
3.因为stata是默认以回车表示一条命令结束,到下一命令,回车的代号是:cr 所以为了读入多个文件,不能横着写,只能竖着写,但是这是一个命令整体,因此要告诉stata,现在的回车不是结束命令,把结束命令换一个符号,换成分号,即 输入命令: # delimit ;
4.输入命令:
local j=1就是把1赋值给j
local就是生成局部宏的语法,即:local 宏名 =宏的取值
将CSV文件全部读入,保存 输入命令:
local j=`j'+1就是将这些CSV文件全部保存成以1,2,3...为文件名的dta文件。 记得每个命令之后要加“;”因为现在是以;表示命令结束的
最后再输入命令#delimit cr,将命令结束语再换成回车。
如果输入命令:
Local J=`j’-1(执行完最后一次local命令之后,j=2026,这样J表示的就是之前保存的dta文件总数)
6. 将前面生成的2025个dta文件合并
用新的for循环:即forvalues i=1/2025{}(即i是从第1个一直取值到第2025个) 输入命令:
先把第2025个dta打开,然后把1到2024个dta与他合并
现在用`i'来代表这些dta文件;且局部宏前面全部都是两个斜线 基本语法与foreach相同,append后面记得加force
2012/5/28
1. 计算收益率rit
Dretnd [不考虑现金红利的日个股回报率] Dsmvosd [日个股流通市值]
先把之前做的全三年交易数据打开
_n是一个向量,取值是1到最后一个,命令本事就是一个循环,n是循环变量 _N是有几个观测值大N就是几。
2.输入命令:
capture drop date
gen date=date(trddt,\
sort stkcd date
format date üY_N_D
先将日期转化成数值型数据,然后用sort命令按照股票代码和日期排序,把原来的数据变成顺序型的,并改变日期显示格式。
可以把trddt删掉,再把date命名成trddt 输入命令: drop trddt
rename date trddt
输入命令:
将数据按股票代码分组,
sort stkcd
by stkcd :gen rit =clsprc[_n]/clsprc[_n-1]-1 by stkcd就是以股票为分组依据。
命令就是代表:生成一个股票收益率函数,这个函数等于本期收盘价减去前一天收盘价,除以前一天收盘价,这个比值减去1就是这只股票的收益率。开始的时候小n等于1,一直执行到最后一个等于236930,这个命令本身就是一个循环,可以从开始执行到最后一只股票。
执行之后第一条是一个“.”点,代表缺失值,因为第一条之前没有前一天的收盘价。 每一只股票的第一条都是缺失的。
bro dretnd rit 只看这两个变量,两者是相似的,代表计算出的收益率和公司给的原收益率是一样的。但是在这样比较之前一定要先把数据按日期排序,不然就是错误的。
2. 计算股票的日算术平均收益率
先算算术平均值,mean()函数就是计算平均值的函数 by date ,sort:egen rmt=mean(rit)
gen后面一般不跟函数,跟的是表达式;如果后面跟的是函数,则用egen 按日期分组,sort:是直接把日期以升序排列。
每只股票的算术平均收益率等于所有股票在某一天的收益率加总除以股票总数。 命令含义:计算所有股票每一天的平均收益率。
股票每一天的平均值都是一样的
3. 计算股票日加权平均收益率 Dsmvosd [日个股流通市值]
先计算这一天所有股票的市值总和. 输入命令:
by date ,sort:egen t_dsmvosd=total(dsmvosd) t_dsmvosd是变量名,随机取得名字。
加逗号是为了分组之前同时sort,把日期以升序排列,如果不这样写的话可以先写sort再换一行写by date。
输入命令:
by date ,sort:gen temp=sum(dsmvosd)
与之前的命令不同的是,total是每一个后面对应的是相同的值,等于从1加到最后一个值的总和;而sum是累加计算,加到最后一个值的时候才和total算出来的是一样的,用的是gen,而不是egen。
计算每只股票当天对应的权重: gen w= dsmvosd/ t_dsmvosd
计算股票加权收益率就是每只股票的收益率乘以他的权重 gen w_rit=w*rit
再计算市场回报率,即把计算的每只股票的加权收益率全部加总起来,是以日期来分组的,也就是把所有股票每天的值加总。
by date,sort:egen rmt1= total(w_rit)
输入命令:
keep if year(date)>2004&year(date)<2008
keep if markettype==1|markettype==4 (“|”这个符号是或的意思,即市场类型是1或者4,而“&”的意思是与,年份时间既要大于2004又要小于2008年)
keep命令是保留一部分变量,即把数据保留在2005年到2008年,并且把市场类型控制在1和4,即1=上海A 4=深圳A
这句命令要放在生成日期型数值型数据之后,因为keep if year 后面只能跟数值型数据。
drop与keep差不多,一个是保留一部分变量,一个是删除一部分变量,后面跟的命令就是这些要保留或者要删除的变量的范围或者满足条件。
4.周回报率
week()= 第几周 dow()=星期几 day()=第几天
因为stata语言里没有累乘只有累加 (1+r1)(1+r2)(1+r3)?(1+r5)-1
如果把数据用ln函数表示,就可以把连乘的问题转换成连加。
输入命令:
gen week=week(date)
创建一个week函数,把每一天都表示成一年里的第几周。 tab就是把变量的取值在stata里面列表出来。 tab week就是把总共的52周列表出来。
因为每一周的周一和周五的股价波动很大,所以算周收益率的时候把天数换成从第一周的礼拜三到第二周的礼拜二为一个礼拜,这样算出来的收益率更有代表性。
输入命令:
gen year=year(date) gen lnrit=ln(1+rit)
replace week=week-1 if dow(date)<3