1. 首页
  2. 数据挖掘

【学习】用R和集算器计算连续上涨5天的股票

  目标:通过日交易数据,从多只蓝筹股中选出连续上涨5天的股票。

  思路:导入数据;过滤出上个月的数据;按照股票代码分组;将数据按日期排序;计算出每天比上一天的收盘价的增长额;计算出连续正增长的天数;过滤出正增长天数大于等于5的那些股票。

  原始数据:从财经网站上下载了重点蓝筹股的交易信息,包含29只股票,,存放在Excel中:

【学习】用R和集算器计算连续上涨5天的股票

  集算器解决方案

【学习】用R和集算器计算连续上涨5天的股票

  A1:从Excel中读入数据。这个过程大约用了20-30秒,毕竟有20多万条数据。

  A2:按时间段过滤数据。只需要某个月的交易数据。

  A3:=A2.group(Code),按股票代码分组。这和R语言中的split函数功能类似。点击该单元格可以在右边看到计算结果:

【学习】用R和集算器计算连续上涨5天的股票

  每行是一个分组,点击其中一行,可以看到分组内的数据:

【学习】用R和集算器计算连续上涨5天的股票【学习】用R和集算器计算连续上涨5天的股票

  A4:=A3.(~.sort(Date)),将每只股票的交易数据都按照交易时间排序。因为不能确定下载的数据是否提前排过序了,只有排序后的数据才能进行后续的行间计算。

  A5:=A4.(~.dup@t()),这句是将数据进行结构化(集算器中称为TSeq),以便后面可以动态的增加新列。

  A6:=A5.(~.derive((Close-Close[-1]):INC)),对每只股票运算:”当日收盘价”-“前一日收盘价”。这一列是新加的,起名为”INC”。显然INC大于0表示股价在上升,反之就是股票在下降了。

  A7:=A6.(~.derive(if(INC>0,CID=CID[-1]+1,0):CID))。增加一个新列CID用来记录当天连涨了几天。如果股价上升(INC>0),则将前一日的CID加1,作为当天的CID;反之如果股价下降,则当天的CID归0。

  A8:=A7.select(~.max(CID)>=5)。过滤,如果某只股票最大的连涨天数大于等于5,则它就是需要的优质股票。~代表每个分组,即每只股票,这样避免大部分循环语句的使用。结果如下:

【学习】用R和集算器计算连续上涨5天的股票

  A9:=A8.(~.Code)。取出股票的代码,即每个分组中的Code,结果如下:

【学习】用R和集算器计算连续上涨5天的股票

  R解决方案

01 library(gdata)#use excel function library

02 A1<-read.xls("e:\data\all.xlsx") #import data

03 A2<-subset(A1,as.POSIXlt(Date)>=as.POSIXlt('2012-06-01')& as.POSIXlt(Date)<=as.POSIXlt('2012-06-30')) #filter by date

04 A3<- split(A2,A2$Code) #group by Code

05 A8<-list()

06 for(iin 1:length(A3)){

07 A3[[i]][order(as.numeric(A3[[i]]$Date)),]#sort by Date in each group

08 A3[[i]]$INC<-with(A3[[i]],Close-c(0,Close[- length (Close)])) #add a column, increased price

09 if(nrow(A3[[i]])>0){ #add a column, continuous increased days

10 A3[[i]]$CID[[1]]<-1

11 for(j in 2:nrow(A3[[i]])){

12 if(A3[[i]]$INC[[j]]>0 ){

13 A3[[i]]$CID[[j]]<-A3[[i]]$CID[[j-1]]+1

14 }else{

15 A3[[i]]$CID[[j]]<-0

16 }

17 }

18 }

19 if(max(A3[[i]]$CID)>=5){ #stock max CID is bigger than 5

20 A8[[length(A8)+1]]<-A3[[i]]

21 }

22 }

23 A9<-lapply(A8,function(x)x$Code[[1]]) #finally,stock code

  01:启用Excel支持。要注意的是R对Excel的支持第三方的包l,需要先行下载安装,R对第三方包比较挑剔,找到一个兼容可能的不大容易

  02:导入Excel的数据。可能是找来的Excel解析包不好用,这个过程大约需要8-10分钟,内存占用也比集算器多几百M,好在导入数据后内存就释放了。事实上R本身的运算速度还是比较快的,取数据库中的数据时会很好的体现这一点。

  03,04:按时间过滤,并按Code分组。分组后的数据查看起来不易理解,点击右侧的变量看到的结果是这样的:

【学习】用R和集算器计算连续上涨5天的股票

如果在控制台直接输入命令则相对好一些,如下:

【学习】用R和集算器计算连续上涨5天的股票

  05:A8<-list(),定义一个list类型的变量A8,它将用来存放连涨天数大于等于5的股票。

  06-22:由于R不能像集算器那样方便的用~来操作每个分组,因此这里需要一个大循环,每次循环针对一个股票进行计算。

  07:按日期排序。分组前就排序代码会更简单,但我考虑到最直观的思路是:分组前数据是混在一起的,看不出是否排序;分组后经过观察才发现顺序混乱,不排序则无法进行下一步的行间运算。

  08:增加一个列INC,计算”当日收盘价”-“前一日收盘价”。R不支持行间运算,所以这里巧妙的将收盘价整体下移一行,再和原来的收盘价相减。代码是:Close-c(0,Close[- length (Close)])。

  09-18: 增加一个列CID,计算连涨天数。09行的if(nrow(A3[[i]])>0)是为了避免有些股票没数据(比如暂时停牌),否则后面会报空指针 错误。10行的A3[[i]]$CID[[1]]<-1是为了赋初值和避免后面运算报空指针错误。集算器中不需要做类似的检查,看来它对非专业技术 人员更友好些。11-17:计算连涨天数。代码虽然很多,其实算法同集算器完全一样。

  19-21:过滤,如果某只股票最大的连涨天数大于等于5,则它就是需要的优质股票。代码虽然较多,其实算法和集算器完全一样。结果如下:

【学习】用R和集算器计算连续上涨5天的股票

  23:取出分组中的代码,A9<-lapply(A8,function(x) x$Code[[1]]),如下图:

【学习】用R和集算器计算连续上涨5天的股票【学习】用R和集算器计算连续上涨5天的股票

  一些体会:

  R和集算器凭借自身的能力都可以实现较复杂的股票分析。集算器的代码更简单易懂,避免了大部分的循环语句,数组越界等容易犯错的地方也做了些人性化的处理。基本上,会用基本的Excel公式应该就能用集算器来做股票分析了。

  使用R来完成股票分析需要一定的编程技巧和数学知识,这样才能灵活运行R的各项功能。R还具备优秀的扩展性,比如有针对股票的第三方库函数和统计图;再比如完全可以自己写一个更高效的读取Excel的函数。

PPV课其他精彩文章:


1、回复“干货”查看干货 数据分析师完整知识结构

2、回复“答案”查看大数据Hadoop面试笔试题及答案

3、回复“设计”查看这是我见过最逆天的设计,令人惊叹叫绝

4、回复“可视化”查看数据可视化专题-数据可视化案例与工具

5、回复“禅师”查看当禅师遇到一位理科生,后来禅师疯了!!知识无极限

6、回复“啤酒”查看数据挖掘关联注明案例-啤酒喝尿布

7、回复“栋察”查看大数据栋察——大数据时代的历史机遇连载

8、回复“数据咖”查看数据咖——PPV课数据爱好者俱乐部省分会会长招募

9、回复每日一课查看【每日一课】手机在线视频集锦

PPV课大数据ID: ppvke123 (长按可复制)

大数据人才的摇篮!专注大数据行业人才的培养。每日一课,大数据(EXCEL、SAS、SPSS、Hadoop、CDA)视频课程。大数据资讯,每日分享!数据咖—PPV课数据爱好者俱乐部!

原文始发于微信公众号(PPV课数据科学社区):【学习】用R和集算器计算连续上涨5天的股票

原创文章,作者:ppvke,如若转载,请注明出处:http://www.ppvke.com/archives/23259

联系我们

4000-51-9191

在线咨询:点击这里给我发消息

工作时间:周一至周五,9:30-18:30,节假日休息