SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 3406|回复: 14
打印 上一主题 下一主题

望高手指教

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2008-3-11 16:44:34 | 只看该作者

望高手指教

是关于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
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2008-3-11 22:15:44 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2008-3-12 15:04:39 | 只看该作者

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 -->
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2008-3-14 13:16:32 | 只看该作者

望高手指教

关于大型数据处理,如果现在是一个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, 几百家公司应该怎样处理呢?
望高手赐教,谢谢了。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2008-3-14 19:57:01 | 只看该作者

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]

方法二:
若方法一跑不出来结果,则需要考虑拆表。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2008-3-15 14:54:06 | 只看该作者

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
望高手赐教, 在此感谢!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2008-3-15 17:25:11 | 只看该作者

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;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2008-3-15 21:22:11 | 只看该作者

Re: 望高手指教

这个仅仅是做模拟数据而已,因为手头没有数据,所以根据你一开始说的情况,我自己模拟了一个dataset a。
而且后面程序与是否360天无关,你说的那些交易日的情况该程序还是适用。现在我想让把你的需求说得清楚点具体点
把你具体情况描述清楚。比如:具体数据源情况,数据处理要求,还有你要最后做什么东西,详细、准确。还有清尽量用中文
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2008-3-16 00:19:08 | 只看该作者

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,如果有任何指教可以直接邮件给我,真的非常感谢你的帮助。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2008-3-16 00:24:37 | 只看该作者

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;
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-3-3 18:22 , Processed in 0.174755 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表