楼主: Davidcharge
3105 7

[问答] 求指点如何实现这个求median的算法 [推广有奖]

  • 0关注
  • 2粉丝

硕士生

79%

还不是VIP/贵宾

-

威望
0
论坛币
103 个
通用积分
1.6658
学术水平
12 点
热心指数
14 点
信用等级
7 点
经验
3781 点
帖子
166
精华
0
在线时间
215 小时
注册时间
2010-11-6
最后登录
2018-10-16

楼主
Davidcharge 发表于 2014-7-21 21:35:46 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
我有800万个债券的交易观测(每笔交易一个观测),每支债券不一定每天都有交易,也不一定每天只交易一笔。
现在需要为每个观测求得这样一个变量:
对第t日的某一债券的一笔交易,计算以第t日为中心前后共9日内,该债券所有交易的price的median;
如果该观测已经是处于该债券最早/最晚的4个交易日,则该median=.

因为交易日不连续,proc expand貌似用不了。想死我了,
请不吝赐教!
————————————————————————————————————————————————
谢谢回复,我给一个具体的子样本为例,只包括三只债券的部分数据:
(data is sorted by bond_ID and date)

bond_ID             date           price
000305AB8     10/03/05        74
000305AB8     10/03/05        75
000305AB8     10/05/05        73
000305AB8     10/06/05        73.5
000305AB8     11/02/05        72.5
....
000305AB8     09/22/10        98.5
000336AE7     11/04/04        106
000336AE7     11/08/04        107.25
...
000336AE7     08/30/07        100.30000305
000361AC9     02/17/05        102.5
...

现在想对每一个观测,计算以date为中心的9个交易日内,所有该债券发生的交易价格的中位数。


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:median Media 如何实现 Med Dia median 交易日 price 如何 中心

沙发
920240553 发表于 2014-7-22 11:10:44
请附上相关数据以了解你的数据结构。

藤椅
lifemg 发表于 2014-7-22 17:39:14
好抽象。。可以附上部分数据解释

板凳
Davidcharge 发表于 2014-7-22 19:08:47
谢谢回复,我给一个具体的子样本为例,只包括三只债券的部分数据:
(data is sorted by bond_ID and date)

bond_ID             date           price
000305AB8     10/03/05        74
000305AB8     10/03/05        75
000305AB8     10/05/05        73
000305AB8     10/06/05        73.5
000305AB8     11/02/05        72.5
....
000305AB8     09/22/10        98.5
000336AE7     11/04/04        106
000336AE7     11/08/04        107.25000336AE7     04/05/05        103.5

...
000336AE7     08/30/07        100.30000305
000361AC9     02/17/05        102.5
...

现在想对每一个观测,计算以date为中心的9个交易日内,所有该债券发生的交易价格的中位数。

报纸
Davidcharge 发表于 2014-7-22 21:50:36
lifemg 发表于 2014-7-22 17:39
好抽象。。可以附上部分数据解释
已更新数据

地板
Davidcharge 发表于 2014-7-22 21:51:12
920240553 发表于 2014-7-22 11:10
请附上相关数据以了解你的数据结构。
已附上部分数据。

7
freerunning_sky 在职认证  发表于 2014-7-23 13:19:06
Davidcharge 发表于 2014-7-22 21:51
已附上部分数据。
效率会比较低,不知道能不能跑得动,用data步效率更高,懒得写了
  1. data input;
  2. input bond_id :$15. date price;
  3. informat date mmddyy8.;
  4. format date yymmdd10.;
  5. id=_n_;
  6. cards;
  7. 000305AB8     10/03/05        74
  8. 000305AB8     10/03/05        75
  9. 000305AB8     10/05/05        73
  10. 000305AB8     10/06/05        73.5
  11. 000305AB8     10/07/05        74.5
  12. 000305AB8     10/08/05        75.5
  13. 000305AB8     10/09/05        76.5
  14. 000305AB8     11/02/05        72.5
  15. 000305AB8     09/22/10        98.5
  16. 000336AE7     11/04/04        106
  17. 000336AE7     11/04/04        107
  18. 000336AE7     11/06/04        105
  19. 000336AE7     11/08/04        108
  20. 000336AE7     11/08/04        107.25
  21. 000336AE7     11/10/04        108.25
  22. 000336AE7     11/12/04        109.25
  23. 000336AE7     11/13/04        107.5
  24. 000336AE7     08/30/07        100.30000305
  25. 000361AC9     02/17/05        102.5
  26. ;
  27. quit;

  28. proc sql noprint;
  29.         create table output as
  30.         select a.*,b.price as median,max(b.date) as max_date format yymmdd10.,min(b.date) as min_date format yymmdd10. from input a
  31.         left join input b on a.bond_id=b.bond_id & (a.date-b.date)>=-4 & (a.date-b.date)<=4
  32.         group by a.bond_id
  33.         order by id;
  34. quit;

  35. proc means data=output noprint;
  36.         by id bond_id date price min_date max_date;
  37.         var median;
  38.         output out=output1(drop=_type_ _freq_) median=;
  39. run;

  40. data output1;
  41.         set output1;
  42.         if date<min_date+4 then median=.;else
  43.         if date>max_date-4 then median=.;
  44. run;
复制代码

8
Davidcharge 发表于 2014-7-23 15:50:16
freerunning_sky 发表于 2014-7-23 13:19
效率会比较低,不知道能不能跑得动,用data步效率更高,懒得写了
数据量很大,能麻烦您写下data步的代码吗~
而且sql那部分我不太看得懂,没学过…

另外,要求的是9个交易日的window,跟您直接用calendar date还是有一点区别的。我现在有一个函数networkdays(date1,date2,"tmp1.holidays","holidate")可以返回date1和date2之间的交易日个数,可以用来改进。
太谢谢了!!

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-29 07:46