楼主: iittala
3742 16

[急+500论坛币] 请详细解释下列SAS语句的作用 [推广有奖]

  • 0关注
  • 0粉丝

大专生

11%

还不是VIP/贵宾

-

威望
0
论坛币
1845 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
432 点
帖子
30
精华
0
在线时间
23 小时
注册时间
2013-5-16
最后登录
2021-9-12

500论坛币
data temp5;
set temp;
if code='0055' then
  do;
  r1=0.5*r;
  p=&a;         
  end;
if code='0001' then
  do;
  r1=0.3*r;
  p=&a;
  end;
if code='0009' then
  do;
  r1=365*0.05;
  p=&a;
  end;
run;

/*新的一只*/
proc sql;
  connect to oracle as conname  (&risk);  
  create table temp as select * from connection to conname   
(
select bizdate,a.code,a.name,close_price,bizdate2,close_price2,close_price/close_price2-1 as r,
       to_date(bizdate,'yyyy-mm-dd')-to_date(bizdate2,'yyyy-mm-dd') as interval      from
(select bizdate,code,name,close_price

最佳答案

jeozu 查看完整内容

把代码分为三部分,其中为R000001, R000002写的部分都没有insert到数据库,所以,应该不重要,先说最后一部分。 我的vi突然不能输入中文了,所以就容忍一下垃圾英文。说明在最开头。建议拷贝到SAS editor或者其他editor看。 =============================最后部分
关键词:500论坛币 0论坛币 论坛币 connection Interval oracle create
沙发
jeozu 发表于 2014-5-13 23:35:58 |只看作者 |坛友微信交流群
把代码分为三部分,其中为R000001, R000002写的部分都没有insert到数据库,所以,应该不重要,先说最后一部分。
我的vi突然不能输入中文了,所以就容忍一下垃圾英文。说明在最开头。建议拷贝到SAS editor或者其他editor看。
=============================最后部分
  1. /*
  2. * zx_wind_bench.bizdate=TB_OBJECT_1101.f13_1101 in ( 20140311:&date_str)
  3. * baseline = min(20140311, &date_str)
  4. * zx_wind_bench.seccode=TB_OBJECT_1101.f16_1090='000535'
  5. * p='R000003'
  6. * 1. compute the daily average add increase rate for each bizdate at the base level.
  7. *    a. compute the daily average 'add' for seccode '00053' between '20140301' and &date_str from table TB_OBJECT_1101.
  8. *    b. find the baseline daily average add.
  9. *    c. compute the daily average add increase rate for each bizdate at the base level. {rate = daily_avg_add/avg_add_base -1}
  10. * 2. compute bizdate add_nav increase rate at base level. -> add_r
  11. * 3. compute bench increase rate at base level.
  12. *    a. select bench from table zx_wind_bench for seccode '000535' where its date between '20140311' and &date_str
  13. *    b. find the baseline bench to the bench which is corresponding to the first bizdate between the date interval.
  14. *    c. compute the increase rate for each bizdate as the base level.  {rate = daily_bench/bench_base -1 }
  15. * 4. insert those two value into (increase bench/add rate) into table fkdb.pf_all_bench  
  16. *    a. delete corresponding records from table  fkdb.pf_all_bench  
  17. *    b. insert
  18. *
  19. * Entity Definition and Mapping:  FKDB.PF_ALL_BENCH
  20. *        'R000003'                                                                      as p
  21. *      , zx_wind_bench.sec_name                                                         as panamecn  :chinese name corresponding to seccode 000535
  22. *      , zx_wind_bench.bizdate=TB_OBJECT_1101.f13_1101 in ( 20140311:&date_str)         as bizdate
  23. *      , avg(TB_OBJECT_1101.F21_1101)                                       across date as nav
  24. *      , avg(TB_OBJECT_1101.F21_1101)                                       across date as add1
  25. *      , avg(TB_OBJECT_1101.F21_1101).[{bizdate=*}/{bizdate=20140311}] - 1  across date as add_r
  26. *      , zx_wind_bench.bench.(&date_str/20140311)-1                                     as r
  27. */

  28. *****航天  140301 ;
  29. %let date_str = '20140301';
  30. proc sql;
  31.   connect to oracle as conname  (&risk);  
  32.   create table jingzhi as select * from connection to conname   
  33. (
  34. select bizdate
  35.      , avg(add_nav) as add1
  36.   from (
  37.         select f16_1090            as seccode,
  38.                ob_object_name_1090 as sec_name,
  39.                OB_OBJECT_NAME_1018 as com_name,            /* wind 取复权净值*/
  40.                F4_1101             as nav,
  41.                F21_1101            as add_nav,                              
  42.                F13_1101            as bizdate
  43.           from TB_OBJECT_1101
  44.           left join TB_OBJECT_1090 on F14_1101 = F2_1090
  45.           left join TB_OBJECT_1099 on F14_1101 = F1_1099
  46.           left join tb_object_1018 on F12_1099 = F34_1018
  47.          where f13_1101 between  '20140301' and  &date_str
  48.            and f16_1090 in ('00053')   
  49.        )
  50. group by bizdate
  51. order by bizdate
  52. );
  53. disconnect from conname;
  54. quit;

  55. data jingzhi;
  56. set jingzhi;
  57.     if _N_=1 then call symput('a',add1);
  58. run;
  59. data jingzhi;
  60.     set jingzhi;
  61.     add_r=add1/&a-1;
  62.     nav=add1;
  63. run;
  64. data jingzhi;
  65.     set jingzhi;
  66. proc sort;
  67. by bizdate;
  68. run;
  69. proc sql;
  70.   connect to oracle as conname  (&risk);  
  71.   create table pf_all_bench16  as select * from connection to conname   
  72. (
  73.    select bizdate
  74.         , bench
  75.         , sec_name as panamecn  
  76.      from zx_wind_bench  
  77.     where seccode='000535'  
  78.       and bizdate between  '20140311'   and &date_str
  79.     order by bizdate
  80. );
  81. disconnect from conname;
  82. quit;
  83. data pf_all_bench16;
  84.     set pf_all_bench16;
  85.     if _N_=1 then call symput('a',bench);
  86. run;
  87. data pf_all_bench16;
  88.     set pf_all_bench16;
  89.     r=bench/&a-1;
  90.     p='R000003';
  91. run;
  92. proc sort;
  93.     by bizdate;
  94. run;

  95. data pf_all_bench16;
  96.     merge pf_all_bench16 (in=a)  jingzhi(in=b);
  97.     by  bizdate;
  98.     if a and b;
  99. run;

  100. proc sql;
  101.   create table pf_all_bench17  as select * from
  102. (
  103.    select p
  104.         , panamecn
  105.         , bizdate
  106.         , nav
  107.         , add1
  108.         , add_r
  109.         , r
  110.      from pf_all_bench16
  111. );

  112. quit;

  113. proc sql;
  114.   delete from  fkdb.pf_all_bench  where  p='R000003' and bizdate= &date_str;
  115.   insert into  fkdb.pf_all_bench  select * from pf_all_bench17 where bizdate= &date_str;
  116. quit;
复制代码

使用道具

藤椅
jeozu 发表于 2014-5-14 10:25:08 |只看作者 |坛友微信交流群
这段代码写的真不怎么有效率,
看得头疼。

使用道具

板凳
jeozu 发表于 2014-5-14 10:25:52 |只看作者 |坛友微信交流群
我去摘点车厘子,等会儿上传结果。

使用道具

报纸
zhangwenteng 发表于 2014-5-14 10:41:16 |只看作者 |坛友微信交流群
这个就是一个简单的数据操作和数据转换,太简单了,实在写不下去了。。。谁给你接着写吧。
  1. /* Proc SQL start*/
  2. proc sql;
  3.         /*创建数据链接到Oracle并且命名为conname,具体的用户名,密码参数都在risk里面存着。*/
  4.   connect to oracle as conname  (&risk);  

  5.   /*从conname选择所有的数据命名为temp*/
  6.   create table temp as select * from connection to conname   

  7. (
  8. /*选择 某个交易日,交易代码,交易商品名称,当日成交价,交易日@2012-12-03,交易日@2012-12-03成交价,交易价格浮动百分比 并且命名为"r",某个交易日和2012-12-03之间的天数间隔,命名为“interval”*/
  9. select bizdate,a.code,a.name,close_price,bizdate2,close_price2,close_price/close_price2-1 as r, to_date(bizdate,'yyyy-mm-dd')-to_date(bizdate2,'yyyy-mm-dd') as interval

  10. from

  11. /*把下面两个表以某个交易日的数据为主,然后把2012-12-03那天的交易数据以交易代码为关键键对应的水平合并过来。 合成的表座位上面的源表*/


  12. /*交易类型代码为S, 交易代码在以下数字里面,选择某个交易日(&date_str),交易代码,交易商品名称,当日成交价*/
  13. ( select bizdate,code,name,close_price
  14.   from pf_all_quotation
  15.   where typecode = 'S' and code in ('81699', '00030', '39992', '81602', '00001', 'h1100', 'h1100','h1100', 'h1100','00093', 'h1100', 'h1100', '81602', '00090', '00090') and bizdate = &date_str ) a
  16.    
  17. left join

  18. /*交易类型代码为S, 交易代码在以下数字里面,选择2012-12-03交易日,交易代码,交易商品名称,2012-12-03成交价*/
  19. ( select bizdate as bizdate2,code,name,close_price as close_price2
  20.   from pf_all_quotation
  21.   where typecode = 'S'  and code in ('81699', '00030', '39992', '81602', '00001', 'h1100', 'h1100','h1100', 'h1100','00093', 'h1100', 'h1100', '81602', '00090', '00090') and bizdate = 2012123  ) b

  22. /*关键键位是 交易代码*/
  23. on a.code=b.code
  24. );
  25. /*断开到conname的链接*/
  26. disconnect from conname;
  27. quit;





  28. %let a='R000001';   * 成长;

  29. /*生成两个新的列,一个是r1,是新的交个变动率,对两个交易代码81699&81602的变动率做降权(标准化,减低比重。),生成一个列是p作为组,那两个交易代码的p值R000001的字符,他们可以被认为是R000001组的*/
  30. data temp1;
  31.         set temp;

  32. /*如果交易代码是81699,那么新的交易价格变动率是原来的80%, p是R000001*/
  33. if code='81699' then
  34.   do;
  35.   r1=0.8*r;
  36.   p=&a;         
  37.   end;
  38.   /*如果交易代码是81602,那么新的交易价格变动率是原来的20%, p是R000001*/
  39. if code='81602' then
  40.   do;
  41.   r1=0.2*r;
  42.   p=&a;
  43.   end;
  44.   /*其他的股票代码,新的交个变动率是0, p是空值。*/
  45. run;

  46. /*计算组别R000001的新的价格变动率(被降权后的变动率)的和(总值)*/
  47. proc sql;
  48.         create table temp11 as
  49. ( select sum(r1)as r,p
  50.   from temp1
  51.   where p=&a
  52.   group by p
  53. );
  54. quit;


  55. %let i1=0.03;
  56. %let tax=0;
  57. %let i=0.007;
  58. %let i_d=0.065;
  59. %let i7=0.013;

  60. /*生成两个新的列,一个是r1,是新的交个变动率,对两个交易代码00030&00001的变动率做降权(标准化,减低比重。),生成一个列是p作为组,那两个交易代码的p值R000002的字符,他们可以被认为是R000002组的*/
  61. %let a='R000002';    * 同心;
  62. data temp5;
  63. set temp;
  64. /*如果交易代码是00030,那么新的交易价格变动率是原来的65%, p是R000002*/
  65. if code='00030' then
  66.   do;
  67.   r1=0.65*r;
  68.   p=&a;         
  69.   end;
  70. /*如果交易代码是00001,那么新的交易价格变动率是原来的30%, p是R000002*/
  71. if code='00001' then
  72.   do;
  73.   r1=0.3*r;
  74.   p=&a;
  75.   end;
  76. /*如果交易代码是00001,那么新的交易价格变动率是=天数间隔*(1-0)*0.03、365*0.05=天数间隔*0.5475=(str_date-2012-12-03)*0.5475, p是R000002*/
  77. if code='00090' then
  78.   do;
  79.   r1=interval*(1-&tax)*&i1/365*0.05;
  80.   p=&a;
  81.   end;
  82. run;


  83. /*#################################################################################################################*/
  84. /*#                              跟上面的一样只不过是不同的交易代码的集合并且新的开始日期是2012-03-02                      #*/
  85. /*################################################################################################################*/

  86. /*新的一只*/
  87. proc sql;

  88. connect to oracle as conname  (&risk);  

  89. create table temp as select * from connection to conname   
  90. (
  91. select bizdate,a.code,a.name,close_price,bizdate2,close_price2,close_price/close_price2-1 as r, to_date(bizdate,'yyyy-mm-dd')-to_date(bizdate2,'yyyy-mm-dd') as interval      

  92. from

  93. (
  94. select bizdate,code,name,close_price
  95. from pf_all_quotation
  96. where typecode = 'S' and code in ('81699', '00030', '39992', '81602', '00001', 'h1100', 'h1100','h1100', 'h11008','000935', 'h1100', 'h1100', '81602', '00090', '00090')  and bizdate = &date_str ) a
  97.    
  98. left join

  99. (
  100. select bizdate as bizdate2,code,name,close_price as close_price2
  101. from pf_all_quotation
  102. where typecode = 'S' and code in ('81699', '00030', '39992', '81602', '00001', 'h1100', 'h1100','h1100', 'h1100','00093', 'h1100', 'h1100', '81602', '00090', '00090') and bizdate = 2012032  ) b

  103. on a.code=b.code

  104. );
  105. disconnect from conname;
  106. quit;


  107. %let a='R000003';   
  108. data temp9;
  109. set temp;
  110. if code='00093' then
  111.   do;
  112.   r1=0.8*r;
  113.   p=&a;         
  114.   end;
  115. if code='h1100' then
  116.   do;
  117.   r1=0.2*r;
  118.   p=&a;
  119.   end;
  120. run;

  121. proc sql;
  122. create table temp99 as
  123. ( select sum(r1)as r,p
  124.   from temp9
  125.   where p=&a
  126.   group by p
  127.   );
  128. /*#################################################################################################################*/
  129. /*#                                                                                                              #*/
  130. /*################################################################################################################*/


  131. proc sql;
  132. connect to oracle as conname  (&risk);  

  133. create table jingzhi2 as

  134. select *
  135. from connection to conname   
  136. (
  137. select c.*,b2,nav2,add2

  138. from

  139. (select a.painnercode as p, panamecn, bizdate, nav, addupnav as add1
  140. from pd_real_pa_netval a
  141. left join
  142. pd_pa_definition b
  143. on a.painnercode = b.painnercode
  144. where bizdate = &date_str and a.painnercode ='R000003' ) c
  145. left join     

  146. (select painnercode as p,bizdate as b2, nav as nav2, addupnav as add2
  147. from  pd_real_pa_netval
  148. where bizdate = 2012032 and painnercode ='R000003' ) d  on c.p=d.p
  149. );

  150. disconnect from conname;
  151. quit;


  152. data jingzhi2;
  153. set jingzhi2;
  154. add_r=(add1-add2)/nav2;      * 修正复权净值增长率;
  155. drop b2 nav2 add2;
  156. run;

  157. data pf_all_bench2;      * 业绩基准表;
  158. merge jingzhi2 temp99;
  159. by p;
  160. run;

  161. =============================最后部分

  162. *****航天  140301 ;
  163. %let date_str = '20140301';
  164. proc sql;
  165.   connect to oracle as conname  (&risk);  
  166.   create table jingzhi as select * from connection to conname   
  167. (
  168.       select bizdate, avg(add_nav) as add1 from (
  169. select f16_1090            as seccode,
  170.        ob_object_name_1090 as sec_name,
  171.        OB_OBJECT_NAME_1018 as com_name,            /* wind 取复权净值*/
  172.        F4_1101             as nav,
  173.        F21_1101            as add_nav,                              
  174.        F13_1101            as bizdate
  175.   from TB_OBJECT_1101
  176.   left join TB_OBJECT_1090 on F14_1101 = F2_1090
  177.   left join TB_OBJECT_1099 on F14_1101 = F1_1099
  178.   left join tb_object_1018 on F12_1099 = F34_1018
  179. where f13_1101 between  '20140301'   and  &date_str
  180. and f16_1090 in ('00053')   )
  181. group by bizdate
  182. order by bizdate
  183. );
  184.   disconnect from conname;
  185. quit;

  186. data jingzhi;
  187. set jingzhi;
  188. if _N_=1 then call symput('a',add1);
  189. run;
  190. data jingzhi;
  191. set jingzhi;
  192. add_r=add1/&a-1;
  193. nav=add1;
  194. run;
  195. data jingzhi;
  196. set jingzhi;
  197. proc sort;
  198. by bizdate;
  199. run;
  200. proc sql;
  201.   connect to oracle as conname  (&risk);  
  202.   create table pf_all_bench16  as select * from connection to conname   
  203. (
  204.    select  bizdate,bench,sec_name as panamecn  from zx_wind_bench  where seccode='000535'  and bizdate between  '20140311'   and  &date_str order by bizdate
  205. );
  206.   disconnect from conname;
  207. quit;
  208. data pf_all_bench16;
  209. set pf_all_bench16;
  210. if _N_=1 then call symput('a',bench);
  211. run;
  212. data pf_all_bench16;
  213. set pf_all_bench16;
  214. r=bench/&a-1;
  215. p='R000003';
  216. run;
  217. proc sort;
  218. by bizdate;
  219. run;

  220. data pf_all_bench16;
  221. merge pf_all_bench16 (in=a)  jingzhi(in=b);
  222. by  bizdate;
  223. if a and b;
  224. run;

  225. proc sql;
  226.   create table pf_all_bench17  as select * from
  227. (
  228.    select p,panamecn,bizdate,nav,add1,add_r,r from pf_all_bench16
  229. );

  230. quit;

  231. proc sql;
  232.   delete from  fkdb.pf_all_bench  where  p='R000003' and bizdate= &date_str;
  233.   insert into  fkdb.pf_all_bench  select * from pf_all_bench17 where bizdate= &date_str;
  234. quit;




  235. /*
  236. data pf_all_bench;
  237. set fkdb.pf_all_bench;
  238. *if not missing(bizdate);
  239. run;
  240. data fkdb.pf_all_bench;
  241. set pf_all_bench;
  242. run;

  243. proc sql;
  244.    delete from  fkdb.pf_all_bench  where bizdate = &date_str;
  245.    insert into  fkdb.pf_all_bench  select * from pf_all_bench;
  246. quit;

  247. data pf_all_bench;
  248. set fkdb.pf_all;
  249. if not missing(bizdate);
  250. if not missing(panamecn);
  251. run;
  252. proc sql;
  253. drop table fkdb.pf_all_bench;
  254. quit;
  255. data fkdb.pf_all_bench;
  256. set pf_all_bench;
  257. run;   */
复制代码

使用道具

地板
jeozu 发表于 2014-5-14 13:38:20 |只看作者 |坛友微信交流群
zhangwenteng 发表于 2014-5-14 10:41
这个就是一个简单的数据操作和数据转换,太简单了,实在写不下去了。。。谁给你接着写吧。
一句一句解释人都会疯掉~~~

使用道具

7
jeozu 发表于 2014-5-14 13:38:25 |只看作者 |坛友微信交流群
zhangwenteng 发表于 2014-5-14 10:41
这个就是一个简单的数据操作和数据转换,太简单了,实在写不下去了。。。谁给你接着写吧。
一句一句解释人都会疯掉~~~

使用道具

8
jeozu 发表于 2014-5-14 13:39:11 |只看作者 |坛友微信交流群
zhangwenteng 发表于 2014-5-14 10:41
这个就是一个简单的数据操作和数据转换,太简单了,实在写不下去了。。。谁给你接着写吧。
一句一句解释人都会疯掉~~~

使用道具

9
iittala 发表于 2014-5-14 16:54:51 |只看作者 |坛友微信交流群
zhangwenteng 发表于 2014-5-14 10:41
这个就是一个简单的数据操作和数据转换,太简单了,实在写不下去了。。。谁给你接着写吧。
大神好答!

“生成一个列是p作为组,那两个交易代码的p值R000001的字符,他们可以被认为是R000001组的”请问这句是什么意思啊?你好像字没打全。还有请问为什么要做降权处理呢?

使用道具

10
jeozu 发表于 2014-5-14 17:12:32 |只看作者 |坛友微信交流群
关于R000002的第二部分代码好像有错误。有两个code好像写错了。

使用道具

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

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

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

GMT+8, 2024-4-30 17:58