楼主: 调殇
6296 7

[原创博文] 均线指标累计收益率和累计成功率测试 [推广有奖]

  • 9关注
  • 1粉丝

讲师

2%

还不是VIP/贵宾

-

威望
0
论坛币
155 个
通用积分
2.0000
学术水平
2 点
热心指数
0 点
信用等级
0 点
经验
11367 点
帖子
189
精华
0
在线时间
581 小时
注册时间
2010-4-20
最后登录
2020-11-23

楼主
调殇 发表于 2011-9-24 17:29:05 |AI写论文
30论坛币
收益率=(卖出价格-买入价格)/买入价格
      累计成功率=收益率大于0的次数/(收益率大于0的次数+收益率小于或等于0的次数)
以均线指标为例,要求当5日均线向上穿过10日均线时,即判断为买入信号;当5日均线向下穿过10均线时,即判断为卖出信号,以此进行累计收益率和累计成功率测试。   
    最后,计算出所有股票的累计收益率和累计成功率,并将它们输出到同一个表中。
如何批量导入同一文件夹下的txt文件数据?后面的关于累计收益率和累计成功率的编程应该怎么实现,可以只给思路。(上传了3个txt文件,实际有700多个相同格式的txt数据文件)。麻烦大牛看下,本人新手,学习中~~~

SH600005.TXT
下载链接: https://bbs.pinggu.org/a-967884.html

91.65 KB

SH600004.TXT

90.71 KB

SH600000.TXT

92.46 KB

最佳答案

双修阁主の 查看完整内容

这个问题简单啊,站内信,我跟你说。
关键词:成功率 收益率 计收益 数据文件 批量导入 买入信号 收益率 成功率 文件夹 如何

本帖被以下文库推荐

沙发
双修阁主の 发表于 2011-9-24 17:29:06
这个问题简单啊,站内信,我跟你说。

藤椅
shenliang_111 发表于 2011-9-24 17:55:35
  1. /*批量导入txt*/:
  2. %MACRO GET_PC_FILES_IN_FOLDER(DIRNAME,TYP)     ;/*参数有两个:路径,文件类型后缀*/
  3.    %PUT %STR(----------->DIRNAME=&DIRNAME)        ;
  4.    %PUT %STR(----------->TYP=&TYP)                ;
  5.    DATA WORK.DIRFILES                             ;     
  6.    RC=FILENAME("DIR","&DIRNAME")             ;/*把&DIRNAME值传给文件引用符“DIR"*/   
  7.    OPENFILE=DOPEN("DIR")                     ;/*得到路径标示符OPENFILE,DOPEN是打开directory的sas内置函数*/
  8.    IF OPENFILE>0 THEN DO                     ;/*如果OPENFILE>0表示正确打开路径*/        
  9.      NUMMEM=DNUM(OPENFILE)                  ;/*得到路径标示符OPENFILE中member的个数nummem*/        
  10.      DO II=1 TO NUMMEM                      ;           
  11.         NAME=DREAD(OPENFILE,II)             ;/*用DREAD依次读取每个文件的名字到NAME*/           
  12.         OUTPUT                              ;/*依次输出*/        
  13.      END                                    ;     
  14.    END                                       ;     
  15.    KEEP NAME                                 ;/*只保留NAME列*/
  16. RUN                                            ;
  17. PROC SORT                                      ;/*按照NAME排序*/     
  18.     BY DESCENDING NAME                        ;
  19.     %IF &TYP^=ALL %THEN %DO                        ;/*是否过滤特定的文件类型&TYP*/     
  20.       WHERE  INDEX(UPCASE(NAME),UPCASE(".&TYP"));/*Y,则通过检索NAME是否包含&TYP的方式过滤文件类型*/
  21.     %END                                           ;
  22. RUn;                                            ;
  23. %MEND   GET_PC_FILES_IN_FOLDE;
  24. %GET_PC_FILES_IN_FOLDER(d:\,txt);
  25. /*导入D盘下面所有的TXT文件*/
  26. %macro txt_imp();
  27. proc sql noprint;
  28. select name into :namelist separated by  ' ' from dirfiles;
  29. quit;
  30. %put &namelist;
  31. %let cnt=&sqlobs;
  32. %put &cnt;
  33. %do i=1 %to &cnt;
  34. %let filename=%scan(&namelist,&i,' ');
  35. %let prefix=%scan(&filename,1,'.');
  36. data a_&prefix.;
  37. informat date yymmdd8.;
  38. infile "d:\&filename."  dsd truncover firstobs=3;
  39. input date open high low close volumn;
  40. format date yymmddn8.;
  41. run;
  42. %end;
  43. %mend;
  44. %txt_imp
复制代码

板凳
shenliang_111 发表于 2011-9-24 18:17:41
楼主:收益率的解释不大会...比如连续买进和卖出的情况...怎么求收益率,也就是说,怎么算交易一次...从而算一次收益率

报纸
YueweiLiu 发表于 2011-9-25 15:53:58
批量读取TXT文件,可以使用 unamed pipe 来获取变量名(见代码),然后使用 infile 语句的 filevar= 选项来读取并合并txt文件;或者用宏循环来实现文件的批量读取。
  1. filename indata pipe "dir d:\sas\infile /b/s";

  2. data filename;
  3.         infile indata truncover;
  4.         input name $200. ;
  5. run;
复制代码

地板
调殇 发表于 2011-9-25 20:38:51
shenliang_111 发表于 2011-9-24 18:17
楼主:收益率的解释不大会...比如连续买进和卖出的情况...怎么求收益率,也就是说,怎么算交易一次...从而算 ...
我是通过求5日均线和10日均线:
proc import
  datafile='H:\DayData\SH600000.TXT'
  out=sasuser.sh60000
  dbms=csv
  replace;
  datarow=3;
  label var1='date' var2='open' var3='high' var4='low' var5='close' var6='volume' var7='turnover';
run;

/*计算移动平均的宏*/
%macro ma(x); /*计算x天的移动平均线,例如x=5,就是计算5天的移动平均线*/
ma&x=0;        /*初始变量ma5=0*/
array l&x.ags(&x); /*申明一个数组,数组名字为l5ags*/
l&x.ags(1)=var5;
ma&x=ma&x+l&x.ags(1);
do i&x=2 to &x;
l&x.ags(i&x)=lag(l&x.ags(i&x-1));
ma&x=ma&x+l&x.ags(i&x);
end;
ma&x=ma&x/&x;
drop i&x l&x.ags1-l&x.ags&x; /*将不必要的变量舍去*/
%mend;

data sh6_2;
set sasuser.sh60000;
%ma(5);
%ma(10);
run;

现在有个问题,就是如何把算法编程成代码,算法思路大概这样:
当5日均线值max5(i)>max10(i)且max5(i+1)<max10(i+1)时,判断为卖出;
当5日均线值max5(i)<max10(i)且max5(i+1)>max10(i+1)时,判断为买入;
i 其实就是时间,但具体怎么转化,遇到问题了,目的就是求出两个if语句各自的 i (时间)的各个取值
有道无术,术尚可进;有术无道,止于术也。

7
meishanjia1900 发表于 2011-10-13 20:07:22
难道楼主非得用DATA步和宏么?

PROC IML 更方便,该模块适合编写交易算法。

当然,如果你纯粹想锻炼DATA步及宏的使用技巧,那另当别论。

8
randywang198110 发表于 2011-10-25 16:42:13
按照你这个规则会照成频繁的买卖
data sh6_3;
  set sh6_2;
   ma5a=lag(ma5);
   ma10a=lag(ma10);
   if ma5>ma10 and ma5a<ma10a  then flag=1; /*1表示买入*/
   if ma5<ma10 and ma5a>ma10a  then flag=-1; /*-1表示卖出*/
run;

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-2 12:52