思路:导入数据;过滤出上个月的数据;按照股票代码分组;将数据按日期排序;计算出每天比上一天的收盘价的增长额;计算出连续正增长的天数;过滤出正增长天数大于等于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的函数。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有