SAS中文论坛

标题: 望高手指教 [打印本页]

作者: shiyiming    时间: 2008-3-11 16:44
标题: 望高手指教
是关于event study的, 简单来讲,就是把发生事情日期定义为t那么要研究的事件时间段就是[t-20,t+10]这一段时间我们称之为不正常事件段而与它比较的正常时间段是[t-81,t-21],把对正常时间段每天的交易量取自然对数然后再取平均来表示正常交易量,也就是说这时候算出来的正常交易量是一个常数。用不正常时间段每天的交易量减去刚刚定义的正常交易量也就是那个常数来表示每天的非正常交易。然后就可以把 t之前20天的每天的不正常交易量加起来的到我们要的不正常交易量。
本人中文不太好不知道表达是否清楚,在用英文讲一遍。
Following the standard event methodology, employ the fixed mean model to compute abnormal option trading volume. More specifically, [t-20, t+10] and [t-81, t-21] are defined as event window and estimation window respectively12. Normal trading volume is then computed over the estimation window by taking the average of the natural log of the raw trading volume. Daily abnormal trading volume is computed by subtracting the normal trading volume from the daily trading volume in the event window. Cumulative abnormal trading volume is then computed by cumulating the daily abnormal trading volume over the 20 days leading up to the announcement dates.

希望高手们能够赐教,先谢谢啦。
简单的数据小样如下:
date             volume
20051104        0
20051105        0
20051106        543
20051108        10
20051109        246
20051112        65
20051123        1059
20060601         40
20060608         50
20060702         90
20060703         100
作者: shiyiming    时间: 2008-3-11 22:15
标题: Re: 望高手指教
看了半天没明白你具体意思,现在按我的理解给出代码如下,希望对你有帮助!
[code:2fv5owgi]
data a;
format date yymmdd10.;
do date='01jan2005'd to '01jan2007'd;
        volume=ceil(ranuni(0)*1000);
        output;
end;
run;
%let event_date=2005-10-1;
%let event_date=%sysfunc(inputn(&event_date,yymmdd10.));
data t1 t2;
        set a;
        if date>&event_date then output t2;
        else output t1;
run;

proc sort data=t1;
        by descending date;
run;
data t1;
        set t1;
        if _n_<=80;
run;
data t2;
        set t2;
        if _n_<=10;
run;
data result;
        set t1 t2;
run;
proc sort data=result;
        by date;
run;
data result(drop=sum);
        set result;
        retain sum mean;
        if _n_=1 then sum=0;
        sum+log(volume);
        if _n_=60 then mean=sum/60;
        if _n_>60 then do;
                abVolume=volume-mean;
                output;
        end;
run;

[/code:2fv5owgi]
作者: shiyiming    时间: 2008-3-12 15:04
标题: Re: 望高手指教
Thank you very much, Byes!! This realy helps me a lot.

Sorry that I did not give you a clear illustration about the problem.

多谢啦。 <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->
作者: shiyiming    时间: 2008-3-14 13:16
标题: 望高手指教
关于大型数据处理,如果现在是一个csv.文件(差不多有2G),里面有上千万条纪录,三十多个变量。我们主要用到的变量是 DATE TICKER VOLUME. 如果有几百家公司,每一家公司每一天都有关于交易量的上百条数据。 首先需要对每一家公司每一天的交易量算一个平均值。

然后再对每一家公司进行关于event study的研究 ,求出不正常交易量也就是abvolume 简单来讲,就是把发生事情日期定义为t那么要研究的事件时间段就是[t-20,t+10]这一段时间我们称之为不正常事件段而与它比较的正常时间段是[t-81,t-21],把对正常时间段每天的交易量取自然对数然后再取平均来表示正常交易量,也就是说这时候算出来的正常交易量是一个常数。用不正常时间段每天的交易量减去刚刚定义的正常交易量也就是那个常数来表示每天的非正常交易。然后就可以把 t之前20天的每天的不正常交易量加起来的到我们要的不正常交易量。(这一段计算的程序代码已经由Byes给出,非常感谢!)

我的主要问题是怎样对这么大的数据进行处理, 怎样先求出每一家公司(by ticker)每一天(by date)的交易量(volume)的平均值, 然后是计算求出不正常交易量也就是abvolume ,每一家公司一年差不多有十几天是EVENT DATE, 几百家公司应该怎样处理呢?
望高手赐教,谢谢了。
作者: shiyiming    时间: 2008-3-14 19:57
标题: Re: 望高手指教
回答你的主要问题:
方法一:直接跑如下程序,如果能成功的话,那是最好不过了.
[code:1gfe1bq8]
proc means data=YourData nway noprint;
        class ticker date;
        var volume;
        output out=result(drop=_type_ _freq_) mean(volume)=meanVolume;
run;
[/code:1gfe1bq8]

方法二:
若方法一跑不出来结果,则需要考虑拆表。
作者: shiyiming    时间: 2008-3-15 14:54
标题: Re: 望高手指教
Thank you so much Byes!! 我觉得国内的高手还是非常多的,而且还非常热心,真的很感谢!
我刚刚接触SAS所以请大家多多指教。
接着上面的问题,
1.每一家公司的event date 都是不一样的,几百家公司如果一家一家计算abnormal volume的话会非常的慢,所以想请教对于这个问题程序应该怎样写呢?
2.数据还是需要在进行分类的主要按照call 和put 接着maturity (&lt;=60天和&gt;60)最后moneyness (Stock price/Strike price,  ITM:S/K &gt;1.1, ATM: 0.9&lt;S/K &lt;1.1, OTM: S/K &lt;0.9)
做出来的结果应该是类似这样的
            Call and Put Volume across Moenyness-Maturity Categories
               Days to Expiration &lt;= 60 Days           Days to Expiration &gt; 60 Days
Moenyness               [-81, -21]      [-20, -1]       %Change         [-81, -21]      [-20, -1]       %Change
Call Options
OTM
ATM
ITM
Put Options
OTM
ATM
ITM
望高手赐教, 在此感谢!
作者: shiyiming    时间: 2008-3-15 17:25
标题: Re: 望高手指教
请教:我的数据的时间不是连续的,是交易日期,一年大概有250天,如果用下面这一段代码,会变成360天而且会自动补充没有交易的日子的交易量所以这样算出来的数据是很有问题的,另外volume=ceil(ranuni(0)*1000);这一句的具体意义是什么呢,因为我又试过如果不写的话下面做出来的表里面会没有VOLUME。但是算出平均值后再用下面这一段代码除了上面提到的问题,所有的meanVOLUME的值都会改变。有什么办法可以解决这些问题吗,谢谢啦!
data a;
format date yymmdd10.;
do date='01jan2005'd to '01jan2007'd;
   volume=ceil(ranuni(0)*1000);
   output;
end;
run;
作者: shiyiming    时间: 2008-3-15 21:22
标题: Re: 望高手指教
这个仅仅是做模拟数据而已,因为手头没有数据,所以根据你一开始说的情况,我自己模拟了一个dataset a。
而且后面程序与是否360天无关,你说的那些交易日的情况该程序还是适用。现在我想让把你的需求说得清楚点具体点
把你具体情况描述清楚。比如:具体数据源情况,数据处理要求,还有你要最后做什么东西,详细、准确。还有清尽量用中文
作者: shiyiming    时间: 2008-3-16 00:19
标题: Re: 望高手指教
首先感谢你的回复,其次为我没有把问题讲清楚而向你道歉。下面我重新把我要解决的问题表述一遍。

我的数据是美国期权交易的,整个数据有几百家公司,三十多个变量,比如说交易日期(DATE),到期日(maturity date) ,买卖(CP), 交易量(VOLUME),公司名字( TICKER), 每天期权交易价格(STRICK PRICE), 每天股票交易价格(STOCK PRICE)等等。时间跨度是三年,一年的交易日总共大概有250天左右。每一家公司每一天的交易量纪录可能有很多条,而我们在进行研究的时候每一天只需要一个交易量。所以需要求每一家公司每一天的平均交易量。后面我提到的交易量都是指这个每天的平均交易量,我们用它代替原来volume.

每一家公司都会有发生一些特别的事情的日子(也就是我们说的event date)比如说像合并阿收购什么的,我呢就是想研究在这些事情发生前后交易量有没有什么不正常的变化。所以主要就是算不正常交易量(abvolume).
abvolume的计算方法还是像之前提到的。先对event date  之前的80天的volume 先取自然对数接着取平均,得到一个常数,再用event date 之前的20天和之后10天每天的交易量的自然对数减去这个常数得到的就是不正常交易量(abvolume).之后我们把前面20天的不正常交易量(abvolume)加起来就叫做累计不正常交易量(abvolume).

算出不正常交易量(abvolume)之后再把数据进行分类,主要是按照1.买卖(Call Options 和Put Options) ,2.到期日(maturity date)(&lt;=60天和&gt;60)3.moneyness : ITM:S/K &gt;1.1, ATM: 0.9&lt;S/K &lt;1.1, OTM: S/K &lt;0.9, S/K就是Stock price/Strike price,
分出来得数据形式大概如下:也就是关于这几类期权的平均的累计不正常交易量。这也就是我最后想要的结果。
           Days to Expiration &lt;= 60 Days       Days to Expiration &gt; 60 Days
Moenyness     
Call Options
OTM
ATM
ITM
Put Options
OTM
ATM
ITM

现在我有几百家公司3年的数据,所以对我这个刚刚接触SAS不久的人来说就有很多问题。首先是几百家公司每一家的event date都是不一样的,是不是只能一家一家的去算, 另外几年的数据放在一个表里面计算会不会有问题还是说需要一年一年计算。还有就是我又试了很多次,我在前面提到的问题还是存在,不知道是不是我哪里写错了。
另外如果方便的话我可以发一些数据到你的邮箱,相信看了数据你会更了解我的问题。
我的邮箱是kirstenzhang13@gmail.com,如果有任何指教可以直接邮件给我,真的非常感谢你的帮助。
作者: shiyiming    时间: 2008-3-16 00:24
标题: Re: 望高手指教
根据你给我的代码,我自己在计算时的代码如下,希望可以提供参考,帮我看出问题出在那里,再次表示感谢。
libname out 'D:\DATA\out';
data top20_04_call;
set out.top20_04_call OUT.top20_05_call;
run;
proc means data=top20_04_call nway noprint;
class ticker date;
var volume;

output out=top20_04_call1(drop=_type_ _freq_) mean(volume)=Volume;
run;
data top20_04_call1;
set top20_04_call1;
run;
data top20_04_call1 MSFT_call04_MA;
modify top20_04_call1;
if TICKER=&quot;MSFT&quot;
then do;
output MSFT_call04_MA;
end;
RUN;
DATA MSFT_call04_MA;
SET MSFT_call04_MA;
RUN;
data MSFT_call04_MA;
format date yymmdd10.;
do date='07jan2004'd to '31dec2005'd;
VOLUME=CEIL(RANUNI(0)*10000);
output;
end;
run;

%let event_date=2005-10-18;
%let event_date=%sysfunc(inputn(&amp;event_date,yymmdd10.));
data t1 t2;
set MSFT_call04_MA;
if date&gt;&amp;event_date then output t2;
else output t1;
run;

proc sort data=t1;
by descending date;
run;
data t1;
set t1;
if _n_&lt;=82;
run;
data t2;
set t2;
if _n_&lt;=10;
run;
data result;
set t1 t2;
run;
proc sort data=result;
by date;
run;
data result(drop=sum);
set result;
retain sum mean;
if _n_=1 then sum=0;
sum+log(volume);
if _n_=61 then mean=sum/61;
if _n_&gt;61 then do;
    abVolume=log(volume)-mean;
    output;
end;
run;
proc sort data=result;
by descending date;
run;
data MSFT_call_MA0426;
set result;
retain sum;
if _n_=12 then sum=abvolume;
if _n_&gt;12 then do;
     sum=sum+abvolume;
    output;
end;
run;
作者: shiyiming    时间: 2008-3-16 09:55
标题: Re: 望高手指教
首先帮你该了下代码
[code:1gfs0pw5]
libname out 'D&#58;\DATA\out';
data top20_04_call;
set out&#46;top20_04_call OUT&#46;top20_05_call;
run;
proc means data=top20_04_call nway noprint;
class ticker date;
var volume;
output out=top20_04_call1(drop=_type_ _freq_) mean(volume)=Volume;
run;



data  MSFT_call04_MA;
set top20_04_call1;
if TICKER=&quot;MSFT&quot;;
RUN;



%let event_date=2005-10-18;
%let event_date=%sysfunc(inputn(&amp;event_date,yymmdd10&#46;));
data t1 t2;
set MSFT_call04_MA;
if date&gt;&amp;event_date then output t2;
else output t1;
run;

proc sort data=t1;
by descending date;
run;
data t1;
set t1;
if _n_&lt;=82;
run;
data t2;
set t2;
if _n_&lt;=10;
run;
data result;
set t1 t2;
run;
proc sort data=result;
by date;
run;
data result(drop=sum);
set result;
retain sum mean;
if _n_=1 then sum=0;
sum+log(volume);
if _n_=61 then mean=sum/61;
if _n_&gt;61 then do;
abVolume=log(volume)-mean;
output;
end;
run;
proc sort data=result;
by descending date;
run;
data MSFT_call_MA0426;
set result;
retain sum;
if _n_=12 then sum=abvolume;
if _n_&gt;12 then do;
sum=sum+abvolume;
output;
end;
run;

[/code:1gfs0pw5]


其次你你要的结果可以用proc tabulate +proc format实现你最后要求的结果.还有整个内容你可以写成宏来实现(每家公司,每个event_date做在成表,然后自动调用,或者用宏参数传入).
个人观点,仅共参考.
作者: shiyiming    时间: 2008-3-16 16:10
标题: Re: 望高手指教
我又再次用了下面这段程序计算,
data MSFT_call04_MA;
format date yymmdd10.;
do date='07jan2004'd to '31dec2005'd;
VOLUME=CEIL(RANUNI(0)*10000);
output;
end;
run;
运行后出来的天数会变比如说原来是206个运行后会变成6百多个,而且volume 的值也都会发生变化这样算出来的abnormal还会使正确的吗?请指教谢谢啦1
原始数据MSFT_call04_MA如下
TICKER        DATE(总共有206天)        Volume
AWE        20040102        52.48076923
AWE        20040105        148.4807692
AWE        20040106        150.0576923
AWE        20040107        785
AWE        20040108        181.8653846
AWE        20040109        181.5769231
AWE        20040112        81.44230769
AWE        20040113        739.25
AWE        20040114        2608.019231
AWE        20040115        2011.615385
AWE        20040116        1599.634615
AWE        20040120        1578.823529
AWE        20040121        2035.45098
AWE        20040122        1909.941176
AWE        20040123        2272.529412
AWE        20040126        762.1176471
AWE        20040127        1848.509804
AWE        20040128        2119.245283
AWE        20040129        2239.396226
AWE        20040130        766.2608696
AWE        20040202        646.173913
AWE        20040203        1308.768116
AWE        20040204        1033.246377
AWE        20040205        812.5507246
AWE        20040206        1557.565217
AWE        20040209        741.7971014
AWE        20040210        731.2318841
AWE        20040211        895.7246377
AWE        20040212        5601.536232
AWE        20040213        1613.130435
AWE        20040217        4673.782609
AWE        20040218        2298.217391
AWE        20040219        1416.971014
AWE        20040220        1143.333333
AWE        20040223        1090.811594
AWE        20040224        806.2173913
AWE        20040225        870.9565217
AWE        20040226        538.7246377
AWE        20040227        389.6666667
AWE        20040301        920.0294118
AWE        20040302        358.1176471
AWE        20040303        376.5735294
AWE        20040304        501.9264706
AWE        20040305        432.8382353
AWE        20040308        1045.986486
AWE        20040309        623.0405405
AWE        20040310        188.9459459
AWE        20040311        233.4189189
AWE        20040312        206.2837838
AWE        20040315        77.22972973
AWE        20040316        173.5135135
AWE        20040317        430.8648649
AWE        20040318        298.0675676
AWE        20040319        82.78378378
AWE        20040322        39
AWE        20040323        232.6388889
AWE        20040324        168.0694444
AWE        20040325        272.8333333
AWE        20040326        88.42424242
AWE        20040329        29.29166667
AWE        20040330        290.8194444
AWE        20040331        116.1666667
AWE        20040401        111.8472222
AWE        20040402        159.3055556
AWE        20040405        287.9428571
AWE        20040406        204.0571429
AWE        20040407        61.51428571
AWE        20040408        71.2
AWE        20040412        31.35714286
AWE        20040413        316.3428571
AWE        20040414        115.0571429
AWE        20040415        644.2857143
AWE        20040416        140.6760563
AWE        20040419        138.057971
AWE        20040420        254.7536232
AWE        20040421        248.2028986
AWE        20040422        197.173913
AWE        20040423        529.6714286
AWE        20040426        91.97142857
AWE        20040427        57.42857143
AWE        20040428        292.7714286
AWE        20040429        16.95714286
AWE        20040430        25.08571429
AWE        20040503        26.72857143
AWE        20040504        301.9571429
AWE        20040505        266.0714286
AWE        20040506        115.9714286
AWE        20040507        37.2
AWE        20040510        40.61428571
AWE        20040511        66.67142857
AWE        20040512        18.95714286
AWE        20040513        47.68571429
AWE        20040514        24.44285714
AWE        20040517        423.8428571
AWE        20040518        855.6142857
AWE        20040519        388.0571429
AWE        20040520        113.0571429
AWE        20040521        1183.057143
AWE        20040524        364.3442623
AWE        20040525        127.1311475
AWE        20040526        86.8852459
AWE        20040527        385.0983607
AWE        20040528        85.36065574
AWE        20040601        74.95454545
AWE        20040602        144.3484848
AWE        20040603        45.28787879
AWE        20040604        348.0606061
AWE        20040607        6.333333333
AWE        20040608        198.6212121
AWE        20040609        207.2727273
AWE        20040610        71.36363636
AWE        20040614        43.21212121
AWE        20040615        73.90909091
AWE        20040616        61.01515152
AWE        20040617        31.66666667
AWE        20040618        25.57575758
AWE        20040621        99.16666667
AWE        20040622        11.40909091
AWE        20040623        8.909090909
AWE        20040624        16.84848485
AWE        20040625        22.09090909
AWE        20040628        40.34848485
AWE        20040629        31.68181818
AWE        20040630        648.030303
AWE        20040701        27.6969697
AWE        20040702        211.2878788
AWE        20040706        22.31818182
AWE        20040707        93.96969697
AWE        20040708        65.25757576
AWE        20040709        10.84848485
AWE        20040712        21.5
AWE        20040713        109.2272727
AWE        20040714        206.4545455
AWE        20040715        248.2121212
AWE        20040716        63.57575758
AWE        20040719        85
AWE        20040720        126.4769231
AWE        20040721        55
AWE        20040722        241.7230769
AWE        20040723        42.78461538
AWE        20040726        22.44615385
AWE        20040727        40.98461538
AWE        20040728        16.35384615
AWE        20040729        12.03076923
AWE        20040730        4.215384615
AWE        20040802        17.26153846
AWE        20040803        3.969230769
AWE        20040804        23.36923077
AWE        20040805        40.92307692
AWE        20040806        58.2
AWE        20040809        85.6969697
AWE        20040810        100.4393939
AWE        20040811        12.36363636
AWE        20040812        16.92424242
AWE        20040813        165.5606061
AWE        20040816        124.6212121
AWE        20040817        96.86363636
AWE        20040818        77
AWE        20040819        5.803030303
AWE        20040820        14.21212121
AWE        20040823        37.82089552
AWE        20040824        16.01492537
AWE        20040825        30.49253731
AWE        20040826        10.92537313
AWE        20040827        11.68656716
AWE        20040830        12.47761194
AWE        20040831        132.6716418
AWE        20040901        43.85074627
AWE        20040902        24.53731343
AWE        20040903        42.07462687
AWE        20040907        67.43283582
AWE        20040908        117.4328358
AWE        20040909        17.91044776
AWE        20040910        19.29850746
AWE        20040913        6.955223881
AWE        20040914        8.298507463
AWE        20040915        38.26865672
AWE        20040916        9.134328358
AWE        20040917        27.11940299
AWE        20040920        11.70769231
AWE        20040921        85.75384615
AWE        20040922        85.50769231
AWE        20040923        171.5230769
AWE        20040924        165.8461538
AWE        20040927        58.06153846
AWE        20040928        126.4
AWE        20040929        14.61538462
AWE        20040930        156.5692308
AWE        20041001        61.16923077
AWE        20041004        42
AWE        20041005        38.21538462
AWE        20041006        72.30769231
AWE        20041007        43.16923077
AWE        20041008        23.23076923
AWE        20041011        11.29230769
AWE        20041012        51.01538462
AWE        20041013        11.6
AWE        20041014        329.6461538
AWE        20041015        36.6
AWE        20041018        17.62068966
AWE        20041019        51.74137931
AWE        20041020        1.568965517
AWE        20041021        43.84482759
AWE        20041022        104.637931
AWE        20041025        65.13793103
AWE        20041026        1832.810345
作者: shiyiming    时间: 2008-3-16 16:20
标题: Re: 望高手指教
感谢byes的热心帮助。
在删除了format date 的那段代码后运行SAS的LOG
161 %let event_date=2004-10-18;
162  %let event_date=%sysfunc(inputn(&amp;event_date,yymmdd10.));
163  data t1 t2;
164  set MSFT_call04_MA;
165  if date&gt;&amp;event_date then output t2;
166  else output t1;
167  run;

NOTE: There were 252 observations read from the data set WORK.MSFT_CALL04_MA.
NOTE: The data set WORK.T1 has 0 observations and 3 variables.
NOTE: The data set WORK.T2 has 252 observations and 3 variables.
好像不format date 的话,t1 t2就挑不出来。
不好意思又要麻烦各位了,谢谢。
作者: shiyiming    时间: 2008-3-16 20:29
标题: Re: 望高手指教
[quote=&quot;janezhang&quot;:15nzu26p]我又再次用了下面这段程序计算,
data MSFT_call04_MA;
format date yymmdd10.;
do date='07jan2004'd to '31dec2005'd;
VOLUME=CEIL(RANUNI(0)*10000);
output;
end;
run;[/quote:15nzu26p]
这段程序没用的,你有自己的数据,因为我没有你的数据,所以我模拟的数据,我服了你了.
你自己表格里面有date ,volume为什么还要生成date,volume(上面那段程序).
希望bbs的高手给他点建议把.
作者: shiyiming    时间: 2008-3-17 17:11
标题: Re: 望高手指教
真的为本人的粗心大意和知识浅薄而感到不好意思。

又重新挑过了程序,计算的问题终于解决了。

说了很多次谢谢,但是每一次都是很发自内心的,真的谢谢大家的帮助,尤其是感谢BYES,非常感谢你, 尽管有时候我问的问题很不清楚,有时候又很白痴,你每一次都耐心的给出了答复,谢谢啦。




欢迎光临 SAS中文论坛 (http://www.mysas.net/forum/) Powered by Discuz! X3.2