楼主: tagv
2106 13

再出个 动态选择的难题? [推广有奖]

  • 0关注
  • 0粉丝

高中生

90%

还不是VIP/贵宾

-

威望
0
论坛币
6 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
200 点
帖子
39
精华
0
在线时间
33 小时
注册时间
2008-3-19
最后登录
2009-8-28

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
我在挑选异常价格时,需要:当前纪录的价格要不大于前一个价格的150% 或小于 50% 。看似要求很简单   但是,如下面的序列:

51.5
52
51.5
150
80
51.5
52
51.5



在挑选的时候,如果仅用:
if
price < k*0.5 or price > k*1.5 then delete;

则会 把150 和51.5删掉 而没有删掉明显偏高的80这个交易。


我的替代办法是和报价(bid ask price)比较,以便绕过这个问题,但有没有直接利用这个序列的好办法?

二维码

扫码加我 拉你入群

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

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

关键词:delete Price Rice Then ice 选择 难题 动态

回帖推荐

david0 发表于6楼  查看完整内容

贴的时候漏了一个封号";" data good; retain k 50; input price; ...

本帖被以下文库推荐

沙发
坐看云起时 在职认证  发表于 2009-8-27 10:28:00 |只看作者 |坛友微信交流群
不太明白,80/150=0.533>0.5且<1.5,符合你的设定要求,机器干吗要删掉这条记录呢?

price    变化率
  .        .
52.0    100.971
51.5     99.038
   .     291.262
80.0     53.333
51.5     64.375
52.0    100.971
51.5     99.038

使用道具

藤椅
tagv 发表于 2009-8-27 11:03:03 |只看作者 |坛友微信交流群
程序的真正算法是希望删掉 异常的(例如纪录错误),或尖峰的尤其是序列相关的尖峰的交易价格。

这个例子,正常的价格应该在50左右,而过高或过低的交易价都被认为被操纵,不含有真正的需要的信息。需要把他们剔除。这个例子当中,显然 80 相对50就太高了。如果删掉150,同理似乎也应该删掉80这个数据(相对51.5)。但sas无法再无限参考以前的价格。


这个无限的参考是这个程序的强壮性。

像你所说,一旦sas发现 80/150=0.533>0.5且<1.5 就会保留着条记录。而我希望删掉。我目前是拿这个数据和bid ask 做比,解决纪录错误。但无法解决滤波的问题,(谁有软件滤波器啊)。

使用道具

板凳
坐看云起时 在职认证  发表于 2009-8-27 11:26:15 |只看作者 |坛友微信交流群
那你可以取前后差在某个范围或前后两个价格的均值在某个范围

使用道具

报纸
david0 发表于 2009-8-27 12:11:57 |只看作者 |坛友微信交流群
data good;                                                                                                                                 
retain k 50;                                                                                                                           
input price;                                                                                                                           
if price < k*0.5 or price > k*1.5 then delete;                                                                                          
else do;                                                                                                                                
        output;                                                                                                                        
        k=price;                                                                                                                        
end;                                                                                                                                    
datalines;                                                                                                                              
51.5                                                                                                                                    
52                                                                                                                                      
51.5                                                                                                                                    
150                                                                                                                                    
80                                                                                                                                      
51.5                                                                                                                                    
52                                                                                                                                      
51.5                                                                                                                                    
run;           
结果:
Obs      k     price

1     50.0     51.5
2     51.5     52.0
3     52.0     51.5
4     51.5     51.5
5     51.5     52.0
6     52.0     51.5

使用道具

地板
david0 发表于 2009-8-27 12:16:46 |只看作者 |坛友微信交流群
贴的时候漏了一个封号";"
data good;                                                                                                                                 
retain k 50;                                                                                                                           
input price;                                                                                                                           
if price < k*0.5 or price > k*1.5 then delete;                                                                                          
else do;                                                                                                                                
        output;                                                                                                                        
        k=price;                                                                                                                        
end;                                                                                                                                    
datalines;                                                                                                                              
51.5                                                                                                                                    
52                                                                                                                                      
51.5                                                                                                                                    
150                                                                                                                                    
80                                                                                                                                      
51.5                                                                                                                                    
52                                                                                                                                      
51.5   
;                                                                                                                                
run;
已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子

总评分: 经验 + 3  论坛币 + 3   查看全部评分

使用道具

7
tagv 发表于 2009-8-27 12:36:37 |只看作者 |坛友微信交流群
佩服!

真凝练的算法!

现在没有论坛币,冲好一定补上。

使用道具

8
tagv 发表于 2009-8-27 12:37:53 |只看作者 |坛友微信交流群
沮丧之情油然而生!

使用道具

9
sushe1527 发表于 2009-8-27 12:40:59 |只看作者 |坛友微信交流群
tagv 发表于 2009-8-27 12:37
沮丧之情油然而生!
我刚发的一个问题也被david拿下了 加油吧 man

其实这个思路是这样的 既然正常的价格在50左右,那么150% 或者 50%的意思 最少差距25
50和80差出30  那标准就取25好了
data good;                                                                                                                                 
input price;
k1=dif(price);
k2=sum(price,-50);
if k1<25 and k2<25 then output;
format price 8.1;
drop k1 k2;
cards;                                                                                                                              
51.5                                                                                                                                    
52                                                                                                                                      
51.5                                                                                                                                    
150                                                                                                                                    
80                                                                                                                                      
51.5                                                                                                                                    
52                                                                                                                                      
51.5                                                                                                                                    
run;

使用道具

10
tagv 发表于 2009-8-27 13:55:04 |只看作者 |坛友微信交流群
david0是对的。 我的那个50只是一支股票 一个时间点的价格。换只股票,价格就变了。所以davido的程序,我只要改为:

data trade_new_1 ;

set sample.trade_timeadjust;


if _n_ =1 then k= price;
retain k;

if    price < k*0.5 or price > k*1.5 then delete;
else do;
output;
k = price;
end;
run;


就是通用的了。再次感谢。

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-28 19:16