前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【学习】用R和集算器计算连续上涨5天的股票

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

作者头像
小莹莹
发布2018-04-23 17:20:49
1.5K0
发布2018-04-23 17:20:49
举报
  目标:通过日交易数据,从多只蓝筹股中选出连续上涨5天的股票。

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

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

  集算器解决方案

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

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

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

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

  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,则它就是需要的优质股票。~代表每个分组,即每只股票,这样避免大部分循环语句的使用。结果如下:

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

  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分组。分组后的数据查看起来不易理解,点击右侧的变量看到的结果是这样的:

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

  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,则它就是需要的优质股票。代码虽然较多,其实算法和集算器完全一样。结果如下:

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

  一些体会:

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2015-04-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PPV课数据科学社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档